다음을 통해 공유


컴파일러 오류 C3020

'var': OpenMP 'for' 루프의 인덱스 변수는 루프 본문에서 수정할 수 없습니다.

OpenMP for 루프는 루프 본문 for 의 인덱스(루프 카운터)를 수정할 수 없습니다.

다음 샘플에서는 C3020을 생성합니다.

// C3020.cpp
// compile with: /openmp
int main() {
   int i = 0, n = 3;

   #pragma omp parallel
   {
      #pragma omp for
      for (i = 0; i < 10; i += n)
         i *= 2;   // C3020
         // try the following line instead
         // n++;
   }
}

lastprivate선언된 변수는 병렬 처리된 루프 내의 인덱스로 사용할 수 없습니다.

다음 샘플에서는 두 번째 lastprivate에 대해 C3020을 제공합니다. 왜냐하면 lastprivate는 가장 바깥쪽 for 루프 내에서 idx_a 쓰기를 트리거하기 때문입니다. 첫 번째 lastprivate는 루프의 가장 바깥쪽 외부에 idx_a 쓰기를 트리거하기 때문에 오류를 제공하지 않습니다(기술적으로 마지막 반복의 맨 끝에 있음). 다음 샘플에서는 C3020을 생성합니다.

// C3020b.cpp
// compile with: /openmp /c
float a[100][100];
int idx_a, idx_b;
void test(int first, int last)
{
   #pragma omp parallel for lastprivate(idx_a)
   for (idx_a = first; idx_a <= last; ++idx_a) {
      #pragma omp parallel for lastprivate(idx_a)   // C3020
      for (idx_b = first; idx_b <= last; ++idx_b) {
         a[idx_a][idx_b] += 1.0f;
      }
   }
}

다음 샘플에는 가능한 해결 방법을 보여 줍니다.

// C3020c.cpp
// compile with: /openmp /c
float a[100][100];
int idx_a, idx_b;
void test(int first, int last)
{
   #pragma omp parallel for lastprivate(idx_a)
   for (idx_a = first; idx_a <= last; ++idx_a) {
      #pragma omp parallel for lastprivate(idx_b)
      for (idx_b = first; idx_b <= last; ++idx_b) {
         a[idx_a][idx_b] += 1.0f;
      }
   }
}