Partilhar via


A.19 Exemplos que mostram o aninhamento incorreto de diretivas de compartilhamento do trabalho

Os exemplos nesta seção ilustram as regras de diretivas de aninhamento. Para obter mais informações sobre o aninhamento de diretiva, consulte seção 2,9 na página 33.

O exemplo a seguir é incompatível porque internas e externas for diretivas estão aninhadas e ligar para o mesmo parallel diretiva:

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

A seguinte versão dinamicamente aninhada do exemplo anterior também é incompatível:

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

O exemplo a seguir é incompatível porque a for e single diretivas estão aninhadas e eles ligam para a mesma região paralela:

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

O exemplo a seguir é incompatível porque um barrier diretiva dentro de um for pode resultar em um 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);
      }
  }
}

O exemplo a seguir é incompatível porque a barrier resulta em deadlock devido ao fato de que apenas um thread por vez pode inserir a seção crítica:

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

O exemplo a seguir é incompatível porque a barrier resulta em deadlock devido ao fato de que apenas um segmento executa o single seção:

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