3

GPUとCPUの間で作業負荷を共有する方法または可能かどうかを理解するのに少し問題があります。大きなログファイルがあり、各行を読み取ってから約500万回の操作を実行する必要があります(さまざまなシナリオのテスト)。私の現在のアプローチは、数百行を読み取り、それを配列に追加してから、各GPUに送信することでした。これは正常に機能していますが、1行あたりの作業量が多く、行数が多いため、時間がかかります。これが行われている間、私のCPUコアは基本的に何もしていないことに気づきました。私はEC2を使用しているので、2つのクアッドコアXeonと2つのTesla GPUがあり、1つのCPUコアがファイルを読み取り(メインプログラムを実行)、GPUが機能するので、どのように、または何ができるのか疑問に思っています。プロセスに他の7つのコア?

GPU / CPU間でタスクのバランスをとるプログラムを設計する方法に少し混乱しています。どちらも異なる時間にジョブを終了するため、すべてを同時に送信することはできませんでした。キューを設定することを考えました(cは初めてなので、まだ可能かどうかはわかりません)が、GPUジョブがいつ完了したかを知る方法はありますか(Cudaへのジョブの送信は非同期だと思っていたため)?私のカーネルは通常のc関数​​に非常に似ているので、CPU使用率に変換することは問題ではなく、作業のバランスを取ることが問題のようです。もう一度「Cudabyexample」を試しましたが、このタイプのバランシングについて言及しているものは実際には見つかりませんでした。

どんな提案も素晴らしいでしょう。

4

2 に答える 2

4

鍵となるのは、マルチスレッド アプリを作成し、そのためのすべての一般的な方法に従って、2 種類のワーカー スレッドを用意することだと思います。1 つは GPU で動作し、もう 1 つは CPU で動作します。したがって、基本的には、スレッド プールとキューが必要になります。

http://en.wikipedia.org/wiki/Thread_pool_pattern

キューは非常に単純です。ログ ファイルの現在の行のインデックスである共有整数を 1 つ持つことができます。スレッドは、より多くの作業を取得する準備ができると、そのインデックスをロックし、インデックスで指定された行から開始してログ ファイルからいくつかの行を取得し、取得した行数だけインデックスを増やしてから、ロックを解除します。 .

ワーカー スレッドがログ ファイルの 1 つのチャンクの処理を完了すると、その結果をメイン スレッドにポストし、別のチャンクを取得します (処理する行がなくなった場合は終了します)。

アプリは GPU と CPU ワーカー スレッドのいくつかの組み合わせを起動して、利用可能なすべての GPU と CPU コアを利用します。

発生する可能性のある問題の 1 つは、CPU がビジー状態の場合、新しい作業の送信または GPU からの結果の処理にわずかな遅延が発生するため、GPU のパフォーマンスが低下する可能性があることです。スレッドの数とそのアフィニティーを試す必要がある場合があります。たとえば、スレッド アフィニティを操作して、GPU ごとに 1 つの CPU コアを予約する必要がある場合があります。

于 2012-06-02T17:25:42.010 に答える
1

行ごとに言うかもしれないので、ジョブを2つの異なるプロセスに分割できます-1つのCPU + GPUプロセス残りの7コアを使用した1つのCPUプロセス

異なるオフセットで各プロセスを開始できます。たとえば、最初のプロセスが 1 ~ 50、101 ~ 150 などの行を読み取り、2 番目のプロセスが 51 ~ 100、151 ~ 200 などを読み取ります。

これにより、CPU と GPU の相互作用を最適化するという頭痛の種を回避できます。

于 2012-06-03T13:04:11.600 に答える