web-dev-qa-db-ja.com

cudaStreamSynchronize vs CudaDeviceSynchronize vs cudaThreadSynchronize

これらの3つの機能、特に最後の2つの機能の違いは何ですか?ライブラリマニュアルには

この関数の名前はその動作を反映していないため、この関数は非推奨であることに注意してください。その機能は、非推奨ではない関数cudaDeviceSynchronize()に似ており、代わりに使用する必要があります。

しかし、それが何を意味するのかよくわかりません。

25
Hailiang Zhang

これらはすべて障壁です。バリアは、何らかの条件が満たされるまで、バリアを超えたコードの実行を防ぎます。

  1. cudaDeviceSynchronize() GPUが以前に要求されたすべてのcudaタスク(カーネル、データコピーなど)の処理を完了するまで、CPU /ホストスレッド(cudaDeviceSynchronizeが発行されたスレッド)での実行を停止します。
  2. cudaThreadSynchronize() ご存知のとおり、これはcudaDeviceSynchronizeの非推奨バージョンです。非推奨とは、現時点ではまだ機能していることを意味しますが、使用しないことをお勧めします(代わりに、cudaDeviceSynchronizeを使用してください)。将来、サポートされなくなる可能性があります。ただし、cudaThreadSynchronize()とcudaDeviceSynchronize()は基本的に同じです。
  3. cudaStreamSynchronize() は上記の2つの関数に似ていますが、GPUが以前に要求されたすべてのcudaタスクの処理を完了するまで、CPUホストスレッドでのそれ以上の実行を防ぎます。参照されるストリームで発行されます。したがって、cudaStreamSynchronize()はストリームIDを唯一のパラメータとして取ります。他のストリームで発行されたcudaタスクは、CPUコードの実行がこの障壁を超えて継続すると、完了する場合と完了しない場合があります。
44
Robert Crovella