我如何知道程序调用哪些CUDA API?没有查看源代码?

时间:2016-12-28 09:24:38

标签: cuda

架构是这样的:

python-----[call]----->tensor flow for gpu----[call]---->CUDA SDK CUDA-----
[call]---> gpu binary to execute the job or something.

我已经尝试nvvp从python脚本直接分析。结果是内存中耗费了4.6G的成本。并且nvvp gui冻结了。所以基本上我不知道如何继续。

有没有可能的方法可以确切地知道整个程序所谓的CUDA API?这个问题不仅适用于张量流,我需要一个通用的方法来解决这个问题,以便我以后可以测试所有相关的API来决定哪个GPU适合我们的程序。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用命令行分析工具nvprof和api摘要选项,如下所示:

$ nvprof --print-api-summary ./a.out 
3 6 7 5 3 5 6 2 9 
1 2 7 0 9 3 6 0 6 
2 6 1 8 7 9 2 0 2 
3 7 5 9 2 2 8 9 7 
==18840== NVPROF is profiling process 18840, command: ./a.out
0: 3.000000 5.000000 6.000000 2.000000
1: 9.000000 3.000000 6.000000 0.000000
2: 7.000000 9.000000 2.000000 0.000000
3: 2.000000 2.000000 8.000000 9.000000
3 6 7 5 3 3.142 6 2 9 
1 2 7 0 9 3.142 6 0 6 
2 6 1 8 7 3.142 2 0 2 
3 7 5 9 2 3.142 8 9 7 
==18840== Profiling application: ./a.out
==18840== Profiling result:
==18840== API calls:
Time(%)      Time     Calls       Avg       Min       Max  Name
 41.57%  117.77ms         1  117.77ms  117.77ms  117.77ms  cudaMallocPitch
 31.45%  89.096ms         1  89.096ms  89.096ms  89.096ms  cudaFree
 26.61%  75.398ms         1  75.398ms  75.398ms  75.398ms  cudaDeviceReset
  0.14%  390.33us         1  390.33us  390.33us  390.33us  cudaLaunch
  0.09%  252.51us        91  2.7740us     247ns  98.999us  cuDeviceGetAttribute
  0.08%  225.51us         1  225.51us  225.51us  225.51us  cuDeviceTotalMem
  0.04%  101.02us         1  101.02us  101.02us  101.02us  cudaDeviceSynchronize
  0.02%  43.777us         2  21.888us  21.009us  22.768us  cudaMemcpy2D
  0.01%  32.867us         1  32.867us  32.867us  32.867us  cuDeviceGetName
  0.00%  4.1070us         4  1.0260us     188ns  3.2290us  cudaSetupArgument
  0.00%  3.3560us         3  1.1180us     332ns  2.4330us  cuDeviceGetCount
  0.00%  2.1280us         3     709ns     265ns  1.2330us  cuDeviceGet
  0.00%  1.2200us         1  1.2200us  1.2200us  1.2200us  cudaConfigureCall
  0.00%     885ns         1     885ns     885ns     885ns  cudaPeekAtLastError

这显示了程序在与应用程序关联的CUDA上下文的生命周期内执行的所有驱动程序和运行时API调用。