clEnqueueWriteBuffer()
GPU デバイスで実行されているカーネルによって現在書き込まれているバッファーで呼び出すことはできますか? データの競合を気にせず、自分が何をしているのかを知っているとしましょう。OpenCL の実装はこれを許可しますか?
3 に答える
コマンドキューが「outoforderexec」フラグで作成されていない場合、エンキューされたすべてのコマンドが順番に(単一のコマンドキューで)実行されます。その場合、書き込みバッファとカーネルは同時に実行されません。他のシナリオでは、コマンドが同時に実行される可能性があり、動作は未定義になります。
実装のテストを実行する価値はありますが、AMD と NVIDIA の両方で OpenCL を使用して作業したことを思い出すと、out-of-order フラグを指定しても、キューは順番どおりになります。
コマンドが順不同で実行されたとしても、デバイスによって行われるキャッシュでは、カーネルでその変更を確認できない場合があります。グローバル メモリ、およびその後の残りのメモリについて、OpenCL 仕様は次のように述べています。
グローバルメモリ。 このメモリ領域は、すべてのワークグループのすべてのワークアイテムへの読み取り/書き込みアクセスを許可します。作業項目は、メモリ オブジェクトの任意の要素に対して読み取りまたは書き込みを行うことができます。デバイスの機能によっては、グローバル メモリへの読み取りと書き込みがキャッシュされる場合があります。
そのため、デバイス メモリに書き込むことができたとしても、カーネルがそれらの変更を読み取ることができる可能性はほとんどありません。あなたの場合、書き込み、書き込みバッファが発生する前にカーネル書き込みがコミットされると想定しますが、OpenCL 仕様はこの点で意図的に曖昧であるようです (おそらく APU タイプのデータ アクセスを許可するため)。
本当にこれを試してみたい場合は、2 つの異なるコマンド キューが必要になります。これが、重複した DMA と計算を取得する方法です。カーネルと転送の両方によって書き込まれた領域は一貫性のない結果になるため、お勧めしません。