この質問は、CUDAストリーム(ストリーム)の概念と、ストリームに記録されたCUDAイベント(イベント)による見かけの異常に関するものです。CUDAストリーム内でのCUDAイベントの非同期動作
ストリーム上のすべての作業がシーケンシャルであるので、以下の一連のイベントは、
- 「
eventStart
が」に記録されているが起こったはずcudaEventRecord(eventStart, stream1) kernel1<<<..., stream1>>>(...) cudaEventRecord(eventBetween, stream1) kernel2<<<..., stream1>>>(...) cudaEventRecord(eventEnd, stream1)
、このanamolyを証明する次のコードを考えてみましょう完了してください
kernel1
実行して完了します- "
eventBetween
"が記録されています完了 kernel2
実行され、完了が- 「
eventEnd
」はデバイスとホスト・スレッドを同期した後
を完了したと記録されている、(cudaEventElapsedTime
によって測定される)eventStart
とeventBetween
間の時間がランであるべきです時間がkernel1
であり、eventBetween
とeventEnd
の間の時間は、実行時間がkernel2
である必要があります。
しかしcudaStreamWaitEvent
上NVIDIA's documentationによると、
は、イベントが実行を開始する前に 完了を報告するまで待つストリーミングするために提出されたすべての今後の作業を行います。
イベントだすべての作業の前に完了したことを報告する必要はありませんあなたはまたcudaStreamWaitEvent(イベント)を使用して 特定のイベントに単一のストリーム内の操作を同期させることができ
とblogpost、
イベントを同じストリームに記録した後にスケジュールされます。これは、ストリームでスケジュールされたすべての作業が順次実行されるため、驚くべきことです。
誰かがストリーム内のイベントのこの非同期動作を明確にすることはできますか?