다음을 통해 공유


A.19 작업 공유 지시문의 잘못된 중첩을 보여 주는 예제

중첩 지시문 규칙을 설명 하는이 절에 있는 예제입니다. 중첩 지시문에 대 한 자세한 내용은 2.9 절 33 페이지에 있습니다.

다음 예제에서는 정책을 준수 하지 않는 것 때문에 내부 및 외부 for 지시문에 중첩 된 및 동일한 바인딩 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);
     }
   }
}

또한 다음 동적으로 중첩 된 버전은 위의 예제 정책 위반입니다.

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

다음 예제에서는 정책을 준수 하지 않는 것 때문에 for 및 single 지시문을 중첩 하 고 같은 병렬 영역에 바인딩할.

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

다음은 정책을 준수 하지 않는 것 때문에 barrier 지시문 내에 for 교착 상태가 발생할 수 있습니다.

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

다음은 정책을 준수 하지 않는 것 때문에 barrier 한 번에 하나의 스레드가 임계 섹션에 들어갈 수 있습니다 때문에 교착 상태가 발생 합니다.

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

다음 예제에서는 정책을 준수 하지 않는 것 때문에 barrier 하나의 스레드로 실행 때문에 교착 상태가 발생의 single 섹션:

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