既にご覧になったように、ホストからデバイスへの転送は などを使用してclEnqueueWriteBuffer
行います。
キーワード 'enqueue' を含むすべてのコマンドには、特別なプロパティがあります。コマンドは直接実行されませんが、 、 、 、ブロッキング モードでの使用などを使用してトリガーすると実行clFinish
さclFlush
れますclEnqueueWaitForEvents
。clEnqueueWriteBuffer
これは、すべてのアクションが一度に発生し、イベント オブジェクトを使用して同期する必要があることを意味します。すべてが一度に発生する可能性があるため、次のようなことができます (各ポイントは同時に発生します)。
- 転送データA
- プロセスデータA & 転送データB
- データ B を処理 & データ C を転送 & データ A' を取得
- データ C を処理 & データ B' を取得
- データ取得 C'
覚えておいてください: Event-Object なしでタスクをキューに入れると、キューに入れられたすべての要素が同時に実行される可能性があります!
プロセス データ B が転送 B の前に発生しないようにするには、イベント オブジェクトを取得し、clEnqueueWriteBuffer
それを待機するオブジェクトとして提供する必要があります。clEnqueueNDRangeKernel
cl_event evt;
clEnqueueWriteBuffer(... , bufferB , ... , ... , ... , bufferBdata , NULL , NULL , &evt);
clEnqueueNDRangeKernel(... , kernelB , ... , ... , ... , ... , 1 , &evt, NULL);
もちろん、NULL を指定する代わりに、各コマンドは特定のオブジェクトを待機し、新しいイベント オブジェクトを生成できます。最後の次のパラメーターは配列なので、複数のイベントをイベント待機できます。
編集: 以下のコメントを要約するには
データの転送- どのコマンドがどこで機能しますか?
CPU GPU
BufA BufB
配列[] = {...}
clCreateBuffer() -----> [ ] //GPU メモリに (空の) バッファを作成 *
clCreateBuffer() -----> [ ] [ ] //GPU メモリに (空の) バッファを作成 *
clWriteBuffer() -arr-> [ array ] [ ] //CPU から GPU にコピー
clCopyBuffer() [配列] -> [配列] //GPU から GPU にコピー
clReadBuffer() <-arr- [array] [array] //GPU から CPU にコピー
* パラメータを使用してデータを提供することにより、バッファを直接初期化host_ptr
できます。