Mineure CalHau1
Cours de 3ème année à CentraleSupélec

TP de multithreading par OpenMP

(Utilisation optimale d'un noeud de calcul)

Stéphane Vialle

Objectifs du TP :

Les processeurs d'aujourd'hui sont multi-coeurs, et les serveurs de calculs sont multi-processeurs. Un noeud de calcul possède donc de nombreux coeurs de calculs connectés à une mémoire partagée. Un paradigme de programmation possible est le multithreading et le partage de mémoire entre threads.

Ce TP a pour objectif de paralléliser sur plusieurs coeurs un produit de matrices carrées pleines, implanté initialement selon plusieurs algorithmes optimisés mais sur un seul coeur. On parallélisera successivement 3 implantations initiales,et on mesurera les performances de chaque version. Ce travail sera réalisé sur des PC classiques sous linux (mais une mise en oeuvre similaire est possible sous Windows), et en langage C avec OpenMP.

Documents à rendre : 

Vous rendrez un SEUL document : un fichier Word ou PDF :
  • il sera nommé avec vos noms précédés de "TP2-OpenMP". Ex : "TP2-OpenMP-Pignon.pdf"
  • il comportera sur la première page :
    • vos nom et prénoms, et le nom de votre option de 3A,
    • la date de remise du rapport,
    • le titre ("TP2 : Parallélisation OpenMP").
  • il comportera ensuite : 
    • une description des optimisations réalisées (pourquoi ? comment ?), y compris de celles permettant d'engager les unités vectorielles
    • des tableaux ou graphiques de synthèse représentant vos mesures de performances,
    • votre analyse/synthèse de la démarche,
    • les extraits importants des codes sources (ex : les routines de calculs après les optimisations importantes).
  • Taille maximale de vos rapports : 3 pages.
  • Date limite de remise de vos rapports : <voir date annoncée en cours>.
  • Remise par e-mail à Stephane Vialle (Stephane.Vialle@centralesupelec.fr)

Travail à effectuer :

Remarques préliminaires :
  • L'accès aux clusters de calculs du Data Center d'Enseignement de CentraleSupélec se fait à travers l'environnement OAR, et en utilisant des comptes informatique locaux au campus de Metz. La procédure d'utilisation de OAR pour ce TP est ici.
  • Les codes de calcul de ce TP seront évalués par leurs temps d'exécution des routines de calculs dont on déduira les GigaFlops (performances absolues), puis par leurs accélérations vis-à-vis de la version "naïve" (performances relatives).
  • Conservez chacun de vos codes (les codes de chacune des étapes), car il vous resserviront dans d'autres questions.
Fichiers à télécharger :
  • Code source initial à compléter : ici
  • Fichier Excel de relevé des performances : ici

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 "Mono-node-ikj-K0") pour les parallélisations que vous aurez réussi à faire.

3.2 - Avec OpenMP parallélisez le kernel 1 optimisé :
    1. A partir de l'expérience acquise avec le kernel 0 :
    2. Parallélisez efficacement la boucle choisie.
    3. Vérifiez le bon fonctionnement sur un problème 2048x2048 puis 2049x2049, pour différents nombre de threads,
    4. Mesurez les performances en faisant varier le nombre de threads, sur un moyen problème de 4096x4096.
Remplissez le tableau du fichier Excel (onglet "Mono-node-TB-K1") pour la parallélisation de boucle que vous aurez choisie.

3.3 - Avec OpenMP parallélisez le kernel 2 (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.
Remplissez le tableau fichier Excel (onglet "Mono-node-BLAS-K2").

3.4 - 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 TP (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) ?