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.
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. –
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. –
D'accord, il s'avère qu'aucun noyau n'a été appelé. –