TD 3-4. Introduction à CUDA
par Eric Goubault et Sylvie Putot

Utiliser CUDA dans les salles machines de l'X

Quelles cartes NVIDIA et ou sont-elles?

Ecrire, compiler et exécuter un programme CUDA

La documentation

Une première 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) : \[ \pi = \int_0^1 \frac{4}{1+x^2} dx \approx \sum_{i=1}^n \frac{1}{n} \frac{4}{1+((i-\frac{1}{2})\frac{1}{n})^2}. \]

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 \[ P_k = \sum_{i=k*n/N+1}^{(k+1)*n/N} \frac{1}{n} \frac{4}{1+((i-\frac{1}{2})\frac{1}{n})^2} \, , \; k=0,\ldots,N-1, \] puis faire la somme des résultats partiels.

Quelques pistes et suggestions pour l'implémentation CUDA

Vérification des résultats et affichage des performances

Précision des calculs

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)

Simulation différences finies

Equation de Laplace

Nous voulons calculer la distribution de température dans une pièce carrée, sachant que la température sur les bords est fixée: la température sur les murs de la pièce est de 20 degrés, sauf sur l'un des murs (disons la cheminée...), ou elle est à 100 degrés. En régime stationnaire, c'est-à-dire lorsque la température est stabilisée, la température vérifie l'équation de Laplace (bi-dimensionnelle ici) \[ \Delta T = \frac{\partial^2 T}{\partial x^2} + \frac{\partial^2 T}{\partial y^2}= 0.\] Nous allons calculer la température sur une grille régulière par une méthode de différences finies classique, en approchant les dérivées partielles au point (x,y) par \[ \frac{\partial^2 T}{\partial x^2}(x,y) \approx \frac{1}{h^2} (f(x+h,y) - 2 f(x,y) + f(x-h,y) ), \] \[ \frac{\partial^2 T}{\partial y^2}(x,y) \approx \frac{1}{h^2} (f(x,y+h) - 2 f(x,y) + f(x,y-h) ), \] ou h est un pas de discrétisation suffisamment petit. En supposant qu'on a discrétisé le rectangle par une grille de N par N points, alors la température en chaque point (i,j) de la grille peut s'exprimer directement en fonction de ses voisins immédiats, par \[ T_{i,j} = \frac{T_{i-1,j}+T_{i+1,j}+T_{i,j-1}+T_{i,j+1}}{4}, \; \forall i,j \in \{1,\ldots,N-2\}, \] les températures pour i=0, i=N-1, j=0 et j=N-1 étant données par les conditions limites.

Calcul séquentiel de la température en chaque point

Pour calculer la température en chaque point, on va donc itérer ce calcul jusqu'à ce que la différence entre deux itérées successives devienne inférieure à un certain seuil. On va dans un premier temps implémenter la version de référence séquentielle et afficher les résultats. Vous pouvez faire plusieurs versions:

Une possibilité pour l'affichage

Pour l'affichage des résultats, vous pouvez par exemple:

Versions parallèles

Quelques suggestions:

Equation de la chaleur

On s'intéresse maintenant à l'évolution de la température dans la pièce, modélisée par l'équation de la chaleur \[ \frac{\partial T}{\partial t} = \alpha \Delta T, \] en partant par exemple d'une température égale à 20 degrés partout sauf sur un mur ou elle est égale à 100, et avec comme conditions aux limites 20 degrés sur tous les murs sauf celui ou elle vaut 100. Calculer la température en fonction du temps par une méthode de différences finies. Cette fois, la synchronisation stricte est nécessaire. Comme précédemment, implémenter et comparer plusieurs versions en essayant d'améliorer progressivement les performances: