Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
'var' : variável de índice do OpenMP 'for' loop não pode ser modificado no corpo do loop
Observações
Um loop OpenMP for não pode modificar o índice (contador de loop) no corpo do for loop.
Examples
O exemplo a seguir gera 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++;
}
}
Uma variável declarada com lastprivate não pode ser usada como o índice dentro de um loop paralelo.
O exemplo a seguir dará C3020 para o segundo lastprivate porque esse lastprivate acionará uma gravação para idx_a dentro do loop externo for. O primeiro lastprivate não dá um erro porque esse lastprivate dispara uma gravação para idx_a fora do loop externo (tecnicamente, no final da última iteração). O exemplo a seguir gera 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;
}
}
}
O exemplo a seguir demonstra uma possível resolução:
// 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;
}
}
}