如何衡量多个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);
我得到的第一个结果是正确的。但对于第二个内核,时间显示为零。
答案 0 :(得分:1)
要对时间和持续时间进行复杂(和准确)的测量,您不应该依赖CUDA事件,而是使用nVIDIA的分析机制,它的分析器应用程序nvprof,或者使用visual profiler应用程序nvvp。 / p>
阅读Parallel4All博客上的这篇文章:
CUDA Pro Tip: nvprof is Your Handy Universal GPU Profiler
基本上,您启动可视化配置文件,加载可执行文件,设置命令行参数并生成可以浏览的图形时间轴;它看起来像这样:
或者在启用nvprof的情况下运行可执行文件(不使用可视化分析器),它将生成所有内核执行时间的csv / xml列表,CUDA API调用等,和/或分析结果文件。然后可以在视觉分析器中打开。