web-dev-qa-db-fra.com

printf dans la fonction CUDA __global__

J'écris actuellement une multiplication matricielle sur un GPU et je voudrais déboguer mon code, mais comme je ne peux pas utiliser printf dans une fonction de périphérique, y a-t-il autre chose que je peux faire pour voir ce qui se passe à l'intérieur de cette fonction. C'est ma fonction actuelle:

__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 sont ce que je pense que c'est, et voir si cette fonction est réellement appelée.

25
Jose Vega

[~ # ~] modifier [~ # ~]

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

FIN DE MODIFICATION

Vous avez le choix:

  • Utilisez un débogueur GPU, c'est-à-dire cuda-gdb sous Linux ou Nexus sous Windows
  • Utilisez cuprintf, qui est disponible pour les développeurs enregistrés (inscrivez-vous ici )
  • Copiez manuellement les données que vous souhaitez voir, puis videz ce tampon sur l'hôte une fois votre noyau terminé (n'oubliez pas de synchroniser)

Concernant votre extrait de code:

  • Pensez à passer les structures Matrix via un pointeur (c'est-à-dire cudaMemcpy à l'appareil, puis passez le pointeur de l'appareil), pour le moment, vous n'aurez aucun problème, mais si la signature de la fonction devient très grande, alors vous pouvez atteindre la limite de 256 octets
  • Vous avez des lectures inefficaces depuis Ad, vous aurez une transaction de 32 octets vers la mémoire pour chaque lecture dans Melement - envisagez d'utiliser la mémoire partagée comme zone de transfert (c.-à-d. L'échantillon transposeNew dans le SDK)
17
Tom

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

74
M. Tibbits

au fait..

4
Juan Leni

Voir la section "Sortie formatée" (actuellement B.17) du Guide de programmation CUDA C.

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

2
Andrei Pokrovsky