CUDA でのカーネルの起動は一般に非同期です。これは、(私が理解しているように) CUDA カーネルが起動されるとすぐに制御が CPU に戻ることを意味します。cudaThreadsynchronize()
またはを使用して CPU を強制的に停止させない限り、GPU が数値計算でビジー状態の間、CPU はいくつかの有用な作業を続けcudaMemcpy()
ます。
CUDA 用のThrustライブラリを使い始めたところです。Thrust の関数呼び出しは同期ですか、それとも非同期ですか?
言い換えれば、thrust::sort(D.begin(),D.end());
D がデバイス ベクトルである場合、次を使用して並べ替え時間を測定することは理にかなっていますか?
start = clock();//Start
thrust::sort(D.begin(),D.end());
diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
std::cout << "\nDevice Time taken is: " <<diff<<std::endl;
関数呼び出しが非同期の場合、どのベクトルでも diff は 0 秒になりますが (これはタイミングのジャンクです)、同期の場合は実際にリアルタイムのパフォーマンスが得られます。