了解CUDA分析器输出(nvprof)

时间:2015-05-21 10:24:21

标签: cuda memcpy nvprof

我只是查看以下输出并尝试围绕这些数字:

==2906== Profiling result:
Time(%)      Time     Calls       Avg       Min       Max  Name
 23.04%  10.9573s     16436  666.67us  64.996us  1.5927ms  sgemm_sm35_ldg_tn_32x16x64x8x16
 22.28%  10.5968s     14088  752.18us  612.13us  1.6235ms  sgemm_sm_heavy_nt_ldg
 18.09%  8.60573s     14088  610.86us  513.05us  1.2504ms  sgemm_sm35_ldg_nn_128x8x128x16x16
 16.48%  7.84050s     68092  115.15us  1.8240us  503.00us  void axpy_kernel_val<float, int=0>(cublasAxpyParamsVal<float>)
...
  0.25%  117.53ms      4744  24.773us     896ns  11.803ms  [CUDA memcpy HtoD]
  0.23%  107.32ms     37582  2.8550us  1.8880us  8.9556ms  [CUDA memcpy DtoH]

...

==2906== API calls:
Time(%)      Time     Calls       Avg       Min       Max  Name
 83.47%  41.8256s     42326  988.18us  16.923us  13.332ms  cudaMemcpy
  9.27%  4.64747s    326372  14.239us  10.846us  11.601ms  cudaLaunch
  1.49%  745.12ms   1502720     495ns     379ns  1.7092ms  cudaSetupArgument
  1.37%  688.09ms      4702  146.34us     879ns  615.09ms  cudaFree
...

在优化内存访问时,在比较不同的实现时,我真正需要注意哪些数字?它首先看起来memcpy只需要117.53+107.32ms(在两个方向上),但之后会有这个API调用cudaMemcpy41.8256s,这是更多。此外,min / avg / max列不会在上输出块和下输出块之间相加。

为什么会出现差异,&#34; true&#34;对我来说优化内存传输很重要的数字?

编辑:第二个问题是:有没有办法找出谁在调用,例如axpy_kernel_val(以及多少次)?

1 个答案:

答案 0 :(得分:3)

总时间的差异是由于工作以异步方式启动到GPU。如果你有一个长时间运行的内核或一组内核没有与主机明确同步,并通过调用cudaMemcpy来跟随它们,那么cudaMemcpy调用将在内核之前启动完成执行。 API调用的总时间是从它启动的那一刻到它完成的那一刻,因此将与执行内核重叠。如果您通过NVIDIA Visual Profiler(nvprof -o xxx ./myApp运行输出,然后将xxx导入nvvp),您可以非常清楚地看到这一点。

min time 的差异是由于启动开销造成的。虽然API分析考虑了所有的启动开销,但内核时序只包含其中的一小部分。正如你在这里看到的那样,启动开销可以达到10-20us。

通常,API调用部分可以让您知道CPU正在做什么,而分析结果会告诉您GPU正在做什么。在这种情况下,我认为你没有使用CPU,可以说cudaMemcpy发布得太早,CPU周期被浪费了。然而,在实践中,通常很难或不可能从这些备用周期中获得任何有用的东西。