2017-10-07 6 views
1

OpenCLベストプラクティスガイド(https://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/cuda-doc/OpenCL_Best_Practices_Guide.pdf)は、コマンドが正しい順序で行われるようにするために、3.1.3項に示唆しています。処理は、データ転送の前に発生しません:オーバーラッピング転送と実行:正しい順序でコマンドが実行されていることを確認してください。

  1. はqueue0とQUEUE1
  2. ためQUEUE1
  3. clFlushのためにデータを転送し、queue0
  4. 実行queue0ためのカーネル用queue0
  5. clFlushのためにデータを転送します
  6. queue1のカーネルを実行し、queue0のデータを取得する
  7. clFlush両方について
  8. queue1のデータを取得する

ここに返信するhttps://stackoverflow.com/a/12389713/4634819は、同じようにイベントを使用することを提案しています。

私の質問は:この場合、clFlushとイベントは同じ目的(同時実行を避ける)になりますか?それらのうちのどれを使用するかは重要ですか?

答えて

4

clFlushは、エンキュー機能がデータ転送またはカーネルの実行をエンキューすることを保証しますが、呼び出した機能が確実に終了することはありません。

1 - データ転送に対する非ブロッキング呼び出しを使用する場合は、イベントを使用してすべての転送を完了してから実行を開始する必要がありますあなたのカーネルとホストに戻ってコピーしているときは、読み込みイベントが完了するのを待つ必要があります。

2 - 両方のキューで実行しているカーネル間に依存関係がある場合は、イベントを使用して正しい方法でカーネルを並べ替える必要があります。

あなたの質問は、カーネルの実行の間にどのような依存関係があり、データを転送するために非ブロック呼び出しを使用しているかによって異なります。依存関係がなく、データ転送のためにブロッキング呼び出しを使用している場合、clFlushはそのジョブを行います。それ以外の場合は、イベントが必要です。

+0

ありがとうございました!すべては今はっきりしています:) – vgeclair

関連する問題