【发布时间】:2017-10-23 21:25:00
【问题描述】:
如何测量多个 CUDA 内核的特定时间?我试过这种方法。
cudaEvent_t tic1, tic2, tic3, tic4;
float time1, time2;
cudaEventCreate(&tic1);
cudaEventCreate(&tic2);
cudaEventCreate(&tic3);
cudaEventCreate(&tic4);
// launching the 1st kernel to execute on GPU
cudaEventRecord(tic1, 0);
kernel1<<<>>>(d_A, d_y, k, d_flag);
checkCuda( cudaPeekAtLastError() );
checkCuda(cudaDeviceSynchronize());
// calculating elapsed time on 2nd kernel
cudaEventRecord(tic2, 0);
cudaEventElapsedTime(&time1, tic1, tic2);
cudaEventSynchronize(tic2);
// launching the 2nd kernel to execute on GPU
cudaEventRecord(tic3, 0);
kernel2<<<>>>(d_A_sys, d_y_sys, k, d_flag);
checkCuda( cudaPeekAtLastError() );
checkCuda(cudaDeviceSynchronize());
// calculating elapsed time on 2nd kernel
cudaEventRecord(tic4, 0);
cudaEventElapsedTime(&time2, tic3, tic4);
cudaEventSynchronize(tic4);
我得到的第一个结果是正确的。但是对于第二个内核,时间显示为零。
【问题讨论】:
-
只需使用 Nvidia 的 Visual Profiler。它易于使用,有很多选项,您可以保存结果以备将来使用。
-
将每次调用放在
cudaEventSynchronize()之前调用cudaEventElapsedTime()。 -
感谢@Robert Crovella。现在它起作用了。我在安装在远程服务器上的 Tesla K80 上使用 CUDA 7.0 工具包。我一直想用 Visual Profiler 但不知道怎么用。如果有人可以帮助我。
-
感谢@Zindarod 的帮助。