次のコードを使用して、cudaMalloc()
への呼び出しを行っています。私は不思議です:CUDAのイベントは、私たちのカーネルの時間を計るだけでなく、 "組み込みのカーネル"の時間も計ります。言い換えれば、cudaMalloc()
を有効にする以下の方法は有効ですか?CUDAイベントは、cudaMallocとcudaMemcpyを実行しますか?
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
for(int t =0 ; t < 100 ; t++){
float* test;
cudaMalloc((void**)&test, 3000000 * sizeof(float));
cudaFree(test);
}
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime , start, stop);
printf("time elapsed on the GPU: %f ms", elapsedTime/100);
しかし、それは時間がcudaMallocですか?別の言い方をすれば、カーネルの実行時間だけが必要なときは、cudaMalloc、cudaMemcpy、またはcudaFreeのようなものが、最初のcudaEventRecordと2番目のcudaEventRecordの間で呼び出されないようにする必要がありますか? – user2023370
非同期CUDA memcpyはフェア・ゲームですが、cudaMalloc()/ cudaFree()は、ドライバがページ・テーブルを混乱させている間にGPUを停止させる可能性があります。 CUDAのイベントは、答えに記述されているように楽しいタイミングを記録しますが、そのタイミング情報はそれほど有用ではありません。 – ArchaeaSoftware