了解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调用的总时间是从启动到完成的那一刻,因此将与执行内核重叠。通过英伟达可视化剖析器(通常,API调用部分让您知道CPU在做什么,而分析结果则告诉您GPU在做什么。在这种情况下,我认为您没有充分利用CPU,因为
cudaMemcpy
启动得太早,浪费了CPU周期。然而,实际上,要从这些空闲周期中获得有用的东西通常很难或不可能。谢谢!因此,只要我只是在试验内存对齐、固定等,就足以查看分析结果中的数字,对吗?另外,我还添加了第二个小问题,也许你愿意看一下。我没有从你的回答中得到对OP的问题“在比较不同实现时,我真正需要看的数字是什么?”的回答。对于第二个问题,我们可以推断一些cublasaxpy()函数调用axpy_kernel_val作为关键字“axpy”和“cublas”在括号内。