Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
'var': variabile di indice del ciclo 'for' OpenMP non può essere modificata nel corpo del ciclo
Osservazioni:
Un ciclo OpenMP for potrebbe non modificare l'indice (contatore del ciclo) nel corpo del for ciclo.
Esempi
L'esempio seguente genera l'errore 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 variabile dichiarata con lastprivate non può essere utilizzata come indice all'interno di un ciclo parallelizzato.
L'esempio seguente restituisce C3020 per il secondo lastprivate perché lastprivate attiverà una scrittura in idx_a all'interno del ciclo for più esterno. Il primo lastprivate non restituisce un errore perché lastprivate attiva una scrittura in idx_a all'esterno del ciclo for più esterno (tecnicamente, alla fine dell'ultima iterazione). L'esempio seguente genera l'errore 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'esempio seguente illustra una possibile risoluzione:
// 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;
}
}
}