Mineure HPC & Support au Big Data
Cours de 3ème année à Supélec
BE d'optimisations sérielles, de vectorisation et de multithreading par OpenMP
(Utilisation optimale d'un noeud de calcul)
Stéphane
Vialle
Exercice 3 : parallélisation OpenMP d'un produit de
matrices en C sous Linux/gcc
Certaines
optimisation sont réalisées par les
compilateurs, d’autres nécessitent une
modification du code source par le
programmeur. Chaque optimisation explicite est liée
à un concept
d’architecture, et équivaut à prendre
en compte l’architecture de la machine
depuis le code source. Cependant, la plupart de ces optimisations sont
« standard » et sont valables sur
la majorité des systèmes.
Dans
cet exercice :
- Le produit de
matrices carrées denses servira de problème
support, et sera implanté
« naïvement » puis de
plus en plus efficacement.
- Les performances de chaque
étape seront mesurées et rassemblées
dans des tables et des graphes de performances. ON VEILLERA A REALISER
LES DEVELOPPEMENTS ET LES TESTS DANS L’ORDRE !!
3.1 - Avec OpenMP parallélisez le kernel 0 optimisé :
Repartez de la version de k0 "ikj" :
- Essayez de multithreader la boucle la plus externe : boucle en "i"
- Si cela vous semble possible, vérifiez le bon fonctionnement sur un problème 2048x2048 puis 2049x2049, pour différents nombre de threads,
- Si tout vous semble fonctionner, mesurez
les performances en faisant varier le nombre de threads, sur un moyen problème de 4096x4096.
- Refaites l'étude en tentant de paralléliser (le plus efficacement possible) la boucle en "k"
- Refaites l'étude en tentant de paralléliser (le plus efficacement possible) la boucle en "j"
Remplissez les tableaux du fichier Excel (onglet "multi-nodes") pour les parallélisations que vous aurez réussi à faire.
3.2 - Avec OpenMP parallélisez le kernel 1 (appel à une bibliothèque BLAS) : - Vérifiez le bon fonctionnement sur un problème 2048x2048 puis 2049x2049, pour différents nombre de threads,
- Mesurez
les performances en faisant varier le nombre de threads, sur un moyen problème de 8192x8192.
3.3 - Analyser les performances obtenues :- Tracez
des courbes illustrant l'évolution du temps d'exécution et du nombre de
Gigaflops (attention aux échelles en X et en Y! Utilisez des "nuages de
points" pour les courbes en fonction du nombre de threads)
- Est-ce que l'hyperthreading est aussi pertinent avec les deux kernels ?
- Observez
les accélérations obtenues successivement durant le BE (calculées dans
la feuille Excel). Quelles sont les étapes déterminantes ?
- Observez-vous des configurations avec des performances stables et d'autres fluctuantes (d'une exécution à une autre) ?