2012-01-21 7 views
3

次のコードを使用して、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); 

答えて

2

立方(DA)EventRecord()GPUは、コマンドを処理するときにタイムスタンプを書くためにGPUを伝えGPUにコマンドを送信するよりも、より多くの何もしません。タイムスタンプは、オンボードの高解像度カウンタです。したがって、CUDAイベントは、特定のカーネルの実行時間など、GPUイベントのタイミングをとるための非同期メカニズムとして使用すると最も便利です。 CUDAのメモリ管理はほとんどがCPU上で行われるため、CUDAイベントはCUDAの割り当てやフリー・オペレーションのタイミングには理想的ではありません。

要するに、gettimeofday()のようなCPUベースのタイミングを使うほうがよいです。

+0

しかし、それは時間がcudaMallocですか?別の言い方をすれば、カーネルの実行時間だけが必要なときは、cudaMalloc、cudaMemcpy、またはcudaFreeのようなものが、最初のcudaEventRecordと2番目のcudaEventRecordの間で呼び出されないようにする必要がありますか? – user2023370

+0

非同期CUDA memcpyはフェア・ゲームですが、cudaMalloc()/ cudaFree()は、ドライバがページ・テーブルを混乱させている間にGPUを停止させる可能性があります。 CUDAのイベントは、答えに記述されているように楽しいタイミングを記録しますが、そのタイミング情報はそれほど有用ではありません。 – ArchaeaSoftware

関連する問題