Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
'var': Indexvariable der OpenMP-Schleife 'for' kann nicht im Schleifentext geändert werden.
Eine OpenMP-Schleife for
kann den Index (Schleifenzähler) im Textkörper der for
Schleife nicht ändern.
Im folgenden Beispiel wird C3020 generiert:
// 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++;
}
}
Eine variable, die mit lastprivate deklariert ist, kann nicht als Index innerhalb einer parallelisierten Schleife verwendet werden.
Im folgenden Beispiel wird C3020 für den zweiten lastprivate-Code übergeben, da dieser lastprivate einen Schreibvorgang in idx_a innerhalb der äußersten Schleife auslöst. Der erste lastprivate gibt keinen Fehler zurück, da dieser lastprivate einen Schreibvorgang in idx_a außerhalb der äußersten Schleife auslöst (technisch, am Ende der letzten Iteration). Im folgenden Beispiel wird C3020 generiert.
// 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;
}
}
}
Das folgende Beispiel zeigt eine mögliche Lösung:
// 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;
}
}
}