Introduction à OpenMP Références
Transcription
Introduction à OpenMP Références
Introduction à OpenMP Daniel Etiemble [email protected] Références • Dieter an Mey, « Parallel programming in OpenMP », Aachen university of Technology • Muller et al, « Introduction to OpenMP », High Performance Computing Center, Stuttgart, www.hlrs.de • www.openmp.org Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 2 1 OpenMP • • • • • Modèle pour la programmation parallèle Parallélisme en mémoire partagée Parallélisation incrémentale Fondé sur le compilateur Extension aux langages de programmation existants (C/C++, Fortran) – Directives – Quelques procédures de bibliothèques • Supporte le parallélisme de données Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 3 Modèle d’exécution OpenMP • Modèle fork-join d’exécution parallèle • L’exécution commence avec un seul processus (thread maître) • Début d’une construction parallèle : le thread maître crée un ensemble de threads • Fin d’une construction parallèle. Les threads de l’ensemble se synchronise : barrière implicite • Seul le thread maître continue à s’exécuter Maîtrise Informatique 2003 Calcul parallèle Partie séquentielle Partie parallèle Partie séquentielle Partie parallèle Partie séquentielle D. Etiemble 4 2 Région parallèle OpenMP • Bloc de code à exécuter par plusieurs threads en parallèle. Chaque thread exécute le même code • Fortran – !$OMP PARALLEL [clause[[,]clause]…] – Bloc – !$OMP END PARALLEL • C/C++ – #pragma omp parallel [clause[clause]…] – Bloc structuré • Clause – private (list) – shared (list) – … Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 5 Construction parallèle OpenMP C/C++ #pragma omp parallel Bloc structuré /*omp end parallel*/ Fortran !$OMP PARALLEL Bloc !$OMP END PARALLEL Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 6 3 Clauses sur la portée des variables • private (liste) – Les variables de la liste appartiennent à chaque thread d’un ensemble (privées) • shared (liste) – Les variables de la liste sont partagées par tous les threads de l’ensemble • Par défaut, les variables sont partagées, mais – Les variables locales (pile) des sous programmes appelés sont privées – Les variables automatiques d’un bloc sont privées – La variable de contrôle de boucle du DO (fortran) et for (C) est privée Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 7 Fonctions de bibliothèque • Fonction omp_get_num_threads – Fournit le nombre de threads dans l’ensemble exécutant la région parallèle dans laquelle elle est appelée – C/C++ • int omp_get_num_threads(void); – Fortran • integer function omp_get_num_threads() • Fonction omp_get_thread_number – Fournit le numéro de thread à l’intérieur de l’ensemble, compris entre 0 et omp_get_num_threads()-1. Le thread maître a le numéro 0. – C/C++ • int omp_get_thread_num(void); – Fortran • integer function omp_get_thread_num() Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 8 4 Partage du travail et synchronisation • Quel thread exécute une instruction ou une opération ? • Et quand ? – Constructions de partage de travail – Constructions maître et synchronisation Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 9 Les constructions de partage du travail • Divisent l’exécution de la partie de code concernée entre les différents threads de l’ensemble • Doivent être incluses dynamiquement dans une région parallèle • Ne doivent pas créer de nouveaux threads • Pas de barrière implicite à l’entrée • Les directives – Les sections – Do (Fortran) – For (C/C++) Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 10 5 Les directives de section (C/C++) #pragma omp parallel { #pragma omp sections { a=…; b=…;} #pragma omp section c=…; d=…;} #pragma omp section e=…; f=…;} #pragma omp section g=…; h=…;} }/*omp end sections*/ }/*omp end parallel*/ Maîtrise Informatique 2003 Calcul parallèle a= c= e= g= b= d= f= h= 11 D. Etiemble Directive for (C/C++) #pragma omp parallel private(f) { f=7; #pragma omp for for (i=0;i<20;i++) a[i]=b[i]+f*(i+5); } /*omp end parallel*/ Maîtrise Informatique 2003 Calcul parallèle D. Etiemble f=7 f=7 f=7 f=7 i=0,4 i=5,9 i=10,14 i=15,19 a[i)=b[i] +… a[i)=b[i] +… a[i)=b[i] +… a[i)=b[i] +… 12 6 Directive for • La clause peut être l’une des suivantes – private (liste) – reduction (operator : liste) • Réalise une réduction sur les variables qui apparaissent dans la liste avec l’opérateur « operator » • En C/C++, les opérateurs sont : +, *, -, &, ^, |, &&, || • A la fin de la réduction, la variable partagée reflète le résultat de la combinaison de la valeur initiale de la variable partagée avec la valeur finale de chacune des copies privées en utilisant l’opérateur spécifié – schedule (type [,chunk]) • Spécifie comment les itérations de la boucle sont divisées parmi les threads – nowait (C/C++ sur #pragma omp for) • Barrière implicite à la fin du for, sauf si nowait est spécifié – Si nowait est spécifié, les threads ne se synchronisent pas à la fin de la boucle Maîtrise Informatique 2003 D. Etiemble Calcul parallèle 13 Synchronisation • Barrière implicite – Début et fin des constructions parallèles – Fin de toutes les autres constructions – La synchronisation implicite peut être supprimée par « nowait » • Explicite – Critical • Le code considéré est exécuté par tous les threads, mais seulement par un thread à la fois • C/C++ – #pragma omp critical [(name)] » Bloc structuré • Fortran – !$OMP CRITICAL [(name)] » Bloc – !$OMP END CRITICAL [(name)] Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 14 7 Section critique : un exemple (C/C++) mx=0 mx=0; #pragma omp parallel private (pmax) { pmax = 0; #pragma omp for private ( r ) for (i=0;i<20;i++) { r= travail(i); pmax =(r>pmax ? r : pmax); } /*end for*/ } /*omp end for*/ #pragma omp critical mx=(pmax>mx ? pmax : mx); /*omp end critical*/ }/*omp end parallel*/ pmax=0 pmax=0 pmax=0 pmax=0 i=0,4 i=5,9 i=10,14 i=15,19 r= r= r= r= pmax= pmax= pmax= pmax= mx= Maîtrise Informatique 2003 Calcul parallèle mx= D. Etiemble mx= mx= 15 Directive combinée parallel for • Raccourci pour spécifier une région parallèle qui contient une seule directive do/for • C/C++ – #pragma omp parallel for [clause [clause]…] • Boucle for • Fortran – !$ OMP PARALLEL DO [clause [[,]clause]…] • Boucle do – !$ OMP END PARALLEL DO • Cette directive a toutes les clauses de la directive parallèle et de la directive do/for sauf « nowait » Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 16 8 PI open MP : approche SPMD #include <omp.h> static long etapes = 100000; double pas; #define NB_THREADS 2 void main () { int i; double x, pi, sum[NB_THREADS]; pas = 1.0/(double) etapes; omp_set_num_threads(NB_THREADS) #pragma omp parallel { double x; int id; id = omp_get_thread_num(); for (i=id, sum[id]=0.0;i< etapes; i=i+NB_THREADS){ x = ((double)i+0.5)*pas; sum[id] += 4.0/(1.0+x*x); } } for(i=0, pi=0.0;i<NB_THREADS;i++) pi += sum[i] * pas; } Maîtrise Informatique 2003 Calcul parallèle Programmes SPMD : Chaque thread exécute le même code avec l’identificateur de thread spécifiant le travail spécifique du thread. D. Etiemble Program PI OpenMP: 17 Work sharing construct #include <omp.h> static long etapes = 100000; double pas; #define NB_THREADS 2 void main () { int i; double x, pi, sum[NB_THREADS]; pas = 1.0/(double) etapes; omp_set_num_threads(NB_THREADS) #pragma omp parallel { double x; int id; id = omp_get_thread_num(); sum[id] = 0; #pragma omp for for (i=0;i< etapes; i++){ x = ((double)i+0.5)*pas; sum[id] += 4.0/(1.0+x*x); } } for(i=0, pi=0.0;i<NB_THREADS;i++) pi += sum[i] * pas; } Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 18 9 Programme PI OpenMP: clause privée et section critique #include <omp.h> static long etapes = 100000; double pas; #define NB_THREADS 2 void main () { int i; double x, sum, pi=0.0; pas = 1.0/(double) etapes; omp_set_num_threads(NB_THREADS) #pragma omp parallel private (x, sum) { id = omp_get_thread_num(); for (i=id,sum=0.0;i< etapes;i=i+NB_THREADS){ x = ((double)i+0.5)*pas; sum += 4.0/(1.0+x*x); } #pragma omp critical pi += sum } } Maîtrise Informatique 2003 D. Etiemble Calcul parallèle Programme PI OpenMP : 19 For parallèle + réduction #include <omp.h> static long etapes = 100000; double pas; #define NB_THREADS 2 void main () { int i; double x, pi, sum = 0.0; pas = 1.0/(double) etapes; omp_set_num_threads(NB_THREADS) #pragma omp parallel for reduction(+:sum) private(x) for (i=1;i<= etapes; i++){ x = ((double)i-0.5)*pas; sum = sum + 4.0/(1.0+x*x); } pi = pas * sum; } OpenMP ajoute 2 à 4 lignes de code Maîtrise Informatique 2003 Calcul parallèle D. Etiemble 20 10