Delen via


Compilerfout C3020

'var' : indexvariabele van OpenMP for-lus kan niet worden gewijzigd in de body van de lus

Opmerkingen

Een OpenMP-lus for mag de index (lusteller) in de structuur van de for lus niet wijzigen.

Voorbeelden

In het volgende voorbeeld wordt C3020 gegenereerd:

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

Een variabele die is gedeclareerd met lastprivate , kan niet worden gebruikt als de index binnen een geparallelliseerde lus.

In het volgende voorbeeld wordt C3020 voor de op één na laatste lastprivate weergegeven, omdat die lastprivate een schrijfoperatie naar idx_a binnen de buitenste for-lus teweegbrengt. De eerste lastprivate geeft geen fout omdat deze lastprivate een schrijfbewerking activeert naar idx_a buiten de buitenste lus (technisch gezien aan het einde van de laatste iteratie). In het volgende voorbeeld wordt C3020 gegenereerd.

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

In het volgende voorbeeld ziet u een mogelijke oplossing:

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