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 :

3.1 - Avec OpenMP parallélisez le kernel 0 optimisé :

Repartez de la version de k0 "ikj" :
    1. Essayez de multithreader la boucle la plus externe : boucle en "i"
    2. Si cela vous semble possible, vérifiez le bon fonctionnement sur un problème 2048x2048 puis 2049x2049, pour différents nombre de threads,
    3. Si tout vous semble fonctionner, mesurez les performances en faisant varier le nombre de threads, sur un moyen problème de 4096x4096.
    1. Refaites l'étude en tentant de paralléliser (le plus efficacement possible) la boucle en "k"
    2. 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) : 
    1. Vérifiez le bon fonctionnement sur un problème 2048x2048 puis 2049x2049, pour différents nombre de threads,
    2. Mesurez les performances en faisant varier le nombre de threads, sur un moyen problème de 8192x8192.
3.3 - Analyser les performances obtenues :
    1. 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)
    2. Est-ce que l'hyperthreading est aussi pertinent avec les deux kernels ? 
    3. Observez les accélérations obtenues successivement durant le BE (calculées dans la feuille Excel). Quelles sont les étapes déterminantes ?
    4. Observez-vous des configurations avec des performances stables et d'autres fluctuantes (d'une exécution à une autre) ?