2017-03-09 146 views
0

是否可以使用nvprof来计算CUDA内核执行次数(即启动了多少个内核)?使用nvprof对CUDA内核执行进行计数

现在当我运行nprof我所看到的是:

==537== Profiling application: python tf.py 
==537== Profiling result: 
Time(%)  Time  Calls  Avg  Min  Max Name 
51.73% 91.294us  20 4.5640us 4.1280us 6.1760us [CUDA memcpy HtoD] 
43.72% 77.148us  20 3.8570us 3.5840us 4.7030us [CUDA memcpy DtoH] 
    4.55% 8.0320us   1 8.0320us 8.0320us 8.0320us [CUDA memset] 

==537== API calls: 
Time(%)  Time  Calls  Avg  Min  Max Name 
90.17% 110.11ms   1 110.11ms 110.11ms 110.11ms cuDevicePrimaryCtxRetain 
    6.63% 8.0905ms   1 8.0905ms 8.0905ms 8.0905ms cuMemAlloc 
    0.57% 700.41us   2 350.21us 346.89us 353.52us cuMemGetInfo 
    0.55% 670.28us   1 670.28us 670.28us 670.28us cuMemHostAlloc 
    0.28% 347.01us   1 347.01us 347.01us 347.01us cuDeviceTotalMem 
... 

回答

1

是,其可能的。如果你不知道,有documentation和命令行帮助可用(nvprof --help)。

什么你问的是nvprof的最简单的用法提供:

nvprof ./my_application

这将输出(除其他事项外)的名字内核列表,多少次,每次一个被启动,并且每个GPU占用的总体GPU占用的百分比。

下面是一个例子:

$ nvprof ./t1288 
==12904== NVPROF is profiling process 12904, command: ./t1288 
[email protected]: 0x402add 
[email protected]: 0x8 
run on device 
func_A is correctly invoked! 
run on host 
func_A is correctly invoked! 
==12904== Profiling application: ./t1288 
==12904== Profiling result: 
Time(%)  Time  Calls  Avg  Min  Max Name 
98.93% 195.28us   1 195.28us 195.28us 195.28us run_on_device(Parameters*) 
    1.07% 2.1120us   1 2.1120us 2.1120us 2.1120us assign_func_pointer(Parameters*) 

==12904== Unified Memory profiling result: 
Device "Tesla K20Xm (0)" 
    Count Avg Size Min Size Max Size Total Size Total Time Name 
     1 4.0000KB 4.0000KB 4.0000KB 4.000000KB 3.136000us Host To Device 
     6 32.000KB 4.0000KB 60.000KB 192.0000KB 34.20800us Device To Host 
Total CPU Page faults: 3 

==12904== API calls: 
Time(%)  Time  Calls  Avg  Min  Max Name 
98.08% 321.35ms   1 321.35ms 321.35ms 321.35ms cudaMallocManaged 
    0.93% 3.0613ms  364 8.4100us  278ns 286.84us cuDeviceGetAttribute 
    0.42% 1.3626ms   4 340.65us 331.12us 355.60us cuDeviceTotalMem 
    0.38% 1.2391ms   2 619.57us 113.13us 1.1260ms cudaLaunch 
    0.08% 251.20us   4 62.798us 57.985us 70.827us cuDeviceGetName 
    0.08% 246.55us   2 123.27us 21.343us 225.20us cudaDeviceSynchronize 
    0.03% 98.950us   1 98.950us 98.950us 98.950us cudaFree 
    0.00% 8.9820us  12  748ns  278ns 2.2670us cuDeviceGet 
    0.00% 6.0260us   2 3.0130us  613ns 5.4130us cudaSetupArgument 
    0.00% 5.7190us   3 1.9060us  490ns 4.1130us cuDeviceGetCount 
    0.00% 5.2370us   2 2.6180us 1.2100us 4.0270us cudaConfigureCall 
$ 

在上面的例子run_on_deviceassign_func_pointer是内核的名字。在我链接的文档中也有示例输出。

+0

我更新了我在运行nprof时看到的问题。我没有看到任何叫做内核的东西。 –

+0

我可以考虑两种可能性:1.你的python代码没有进行任何(成功的)内核调用 - 你在做适当的错误检查吗?你确定知道内核被调用吗? 2.你可能需要告诉nvprof来描述子进程 - 如何做到这一点在我链接的文档中有介绍。这将取决于你在'tf.py'中发布什么类型的工作 - 可能是tensorflow。 –

+0

好的,结果没有内核被调用。 –