2017-03-09 4 views
0

Est-il possible d'utiliser nvprof pour compter le nombre d'exécutions du noyau CUDA (c'est-à-dire combien de noyaux sont lancés)?Utilisation de nvprof pour compter les exécutions du noyau CUDA

En ce moment, quand je lance nprof ce que je vois est:

==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 
... 

Répondre

1

Oui, il est possible. Dans le cas où vous n'êtes pas au courant, il y a documentation et l'aide de ligne de commande disponible (nvprof --help).

Qu'est-ce que vous demandez est fourni par l'utilisation la plus simple de nvprof: combien de fois une liste des noyaux par nom,

nvprof ./my_application

cette sortie de volonté (entre autres) chaque un a été lancé, et quel pourcentage de l'utilisation globale de GPU chacun représenté.

Voici un exemple:

$ 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 
$ 

Dans l'exemple ci-dessus run_on_device et assign_func_pointer sont les noms du noyau. Il y a aussi un exemple de sortie dans la documentation que j'ai liée.

+0

J'ai mis à jour la question avec ce que je vois lors de l'exécution de nprof. Je ne vois rien appelé comme un noyau. –

+0

Je peux penser à deux possibilités: 1. Votre code python ne fait aucun appel (réussi) au noyau - faites-vous des vérifications d'erreurs correctes? Savez-vous avec certitude que les grains sont appelés? 2. Vous devrez peut-être indiquer à nvprof de profiler les processus enfants - la manière de procéder est décrite dans la documentation que j'ai liée. Cela dépendra du type de travail que vous publiez exactement dans votre 'tf.py' - probablement tensorflow. –

+0

D'accord, il s'avère qu'aucun noyau n'a été appelé. –