Erreur du compilateur C3020
'var' : la variable d’index de la boucle OpenMP 'for' ne peut pas être modifiée dans le corps de la boucle
Une boucle OpenMP for
peut ne pas modifier l’index (compteur de boucles) dans le corps de la for
boucle.
L’exemple suivant génère l’erreur 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++;
}
}
Une variable déclarée avec lastprivate ne peut pas être utilisée comme index à l’intérieur d’une boucle parallélisée.
L’exemple suivant donne l’erreur C3020 pour le deuxième dernierprivate, car ce dernierprivate déclenche une écriture sur idx_a dans la boucle la plus externe. Le premier lastprivate ne génère pas d’erreur, car ce dernierprivate déclenche une écriture pour idx_a en dehors de la boucle la plus externe (techniquement, à la fin de la dernière itération). L’exemple suivant génère l’erreur 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;
}
}
}
L’exemple suivant illustre une résolution possible :
// 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;
}
}
}