Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"var" : az OpenMP "for" ciklus indexváltozója nem módosítható a hurok törzsében
Megjegyzések
Az OpenMP-hurkok for nem módosíthatják az indexet (hurokszámlálót) a for hurok törzsében.
Példák
A következő példa c3020-at hoz létre:
// 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++;
}
}
A lastprivate-tal deklarált változó nem használható indexként egy párhuzamos hurkon belül.
Az alábbi példa c3020-at ad a második lastprivate-hoz, mert ez a lastprivate elindít egy írást idx_a a legkülső cikluson belül. Az első lastprivate nem ad hibát, mert a lastprivate egy írást indít el a legkülsőn kívüli idx_a ciklushoz (gyakorlatilag az utolsó iteráció végén). Az alábbi példa c3020-at hoz létre.
// 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;
}
}
}
Az alábbi példa egy lehetséges megoldást mutat be:
// 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;
}
}
}