Freigeben über


A.19 Beispiele für falsche Schachtelungen von Arbeitsteilungsdirektiven

Die Beispiele in diesem Abschnitt veranschaulichen die Schachtelungs Directive.Weitere Informationen zu richtungweisende Schachtelung finden Sie unter Abschnitt 2.9 auf Seite 33.

Im folgenden Beispiel ist inkompatibel, da die inneren und äußeren for-Direktive geschachtelt und demselben parallel die Direktive verbindlich sind für sind:

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

Die folgende dynamisch geschachtelte Version des obigen Beispiel ist auch nicht kompatibel:

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

Im folgenden Beispiel ist inkompatibel, da die for und single-Direktive geschachtelt sind, und binden sie an denselben parallelen Bereich:

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

Im folgenden Beispiel ist inkompatibel, da barrier-Direktive in for Deadlock führen kann:

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

Im folgenden Beispiel ist inkompatibel, da aufgrund eines Deadlocks barrier Fakten führt, dass nur ein Thread in den kritischen Abschnitt gleichzeitig eingegeben werden kann:

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

Im folgenden Beispiel ist inkompatibel, da aufgrund eines Deadlocks barrier Fakten, das nur ein Thread den single-Abschnitt beschrieben:

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