CSC 5001– High Performance Systems

Portail informatique

OpenMP - Travaux Pratiques

Hello world

Écrire une programme C séquentiel affichant « Hello world »
  • Compilez-le et exécutez-le

Modifier le programme pour que chaque thread affiche le message
  • Quel est le nombre de threads lancés par défaut ?
  • Positionner le nombre de threads à lancer à 4.
  • Compiler et exécuter.
  • Afficher le n° de chaque thread

Vérifier la compatibilité ascendante du programme
  • Compiler le programme OpenMP sans le support OMP
  • Protéger les appels à la lib OMP

Portée des variables

Tester l'effet des clauses private et firstprivate :
  • Déclarer et initialiser deux variables entières.
  • Dans une région parallèle à laquelle vous aurez passé l'une des variables en private et l'autre en firstprivate, récupérer l'identifiant du thread courant et l'ajouter à chacune de ces variables. Les afficher.
  • Vérifier le comportement escompté.

Tester l'effet de la clause shared :
  • Dans la région séquentielle, ajouter une troisième variable initialisée.
  • Passez-la à la région parallèle en tant que variable partagée.
  • Dans la région parallèle, affichez-la et vérifiez sa valeur.

Directive for

Parallélisation de boucle
  • Écrivez un programme C effectuant la somme de chaque élément d'un tableau et d'un scalaire dans un second tableau
  • Parallélisez ce programme avec OpenMP

Ordonnancement
  • En utilisant la fonction omp_get_schedule, déterminez quelle est la politique d'ordonnancement fixée par défaut.
  • Expérimentez l'effet de la clause schedule sur le programme : pour cela, affichez le n° du thread traitant chaque tour de boucle et observez la répartition.

Synchronisation
  • Créez une nouvelle région parallèle qui contient :
    • la même boucle for que précédemment décrite avec un scheduling static dont la taille=taille_du_tableau/2
    • un affichage notifiant le positionnement après la boucle
  • En positionnant OMP_NUM_THREADS à 4, observez l'ordonnancement effectué
    • Avec et sans la clause nowait

Parallélisation de boucle avec réduction
  • Écrivez un programme C calculant le somme des éléments d'un tableau
  • Parallélisez ce programme avec OpenMP
  • Comparez les temps d'exécution séquentielle et parallèle en utilisant la fonction double omp_get_wtime(void)

Directive Critical

Écrivez un programme permettant de calculer la somme des éléments d'un tableau grâce à une construction critical.

Stencil - Calcul homogène

Un stencil est une opération qui consiste à passer un filtre sur l'ensemble des éléments d'une structure de données de manière à leur donner une nouvelle valeur tenant compte de leur voisinnage. Ici, nous proposons de paralléliser un stencil 5pt qui applique à chaque élément la somme de 5 éléments : l'élément courant, l'élément à sa gauche, l'élément à sa droite, l'élément du dessus et l'élément du dessous.

À partir du code séquentiel donné, implantez une version parallèle grâce à OpenMP.

Évaluez les performances obtenues en faisant varier le nombre de threads activés et en les comparant aux performances de la version séquentielles.

Si ce n'est pas déjà le cas, expérimentez l'utilisation de la clause collapse afin de raffiner le grain de votre parallélisation.

Que remarquez-vous en terme de performance? Jouez avec différentes stratégies d'ordonnancement pour obtenir un grain de parallélisme satisfaisant.

Une façon de répondre à la dernière question peut être de passer par la modification de l'algorithme afin de créer des tuiles de calcul en vue de favoriser une charge de calcul et des accès aux données tenant en cache. Modifiez votre programme en ce sens.

Le voyageur de commerce - Calcul non-homogène