컴파일러 오류 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;
}
}
}