2017-12-01 18 views
0

この質問は、CUDAストリーム(ストリーム)の概念と、ストリームに記録されたCUDAイベント(イベント)による見かけの異常に関するものです。CUDAストリーム内でのCUDAイベントの非同期動作

ストリーム上のすべての作業がシーケンシャルであるので、以下の一連のイベントは、

  1. eventStartが」に記録されているが起こったはず

    cudaEventRecord(eventStart, stream1) 
    kernel1<<<..., stream1>>>(...) 
    cudaEventRecord(eventBetween, stream1) 
    kernel2<<<..., stream1>>>(...) 
    cudaEventRecord(eventEnd, stream1) 
    

    、このanamolyを証明する次のコードを考えてみましょう完了してください

  2. kernel1実行して完了します
  3. "eventBetween"が記録されています完了
  4. kernel2実行され、完了が
  5. eventEnd」はデバイスとホスト・スレッドを同期した後

を完了したと記録されている、(cudaEventElapsedTimeによって測定される)eventStarteventBetween間の時間がランであるべきです時間がkernel1であり、eventBetweeneventEndの間の時間は、実行時間がkernel2である必要があります。

しかしcudaStreamWaitEventNVIDIA's documentationによると、

は、イベントが実行を開始する前に 完了を報告するまで待つストリーミングするために提出されたすべての今後の作業を行います。

イベントだすべての作業の前に完了したことを報告する必要はありませんあなたはまたcudaStreamWaitEvent(イベント)を使用して 特定のイベントに単一のストリーム内の操作を同期させることができ

blogpost

イベントを同じストリームに記録した後にスケジュールされます。これは、ストリームでスケジュールされたすべての作業が順次実行されるため、驚くべきことです。

誰かがストリーム内のイベントのこの非同期動作を明確にすることはできますか?

答えて

1

混乱の原因は、ホストストリームの同期とストリームストリームの同期が競合しているように見えます。要するに

  1. ストリームはFIFOであり、ストリーム内のすべての操作は、互いに対して同期しています。
  2. あなたが参照しているドキュメントは、プログラマが異なるストリームのイベント間を同期させたいユースケースを記述しています。
  3. あなたが参照しているブログ投稿では、呼び出し元のホストスレッドとストリームにエンキューされたイベントとの同期について説明しています。使用可能なホストデバイスの細分性には、デバイス全体、ストリーム全体、またはストリーム内のイベントの3つのレベルがあります。ブログでは、後者について説明しています。

あなたが引用した情報源の間に矛盾はありません。

関連する問題