TP 0 : Prise en main de l’environnement CUDA
Mineure CalHau-2
Stéphane
Vialle, CentraleSupélec & LRI,
Stéphane.Vialle@centralesupelec.fr
(auteur principal du sujet: Laércio
Lima Pilla, CNRS & LRI,
pilla@lri.fr)
Objectifs
du TP :
Ce TP a pour objectif de permettre
aux étudiants de se familiariser avec l’utilisation des serveurs
de calculs distants du Data Center d’Enseignement (DCE) de
CentraleSupélec et de s’habituer à la programmation et au débogage
d’un code CUDA.
- Vous réaliserez l’allocation d'un serveur de calculs
équipé d'un GPU, le transfert de fichiers (code et images) vers et
depuis ce serveur, l’édition de fichiers sources, et la
compilation de code CUDA.
- Vous apprendrez les spécificités de la
programmation CUDA par la correction d'erreurs dans un code source, étape par étape.
- Enfin, vous mesurerez et comparerez les performances obtenues
sur un GPU avec celles obtenues sur un CPU.
Plate-forme
de développement :
Les
machines utilisées seront celles des clusters Cameron ou Tx du DCE de
CentraleSupélec :
- Tx : chaque machine contient un CPU Intel XEON quad-core
hyperthreadés, et un GPU NVIDIA GTX-2080Ti (architecture Turing)
- Cameron
: chaque machine contient un CPU Intel XEON hexa-core
hyperthreadés, et un GPU NVIDIA GTX-1080 (architecture Pascal)
L'environnement
CUDA C et C++ est disponible sur chaque machine (et donc le
compilateur "nvcc"
et les drivers pour utiliser le GPU).
Vous utiliserez les
comptes de TP "gpucs1_#i", où #i est une valeur entière
entre 1 et 16.
Depuis votre poste de travail :
- vous vous connecterez
par ssh sur la machine ghome.metz.supelec.fr en indiquant le login gpupps1_#i
- puis vous vous connecterez par ssh à la machine term2.grid.metz.supelec.fr,
- où vous réserverez UN nœud sur le cluster à l'aide d'une commande oarsub.
Ex: oarsub
-p "cluster='Tx'" -l nodes=1,walltime=4:00:00
-I
Travail à effectuer :
Remarques
préliminaires :
- La
partie CPU (cpu_kernel.cpp)
est complète et sans erreur. Elle servira de calcul de référence
(pour vérifier les résultats obtenus avec la version GPU et pour
la comparaison des performances).
- La
partie GPU (gpu_kernel.cu) contient plusieurs erreurs qui
seront corrigées pendant les étapes du TP.
- Pour
compiler le programme, exécutez make.
- Pour compiler le programme de comparaison d'images : allez dans comparison et exécutez make.
- Vous
pouvez vérifier des résultats avec les versions CPU et GPU à
l'aide du programme comparison/comparison <file 1> <file 2>
1 – Correction de la compilation du programme :
- Récupérez
le programme :
depuis votre compte sur gpucs1_* entrez : cp
~vialle/tmp/ImageFiltering3-enonce.zip .
ou bien : archive
- Essayez
de compiler le programme avec la commande make.
Trouvez les erreurs dans la compilation du programme et corrigez les
2 – Correction
de l’exécution du programme :
A chaque étape, vous compilerez et testerez le programme dans sa
version GPU. Vous
pourrez vérifier que la sortie ne sera pas exactement égale à la
sortie de la version CPU. Après chaque correction, vous pourrez
voir l’évolution des résultats.
-
Testez le
programme sur l'image inputs/bridge.png avec le filtre inversion.
-
Vérifier
les images de sortie (sont-elles complètes ?).
-
Vérifier
les images de sortie (sont-elles strictement
identiques ?).
-
Refaites un filtrage en précisant d'utiliser le CPU et
générez ainsi une image de référence.
-
Utilisez le programme de
comparaison (répertoire comparison) pour tester si les deux images sont identiques.
- Corigez les erreurs jusqu'à ce que les images CPU et GPU soient strictement identiques
- Testez maintenant le programme sur l'image inputs/ducks.png avec le filtre de floutage : blur.
- Cherchez les erreurs dans le kernel blur, et corrigez-les jusqu'à ce que le programme s'exécute sur GPU et que la
comparaison à l'image générée par le CPU n'indique plus aucune
différence.
3 - Etude
des performances :
- Testez
les différentes versions du filtre de flou (CPU et GPU) avec les
différentes images.
- Notez les performances et calculez le speedup entre les versions
CPU et GPU pour les différents images testées.
Images
|
bridge (small)
|
ducks (large)
|
T CPU
|
|
|
T GPU
|
|
|
Speedup = T CPU / T GPU
|
|
|
4 -
Activités supplémentaires :
- Réimplantez
les kernels inversion et gpuBlur en utilisant de blocs 2D et une
grille de blocs 2D (à la place du code avec un grille 1D des blocs
1D actuel).