2010-01-31 6 views
17

Je suis en train d'écrire une multiplication matricielle sur un GPU et je voudrais déboguer mon code, mais comme je ne peux pas utiliser printf dans une fonction d'appareil, y at-il autre chose que je puisse faire pour voir ce qui se passe à l'intérieur de cette fonction. Cette ma fonction actuelle:printf inside CUDA __global__ function

__global__ void MatrixMulKernel(Matrix Ad, Matrix Bd, Matrix Xd){ 

    int tx = threadIdx.x; 
    int ty = threadIdx.y; 

    int bx = blockIdx.x; 
    int by = blockIdx.y; 

    float sum = 0; 

    for(int k = 0; k < Ad.width ; ++k){ 
     float Melement = Ad.elements[ty * Ad.width + k]; 
     float Nelement = Bd.elements[k * Bd.width + tx]; 
     sum += Melement * Nelement; 
    } 

    Xd.elements[ty * Xd.width + tx] = sum; 
} 

J'aimerais savoir si Ad et Bd est ce que je pense, et voir si cette fonction est en fait appelé.

+0

Pourquoi ne pas utiliser cuda-gdb? – Bear

Répondre

15

EDIT

Pour éviter que les gens trompeurs, comme le souligne M. Tibbits printf est disponible dans tous les GPU de la capacité de calcul 2.0 et supérieur.

FIN DE EDIT

Vous avez le choix:

  • Utilisez un débogueur GPU, à savoir cuda-gdb sous Linux ou Nexus sur Windows
  • Utilisez cuprintf, qui est disponible pour les développeurs enregistrés (inscrivez-vous here)
  • Copiez manuellement les données que vous voulez voir, puis vider ce tampon sur l'hôte après la fin de votre noyau (n'oubliez pas de synchroniser)

En ce qui concerne l'extrait de code:

  • Tenir compte passer les Matrix struct via le pointeur (à savoir cudaMemcpy à l'appareil, puis passez dans le pointeur de l'appareil), maintenant vous n'aurez aucun problème mais si la signature de la fonction devient très grande, vous pouvez atteindre la limite de 256 octets
  • Vous avez des lectures inefficaces de l'annonce, vous aurez une opération de 32 octets dans la mémoire pour chaque lue dans Melement - envisager d'utiliser la mémoire partagée en tant que zone de stockage intermédiaire (cf l'échantillon transposeNew dans le SDK)
62

CUDA prend désormais en charge printf s directement dans le noyau . Pour une description formelle, voir l'annexe B.16 du CUDA C Programming Guide.

+1

C'est plutôt gentil. –

+9

Je pense que le lien ne pointe plus vers le bon endroit. Voici un autre lien: http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#formatted-output – cyang

+11

Note: "maintenant" signifie capacité de calcul 2.x ou supérieure. – colgur