A.19 Exemples illustrant l'imbrication incorrecte de directives de partage de travail
Les exemples de cette section indiquent les règles directives d'imbrication. Pour plus d'informations sur l'imbrication directive, consultez section 2,9 à la page 33.
L'exemple suivant n'est pas conforme parce que les directives internes et externes d' for sont imbriquées et les sont liés à la même directive d' parallel :
void wrong1(int n)
{
#pragma omp parallel default(shared)
{
int i, j;
#pragma omp for
for (i=0; i<n; i++) {
#pragma omp for
for (j=0; j<n; j++)
work(i, j);
}
}
}
la version dynamiquement imbriquée suivante de l'exemple précédent est également non conforme :
void wrong2(int n)
{
#pragma omp parallel default(shared)
{
int i;
#pragma omp for
for (i=0; i<n; i++)
work1(i, n);
}
}
void work1(int i, int n)
{
int j;
#pragma omp for
for (j=0; j<n; j++)
work2(i, j);
}
L'exemple suivant n'est pas conforme parce que les directives d' for et d' single sont imbriquées, et ils sont liés à la même zone parallèle :
void wrong3(int n)
{
#pragma omp parallel default(shared)
{
int i;
#pragma omp for
for (i=0; i<n; i++) {
#pragma omp single
work(i);
}
}
}
L'exemple suivant n'est pas conforme parce qu'une directive d' barrier à l'intérieur de for peut provoquer l'interblocage :
void wrong4(int n)
{
#pragma omp parallel default(shared)
{
int i;
#pragma omp for
for (i=0; i<n; i++) {
work1(i);
#pragma omp barrier
work2(i);
}
}
}
L'exemple suivant n'est pas conforme parce qu' barrier provoque l'interblocage lié au fait qu'un seul thread à la fois peut écrire la section critique :
void wrong5()
{
#pragma omp parallel
{
#pragma omp critical
{
work1();
#pragma omp barrier
work2();
}
}
}
L'exemple suivant n'est pas conforme parce qu' barrier provoque l'interblocage lié au fait qu'un seul thread s'exécute la section d' single :
void wrong6()
{
#pragma omp parallel
{
setup();
#pragma omp single
{
work1();
#pragma omp barrier
work2();
}
finish();
}
}