Udostępnij za pośrednictwem


Przykłady A.19 pokazujące niepoprawne zagnieżdżanie dyrektyw podziału pracy

Przykłady w tej części ilustrują dyrektywa zasady zagnieżdżenia.Aby uzyskać więcej informacji na zagnieżdżanie w dyrektywie, zobacz 2.9 sekcji na stronie 33.

Poniższy przykład jest niezgodnych ponieważ wewnętrzne i zewnętrzne for dyrektyw są zagnieżdżone i powiązać to samo parallel dyrektywę:

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

Niezgodne jest również następujące dynamicznie zagnieżdżonych wersja poprzedniego przykładu:

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

Poniższy przykład jest niezgodnych ponieważ for i single dyrektyw są zagnieżdżone i powiązać tego samego regionu równoległy:

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

Poniższy przykład jest niezgodnych ponieważ barrier dyrektywa wewnątrz for może powodować zakleszczenie:

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

Poniższy przykład jest niezgodnych ponieważ barrier skutkuje zakleszczenia, ze względu na fakt, że tylko jeden wątek na raz można wprowadzić sekcji krytycznej:

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

Poniższy przykład jest niezgodnych ponieważ barrier skutkuje zakleszczenia, ze względu na fakt, że tylko jeden wątek wykonuje single sekcji:

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