Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Var: indexvariabeln för OpenMP -loopen "for" kan inte ändras i looptexten
Anmärkningar
En OpenMP-loop for kanske inte ändrar indexet (loopräknaren) i loopens for brödtext.
Examples
I följande exempel genereras 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++;
}
}
En variabel som deklareras med lastprivate kan inte användas som index i en parallelliserad loop.
Följande exempel ger C3020 för den näst sista lastprivate eftersom den sista lastprivate utlöser en skrivning till idx_a i den yttersta for-loopen. Den första lastprivaten ger inget fel eftersom denna lastprivate utlöser en skrivning till idx_a utanför den yttersta for-loopen (tekniskt sett i slutet av den sista iterationen). I följande exempel genereras 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;
}
}
}
I följande exempel visas en möjlig lösning:
// 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;
}
}
}