A.19 esempi che illustrano annidamento non corretto delle direttive di suddivisione del lavoro

Gli esempi di questa sezione vengono illustrate le regole direttive di annidamento.Per ulteriori informazioni sull'annidamento la direttiva, vedere parte 2,9 nella pagina 33.

Nell'esempio non è conforme perché l'interno e esterno for le direttive sono annidate e vincolano gli stessi parallel direttiva:

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 versione seguente dinamicamente annidata esempio precedente viene inoltre non compatibile:

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

Nell'esempio non è conforme perché for e single le direttive sono annidate e sono associati alla stessa area parallela:

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

Nell'esempio non è conforme perché barrier direttiva in un oggetto for può provocare un deadlock:

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

Nell'esempio non è conforme perché barrier risultati in deadlock dovuto al fatto che un solo thread alla volta possibile attivare la sezione critica:

void wrong5()
{
  #pragma omp parallel
  {
    #pragma omp critical
    {
       work1();
       #pragma omp barrier
       work2();
    }
  }
}

Nell'esempio non è conforme perché barrier risultati in deadlock dovuto al fatto che solo un thread esegue single sezione:

void wrong6()
{
  #pragma omp parallel
  {
    setup();
    #pragma omp single
    {
      work1();
      #pragma omp barrier
      work2();
    }
    finish();
  }
}