【问题标题】:Time measuring of multiple CUDA kernels多个 CUDA 内核的时间测量
【发布时间】: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 的帮助。

标签: cuda gpu


【解决方案1】:

要对时间和持续时间进行复杂(且准确)的测量,您不应依赖 CUDA 事件,而应使用 nVIDIA 的分析机制及其分析器应用程序 nvprof,或使用可视分析器应用程序 nvvp。

阅读 Parallel4All 博客上的这篇文章:

CUDA Pro Tip: nvprof is Your Handy Universal GPU Profiler

基本上,您启动可视化配置文件、加载可执行文件、设置命令行参数并生成可以浏览的图形时间线;它看起来像这样:

或者您在启用 nvprof 的情况下运行您的可执行文件(不使用可视化分析器),它会生成所有内核执行时间、CUDA API 调用等的 csv/xml 列表,和/或分析结果文件然后可以在可视化分析器中打开。

【讨论】:

  • “您不应依赖 CUDA 事件,而应使用 nVIDIA 的分析机制”,这取决于您是在为开发和性能测试进行测量,还是在运行时通知用户。 OP没有指定他的目标
猜你喜欢
  • 2012-05-22
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
相关资源
最近更新 更多