我只是看看下面的输出,并试图把我的注意力集中在数字上:
==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调用cudaMemcpy:41.8256s,它更多。另外,min/avg/max列在上、下输出块之间并不相加。
为什么有差异,什么是“真实”的数字,是重要的,我优化内存传输?
编辑:第二个问题是:是否有一种方法可以确定谁在打axpy_kernel_val (以及打了多少次电话)?
发布于 2015-05-21 11:12:24
总时间的差异是由于工作异步地启动到GPU。如果您有一个长时间运行的内核或一组内核,没有显式地同步到主机,并跟随它们调用cudaMemcpy,那么cudaMemcpy调用将在内核完成执行之前启动。API调用的总时间是从它启动的那一刻到它完成的那一刻,因此将与执行的内核重叠。如果您通过NVIDIA (nvprof -o xxx ./myApp,然后将xxx导入到nvvp)运行输出,您可以非常清楚地看到这一点。
不同的是,min时间将导致启动开销。虽然API分析考虑了所有的启动开销,但是内核定时只包含其中的一小部分。正如你在这里看到的那样,发射的开销可以是10-20 as。
一般来说,API调用部分让您知道CPU正在做什么,而分析结果则告诉您GPU正在做什么。在这种情况下,我认为您正在使用CPU,因为可以说,cudaMemcpy启动得太早了,而且CPU周期被浪费了。然而,在实践中,从这些空闲周期中获取任何有用的东西通常是困难的或不可能的。
https://stackoverflow.com/questions/30371030
复制相似问题