1

タスク レベルで大量のデータを処理する OpenCL プログラムを作成します (これ以上の並列処理はできませんが、データ量は十分に多いです)。データ自体はファイルから読み取られ、結果は別のファイルに書き込まれる必要があります。 . ここで、1 つのスレッドがファイルを読み取ってデータをカーネルにプッシュし、別のスレッドが完成したデータを取得してファイルに書き込むのが最善 (最速) であると考えました。したがって、実際には ReadData->CopyToDevice->ExecuteKernel->CopyToHost->WriteData のようなものが必要になります

例はありますか、これを最善に行う方法はありますか? 10 個程度の配列 (キュー、InputMemory、OutputMemory、Events) から始めます。最初のスレッド: データを読み取り、次のイベント エントリが null になるのを待ち、この配列に入力し、次の
2 番目のスレッド: event!=null->waitforevent、データを書き込み、イベントを null に設定 または、チェックする代わりに 10 セマフォを使用するヌル

4

2 に答える 2

1

また、アップロード、処理、ダウンロードに別々のOpenCLコマンドキューを使用し、clEventsを使用してそれらの間に依存関係を作成します。これにより、GPUがサポートするときに、ハードウェアがこれらの操作をオーバーラップできるようになります

于 2012-12-28T01:05:34.497 に答える
0

私は画像処理について同様のことをしていますが、何かをすることを考える前に、ボトルネックがどこにあるかを確認するために実際にプロファイルを作成する必要があります。カーネルがどれほど計算集約的かはわかりませんが、I/Oを過小評価してはいけません。

まず第一に:はい、合計3つのスレッドを使用することは、I/Oレイテンシーを隠すためにおそらく良い考えです。しかし、10個のコマンドキューは多すぎます。GPUごとに1つで十分です。さらに、GPUが1つしかない場合、1つしか処理できない場合は、10個の異なるバッファーをフィードするのは無意味です。したがって、ダブルバッファ戦略を使用し、読み取りと書き込みをブロックすることをお勧めします。

于 2012-12-27T11:17:22.870 に答える