5

私はCUDAアプリケーション(知っておく必要がある場合はこれ)をOpenCLに変換する作業をしています。元のアプリケーションはCスタイルのCUDAAPIを使用しており、結果を読み取る際の自動ビジーウェイトを回避するために単一のストリームを使用しています。

ここで、OpenCLコマンドキューがCUDAストリームによく似ていることに気付きました。しかし、デバイスの読み取りコマンド、および同様に書き込みコマンドとカーネル実行コマンドでは、イベントのパラメーターにも気づきます。だから私は、デバイスの書き込み、いくつかのカーネル(たとえば、あるカーネルへの1回の呼び出し、次に別のカーネルへの100回の呼び出し)、およびデバイスの読み取りをすべて順番に実行するのに何が必要か疑問に思っています。

  1. それらを同じキューに順番にエンキューした場合、CUDAの場合と同じように順番に実行されますか?
  2. それが機能しない場合は、イベントをデイジーチェーン接続して、各呼び出しの待機リストを前の呼び出しのイベントにすることができますか?
  3. または、依存関係などのN ^ 2検索がある場合のように、以前のすべてのイベントを各呼び出しの待機リストに追加する必要がありますか?
  4. または、 AMDのチュートリアルで述べられているように、呼び出しごとに個別にevent.wait()を実行する必要がありますか?

ありがとう!

4

1 に答える 1

5

これは、コマンドキューの作成方法によって異なります。clCreateCommandQueueには、CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLEを含むことができるプロパティパラメータがあります。これにより、コマンドキューでの非順次実行が可能になります。

そのプロパティが設定されている場合、コマンドは順不同または並行して実行される可能性があり、コマンドを同期する唯一の方法はイベントを使用することです。

そのプロパティが設定されていない場合、コマンドはキュー内で順番に実行されます。

于 2010-08-23T20:41:58.260 に答える