Ceci est une ancienne révision du document !
Compilateur
Pour activer l'option : -openmp
pour GCC
, /openmp
pour Visual Studio (Projet
|Propriétés
|C/C++
|Langage
|Prise en charge de OpenMP
).
OpenMP Application Programming Interface (Norme OpenMP v4.5) Archive du 09/03/2019
Guide into OpenMP: Easy multithreading programming for C++ Archive du 09/03/2019
Pragma
#pragma omp for
Doit être placé juste avant une boucle for
.
La boucle va être décomposée en n blocs (n étant le nombre de threads du CPU). L'ordre d'exécution des blocs est séquentiel car l'instruction ne précise pas l'exécution en parallèle.
#pragma omp for for (int n = 0; n < 10; ++n) printf(" %d", n);
#pragma omp parallel
Doit être placé juste avant un bloc {}
.
#pragma omp parallel { for (int64_t i = 0; i < 4000000000; i++) {} }
Le code va s'exécute en parallèle. Avec cette seule instruction, la boucle for est exécutée 8*4000000000.
#pragma omp parallel for
Doit être placé juste avant une boucle for
.
Là, la boucle est découpée et exécutée en parallèle, ce qui est le but recherché.
#pragma omp parallel for for (int64_t i = 0; i < 4000000000; i++) {}
C'est l'équivalent au code ci-dessous :
#pragma omp parallel { #pragma omp for for (int64_t i = 0; i < 4000000000; i++) {} }
#pragma omp simd
Cela parallélise les instructions de calcul pour utiliser au mieux les SSE* et autres. On peut autant y faire des calculs flottants qu'en entier. Le fonctionnement est similaire aux calculs CUDA :
#pragma omp simd for(int n=0; n<size; ++n) sinTable[n] = std::sin(2 * M_PI * n / size);