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.