Mineure HPC & Support au Big Data
Cours de 3ème année à Supélec

BE de programmation CUDA

(parallélisation sur un GPU - part 2)

Stéphane Vialle

Objectifs du BE :

Ce BE a pour objectif de pratiquer la programmation d'un GPU au sein d'un noeud de calcul CPU+GPU : il consiste à implanter un premier produit de matrices denses sur un GPU. On développera différents "kernels", et pour chacun on mesurera les performances d'un produit de matrices denses sur un GPU, en fonction de la granularité de la grille de blocs de threads. On étudiera la qualité de la "coalescence" de chaque version du kernel, pour identifier les solutions les plus intéressantes. Enfin, on comparera les performances obtenues sur GPU avec celle obtenues sur le CPU.

Plate-forme de développement : 

Les machines utilisées seront celles des clusters Cameron ou Tx de CentraleSupélec :
Vous utiliserez les comptes de TP "hpcmetz_#i" (ou hpcgif_#i), où #i est une valeur entière entre 1 et 16. Depuis votre poste de travail vous vous connecterz par ssh sur la machine ghome.metz.supelec.fr, puis vous vous connecterez à la machine term2.grid.metz.supelec.fr où vous réserverez UN noeud sur l'un des clusters à l'aide des commandes OAR.

Documents à rendre : 

Vous rendrez un SEUL document par binôme : un fichier Word (.doc) ou PDF :

Travail à effectuer :

Remarques préliminaires :
 
4 - Utilisation de la mémoire "shared" de chaque multiprocesseur :

On repartira du code obtenu à la fin de la question 3, auquel on ajoutera un nouveau kernel (K2).
  1. Implantez le kernel K2 (et sa grille de blocs de threads) en version simplifiée pour que :
  • chaque thread calcule un élément complet de la matrice C (matrice résultat),
  • un bloc de threads soit une surface 2D carrée de threads calculant les éléméments d'une sous-matrice carrée de C,
  • le kernel K3 implémente l'algorithme vu en cours utilisant la shared memory.
A ce stade, on supposera que la taille des matrices est un multiple de la taille des blocs de threads.
Testez votre implantation sur une matrice de 4096x4096 éléments (vérifiez que vous obtenez les mêmes valeurs que sur CPUs).
  1. Implantez le kernel K3 pour qu'il fonctionne même si la taille des matrices n'est plus un multiple de la taille des blocs de threads.
On continuera toutefois à considérer des matrices carrées.

Testez votre implantation sur une matrice de 4097x4097 éléments (vérifiez que vous obtenez les mêmes valeurs que sur CPUs).
  1. Mesure de performances : Une fois que votre kernel K3 est au point, mesurez les performances obtenues sur une matrice de 4096x4096 éléments.
Faites varier la taille de vos blocs 2D de threads, et mesurer les performances obtenues.  Vérifiez toujours l'exactitude des résultats obtenus.

Comparez aux meilleurs performances obtenues sur CPU multi-coeurs en OpenMP, et aux meilleures performances obtenues sur GPU précédemment (sans la mémoire "shared"). calculez les speedup GPU-shared vs CPU, et GPU-shared vs GPU.