Outils pour utilisateurs

Outils du site


lang:cpp:openmp

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);

SIMD Vectorization with OpenMP Archive du 09/03/2019

lang/cpp/openmp.1552116747.txt.gz · Dernière modification : 2019/03/09 08:32 de root