Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
'var' : OpenMP 'for' döngüsünün dizin değişkeni döngü gövdesinde değiştirilemez
Açıklamalar
OpenMP for döngüsü, döngünün gövdesindeki for dizini (döngü sayacı) değiştiremeyebilir.
Örnekler
Aşağıdaki örnek C3020 oluşturur:
// 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++;
}
}
lastprivate ile bildirilen bir değişken paralelleştirilmiş döngü içinde dizin olarak kullanılamaz.
Aşağıdaki örnek ikinci lastprivate için C3020 verir çünkü bu lastprivate en dıştaki for döngüsünde idx_a bir yazma tetikler. İlk lastprivate hata vermez çünkü bu lastprivate, en dıştaki for döngüsünün dışındaki idx_a bir yazma işlemi tetikler (teknik olarak, son yinelemenin en sonunda). Aşağıdaki örnek C3020 oluşturur.
// 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;
}
}
}
Aşağıdaki örnekte olası bir çözüm gösterilmektedir:
// 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;
}
}
}