Compartir a través de


Error del compilador C3020

'variable': la variable de índice del bucle 'for' de OpenMP no se puede modificar en el cuerpo del bucle

Es posible que un bucle for de OpenMP no modifique el índice (contador de bucles) en el cuerpo del bucle for.

El ejemplo siguiente genera el error 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++;
   }
}

Una variable declarada con lastprivate no se puede usar como índice dentro de un bucle paralelizado.

El ejemplo siguiente produce el error C3020 para el segundo lastprivate, porque ese lastprivate desencadena una operación de escritura en idx_a dentro del bucle for más externo. El primer valor lastprivate no da error porque ese lastprivate desencadena una operación de escritura en idx_a fuera del bucle for más externo (técnicamente, al final de la última iteración). El ejemplo siguiente genera el error 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;
      }
   }
}

En el ejemplo siguiente se muestra una posible solución:

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