CUDA を使用して GPU に次の種類のパイプラインを実装しようとしています。
Host2Device コピー、カーネル呼び出し、Device2Host コピーのそれぞれに 4 つのストリームがあります。ただし、カーネル呼び出しは、次のストリームの Host2Device コピーが完了するまで待機する必要があります。
cudaStreamWaitEvent
同期に使用するつもりでした。ただし、ドキュメントによると、これcudaEventRecord
は、対応するイベントに対して以前に呼び出された場合にのみ機能します。そして、これはこのシナリオには当てはまりません。
ストリームは、基本的に次のように見える個別の CPU スレッドによって管理されます。
Do some work ...
cudaMemcpyAsync H2D
cudaEventRecord (event_copy_complete[current_stream])
cudaStreamWaitEvent (event_copy_complete[next_stream])
call kernel on current stream
cudaMemcpyAsync D2H
Do some work ...
CPU スレッドは、正しい順序でストリームを開始するように管理されます。したがって、cudaStreamWaitEvent
ストリーム 1 のコピー完了イベントは、そのイベント (ストリーム 1) の前に (ストリーム 0 で) 呼び出されますcudaEventRecord
。これにより、機能的なノーオペレーションが発生します。
イベントはこのままでは使えない気がします。目的の同期を実現する別の方法はありますか?
ところで、依存関係がいくつかあるため、ストリームの順序を逆にすることはできません。
API 呼び出し順序
リクエストに応じて、CUDA 呼び出しが発行される順序は次のとおりです。
//all on stream 0
cpy H2D
cudaEventRecord (event_copy_complete[0])
cudaStreamWaitEvent (event_copy_complete[1])
K<<< >>>
cpy D2H
//all on stream 1
cpy H2D
cudaEventRecord (event_copy_complete[1])
cudaStreamWaitEvent (event_copy_complete[2])
K<<< >>>
cpy D2H
//all on stream 2
cpy H2D
cudaEventRecord (event_copy_complete[2])
cudaStreamWaitEvent (event_copy_complete[3])
K<<< >>>
cpy D2H
...
ご覧のとおり、 への呼び出しcudaStreamWaitEvent
は常に への呼び出しよりも先に行われcudaEventRecord
ます。