プログラムを評価すると、ある時点で最大 100 ミリ秒のタイム ラプスが発生することがわかりました。すべての操作を検索しましたが、個人的には今回の操作はありませんでした。次に、cudaThreadSynchronize 呼び出しをどこに配置しても、最初の呼び出しに 100 ミリ秒かかることに気付きました。次に、そのような例を以下に書きました。最初の行で cudaThreadSynchronize を呼び出すと、最後の経過時間の値が 1 ミリ秒未満であることがわかります。ただし、呼び出されない場合は、平均で 110 ミリ秒かかります。
int main(int argc, char **argv)
{
cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..
unsigned int timer;
cutCreateTimer(&timer);
cutStartTimer(timer);
float *data;
CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));
cutStopTimer(timer);
printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));
cutDeleteTimer(timer);
return EXIT_SUCCESS;
}
最初の cudaThreadSynchronize() が CUDA ライブラリの初期化を処理していると思います。カーネルを完全に初期化するのは正しい方法なので、他の操作の時間評価には影響しませんか? 最初に cudaThreadSynchronize を呼び出すだけで十分ですか、それとも正しい方法がありますか..