Partager via


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