1

マルチ GPU 並列アルゴリズムを作成しています。私が直面している問題の 1 つは、1 つの cl_mem を複数のデバイスにプッシュし、同じカーネルを同時に実行させるとどうなるかを調べることです。カーネルは、デバイスに渡されるメモリを変更します。

OpenCL コードのコーディングとデバッグには非常に時間がかかります。だから私はそれを始める前に仲間のStackoverflowユーザーからいくつかのアドバイスを受けたい - 私は以下の両方のシナリオでそのようなことをした結果を知りたい.使用されているのは、この cl_mem が指すメモリの同じ領域であり、デバイスに適切にコピーされますか? など):

  1. メモリは CL_MEM_COPY_HOST_PTR で作成されます
  2. メモリは CL_MEM_USE_HOST_PTR で作成されます
4

2 に答える 2

3

デバイス間でデータが同期されることを保証する明示的な OpenCL 仕様は見当たりません。OpenCL の実装が、複数のデバイスにバッファーを分散する方法と、それらのバッファーを後で再び集約する方法をどのように認識するかがわかりません。

私が採用したアプローチは、デバイスごとに個別のコンテキスト、読み取り、書き込み、およびカーネル実行キューを作成することです。次に、各デバイスに個別のバッファーを作成し、書き込み/読み取りをキューに入れて、デバイスとの間でデータを移動します。したがって、私はそのすべてを自分で明示的に処理します。

より良い解決策が欲しいのですが、少なくとも上記の方法は機能し、実装固有のものに依存していません。

于 2012-09-24T15:33:13.460 に答える
2

OpenCL 仕様の付録 Aでは、異なるコマンド キュー間で共有されるオブジェクトに必要な同期について説明しています。

基本的に、OpenCL イベントを使用clFlushし、コマンド キュー間で実行を同期する必要があると書かれています。OpenCL 実装は、OpenCL コンテキストの異なるデバイス間でメモリ オブジェクトの内容を同期します。USE/COPY _HOST_PTR は違いはありませんが、USE_HOST_PTR はホスト メモリ内のデータの余分なコピーをいくつか回避します。clEnqueueMapBuffer最後にホストとビットを同期するために使用します。

于 2012-09-24T17:00:24.330 に答える