了解CUDA探查器输出(nvprof)

了解CUDA探查器输出(nvprof),cuda,memcpy,nvprof,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

我只是看了一下下面的输出,并试图将我的头脑集中在这些数字上:

==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
...
==2906==分析结果:
时间(%)时间调用平均最小最大名称
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\U sm\U重型柴油发电机
18.09%8.60573S14088610.86us 513.05us 1.2504ms sgemm_sm35_ldg_nn_128x8x128x16x16
16.48%7.84050s 68092 115.15us 1.8240us 503.00us无效axpy_kernel_val(cublasAxpyParamsVal)
...
0.25%117.53ms 4744 24.773us 896ns 11.803ms【CUDA memcpy HtoD】
0.23%107.32ms 37582.8550us 1.8880us 8.9556ms[CUDA memcpy DtoH]
...
==2906==API调用:
时间(%)时间调用平均最小最大名称
83.47%41.8256s 42326988.18us 16.923us 13.332ms Cudamencpy
9.27%4.64747s 326372 14.239us 10.846us 11.601ms库达朗奇
1.49%745.12ms 1502720 495ns 379ns 1.7092ms Cudase参数
1.37%688.09ms 4702 146.34us 879ns 615.09ms cudaFree
...
当谈到优化内存访问时,在比较不同的实现时,我真正需要看哪些数字?它首先看起来像是
memcpy
只需要
117.53+107.32ms
(在两个方向上),但是还有这个API调用
cudaMemcpy
41.8256s
,这要多得多。此外,min/avg/max列不会在上部和下部输出块之间相加

为什么会有差异?对我来说,优化内存传输最重要的“真实”数字是什么


编辑:第二个问题是:是否有办法确定谁在调用,例如
axpy\u kernel\u val
(以及调用多少次)?

总时间的差异是由于工作是异步启动到GPU的。如果您有一个长时间运行的内核或一组没有与主机显式同步的内核,并在它们之后调用
cudaMemcpy
,那么
cudaMemcpy
调用将在内核完成执行之前启动。API调用的总时间是从启动到完成的那一刻,因此将与执行内核重叠。通过英伟达可视化剖析器(NVPROF-O XX./MyAPP</代码>,然后导入XXX进入NVVP),可以很清楚地看到输出。 差异是min time是由于启动开销造成的。虽然API评测考虑了所有的启动开销,但内核计时只包含其中的一小部分。正如您在这里看到的,发射开销可能约为10-20us


通常,API调用部分让您知道CPU在做什么,而分析结果则告诉您GPU在做什么。在这种情况下,我认为您没有充分利用CPU,因为
cudaMemcpy
启动得太早,浪费了CPU周期。然而,实际上,要从这些空闲周期中获得有用的东西通常很难或不可能。

谢谢!因此,只要我只是在试验内存对齐、固定等,就足以查看分析结果中的数字,对吗?另外,我还添加了第二个小问题,也许你愿意看一下。我没有从你的回答中得到对OP的问题“在比较不同实现时,我真正需要看的数字是什么?”的回答。对于第二个问题,我们可以推断一些cublasaxpy()函数调用axpy_kernel_val作为关键字“axpy”和“cublas”在括号内。