私のコード(マルチGPU、同じGPU上の同時カーネル、カーネルの順次実行などを含む)の異なる部分(cudaMemcpyHtoD、カーネル実行、cudaMemcpyDtoH) al)。私が理解しているように、これらの関数はイベント間の経過時間を記録しますが、コードの寿命に沿ってイベントを挿入すると、オーバーヘッドや不正確な結果になることがあります。私はこれらの機能を改善するための批判や一般的なアドバイスを聞きたいと思います。イベントを使用したCUDAアプリケーションのタイミングタイミング
//Create event and start recording
cudaEvent_t *start_event(int device, cudaEvent_t *events, cudaStream_t streamid=0)
{
cutilSafeCall(cudaSetDevice(device));
cutilSafeCall(cudaEventCreate(&events[0]));
cutilSafeCall(cudaEventCreate(&events[1]));
cudaEventRecord(events[0], streamid);
return events;
}
//Return elapsed time and destroy events
float end_event(int device, cudaEvent_t *events, cudaStream_t streamid=0)
{
float elapsed = 0.0;
cutilSafeCall(cudaSetDevice(device));
cutilSafeCall(cudaEventRecord(events[1], streamid));
cutilSafeCall(cudaEventSynchronize(events[1]));
cutilSafeCall(cudaEventElapsedTime(&elapsed, events[0], events[1]));
cutilSafeCall(cudaEventDestroy(events[0]));
cutilSafeCall(cudaEventDestroy(events[1]));
return elapsed;
}
使用方法:これは、生産コードのためであれば
cudaEvent_t *events;
cudaEvent_t event[2]; //0 for start and 1 for end
...
events = start_event(cuda_device, event, 0);
<Code to time>
printf("Time taken for the above code... - %f secs\n\n", (end_event(cuda_device, events, 0)/1000));