2013-05-30 5 views
1

Existe-t-il une option pour profiler un noyau CUDA? Pas dans son ensemble, mais plutôt en partie. J'ai quelques invocation de fonctions de périphérique et je veux mesurer leurs temps. Y a-t-il des drapeaux/événements/instructions que je peux définir et ensuite il sera visible dans NVIDIA Visual Profiler? Ou dois-je le faire manuellement en insérant cudaEventCreate et des fonctions similaires.Profilage CUDA dans le noyau

Répondre

3

Vous pouvez chronométrer des parties spécifiques de votre noyau manuellement à l'aide des clock() ou clock64() fonctions:

unsigned long long* time_spent; 

__global__ void kernel(...) 
{ 
    unsigned int t1, t2; 
    // ... 
    t1 = clock(); 
    // code of interest 
    t2 = clock(); 
    atomicAdd(&time_spent, t2 - t1); 
} 

« horloge()` retourne officiellement clock_t, mais je préfère l'utilisation explicite de unsigned int pour rendre évidente comment le code ci-dessus est capable de traiter des valeurs de bouclage horloge (tant que le code chronométré ne prend pas plus de 2^32-1 cycles pour terminer.

Assurez-vous aussi avec le temps le code

t1 = clock(); 
    t2 = clock(); 

dos-à-dos afin que vous puissiez soustraire le temps système.

+0

N'est-ce pas que 'clock()' renvoie un compteur local par SM? – KiaMorot

+0

En dépendance de cette réponse: http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#time-function – KiaMorot

+0

Oui c'est le cas. Mais cela n'a pas d'importance tant que nous ne prenons que des différences entre les temps d'un même SM. (Le parallélisme dynamique créerait en effet un problème ici, pour simplifier je suppose que le code d'intérêt ne lance aucun autre noyau). – tera

Questions connexes