TD 2 (partie 2). Introduction à CUDA
par Eric Goubault et Sylvie Putot
Utiliser CUDA dans les salles machines de l'X
Quelles cartes NVIDIA et ou sont-elles?
- En salles 30, 35 et 36 (liste des machines)
- Cartes GeForce GTX 260:
- Total amount of global memory: 938803200 bytes
- Number of multiprocessors: 24
- Number of cores: 192
- Total amount of constant memory: 65536 bytes
- Total amount of shared memory per block: 16384 bytes
- Total number of registers available per block: 16384
- Warp size: 32
- Maximum number of threads per block: 512
- Maximum sizes of each dimension of a block: 512 x 512 x 64
- Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
- Maximum memory pitch: 262144 bytes
- Texture alignment: 256 bytes
- Clock rate: 1.24 GHz
Ecrire, compiler et exécuter un programme CUDA
- La première fois, il faut positionner les variables d'environnement. Créer ou ouvrir le fichier ~/.bashrc ou ~/.bash_profile et y ajouter:
PATH=$PATH:/usr/local/cuda/bin:/usr/local/cuda/open64/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib
export PATH
export LD_LIBRARY_PATH
- NVIDIA propose un ensemble d'exemples, accompagné d'une librairie d'utilitaires (cutil), qui contient des timers et toutes les fonctions
en "CUT".
- Pour compiler vos fichiers indépendamment (en dehors donc) de la SDK, vous pouvez, par exemple pour le répertoire template, partir du Makefile suivant
- Vous pouvez aussi tout mettre dans un seul fichier mon_essai.cu et compiler puis exécuter
par
nvcc mon_essai.cu -I/usr/local/cuda/include/ -L/usr/local/cuda/lib -o mon_essai
./mon_essai
Si vous voulez utiliser la librairie cutil de la sdk (divers utilitaires, dont les timers et tout ce qui est en cut), il faut ajouter des include et des librairies, par exemple:
nvcc mon_essai.cu -I/usr/local/cuda/include/ -I/users/profs/info/putot/NVIDIA_GPU_Computing_SDK/C/common/inc/ -L/usr/local/cuda/lib/
-L/users/profs/info/putot/NVIDIA_GPU_Computing_SDK/C/lib/ -lcutil_i386 -o mon_essai
La documentation
Mise en oeuvre : calcul de PI en parallèle
Implémenter le calcul de π en parallèle avec la formule suivante (cf aussi le TD1) :
Principe général de calcul
Une solution est le paradigme Maître/Esclave:
Un maître va lancer N esclaves chargés de calculer les sommes
partielles,
pour k=0,⋯,N-1, puis faire la somme des résultats partiels.
Quelques pistes et suggestions pour l'implémentation CUDA
Pour vous aider à démarrer, en plus des docs CUDA, vous pouvez regarder les transparents du cours 3.
Vérification des résultats et affichage des performances
- Comparer le résultat obtenu sur GPU avec le calcul de Pi pour la même valeur de $n$
- Ajouter des mesures des temps de calcul et afficher l'accélération par rapport au programme séquentiel;
plusieurs solutions pour mesurer le temps de calcul:
- les fonctions habituelles C clock() ou time(),
- les timers CUDA (cudaEvent, cf le manuel Cuda C best practice),
- les timers de la SDK (voir template par exemple)
- Ne pas hésiter à récupérer les messages d'erreur éventuels en utilisant les fonctions CUT_SAFE_CALL/cutilSafeCall(attention sinon, l'exécutable peut très bien s'être planté sans rien dire...) ; pour les problèmes d'accès mémoire (voire pour avoir plus d'info sur ce qui est réellement calculé),
vous pouver utiliser cuda_memcheck (compiler avec -g -G)
Précision des calculs
- Si les calculs sont effectués en simple précision et si on prend n trop grand, un phénomène d'absorption fait que la précision des résultats devient extrèmement mauvaise,
- Or avec les options de compilation par défaut, les double sont interprétés sur le GPU comme des float, et il y a
des problèmes de transmission entre CPU et GPU, donc appeler nvcc avec l'option -arch=sm_13
- Si vous utilisez des double, attention aux performances, un seul coeur par carte calcule en double, et les double sont
plus lents!
Faire varier taille des grilles et des blocs
Faire varier n, le nombre de blocs, de threads par blocs et observer les performances relatives.
Quelques outils
Visual profiler
Occupancy calculator
Pour essayer de comprendre les performances: mode d'emploi inclus dans le fichier excel.
Le debugger
cuda_gdb (seulement en mode console), cuda_memcheck (pas de pb de mode console; compiler avec -g -G)