2011-01-06 5 views
5

W funkcji składowej, mogę parallelize korzystania z udostępnionego zmienną składową int *x jak tenDlaczego zmienna składowa klasy x nie może być współużytkowana (x) w OpenMP?

#pragma omp parallel for default(shared) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

Ale jeśli próbuję

#pragma omp parallel for default(none) shared(x,size) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

pojawia się błąd: 'obj::x' is not a variable in clause 'shared'. Wolę drugą wersję, ponieważ ogłasza zmienne współdzielone, z którymi pracuje, przypominając mi, że nie ma warunków wyścigu lub podobnych problemów.

Co się dzieje, że OpenMP twierdzi, że obj::x nie jest zmienną?

+0

Czy próbowałeś tego-> x? także jakiego kompilatora używasz? – Beanz

+0

kompilatorem jest g ++ 4.4. Próbuję '#pragma omp równolegle dla domyślnego (none) shared (this-> x, size)' daje błąd 'error: expected unqualified-id before 'this'' –

Odpowiedz

11

Większość implementacje OpenMP zarys regionu równoległego. Oznacza to, że sprawiają, że jest to funkcja. Zmienne prywatne są zwykle przekazywane do tej funkcji, a współużytkowane zmienne mogą być przekazywane lub znajdować się w zakresie funkcji. Problem z członkami danych klas jest taki, że nie są one takie same jak zmienne.

Gdy kompilator obrysowuje region równoległy, zmienne mają zdefiniowane miejsca przechowywania, które kompilator może skonfigurować w celu przejścia do funkcji. Elementy danych nie mogą być tworzone (tzn. Przydzielane pamięci) do czasu wywołania klasy podczas wykonywania programu. Oznacza to, że kompilator nie może samodzielnie sprywatyzować elementów danych. Musiałoby to również zostać wykonane w środowisku wykonawczym, co spowodowałoby znacznie więcej pracy i wpłynęłoby na wydajność zarówno programów szeregowych, jak i równoległych. Do tej pory żadna implementacja nie próbowała wykonać tej pracy, a ponieważ specyfikacja OpenMP jest napisana w drodze konsensusu, podjęto decyzję, aby uniemożliwić członkom danych we wszystkich klauzulach. W przeciwnym razie wydawało się zbyt mylące, aby powiedzieć, że są one dozwolone we wspólnych klauzulach, ale żadnych innych klauzul.

1

nie wiem precisiely - ale spójrz przez 32 OpenMP traps for C++ developers do sortowania przez większość OpenMP problemy

+1

Dzięki za link! –

+0

Nie znalazłem żadnego odniesienia do mojego pytania w połączonym dokumencie. Czy mógłbyś to sprecyzować? –

+0

Przepraszam, nie mam dokładnej odpowiedzi, miałem nadzieję, że w linku znajdzie się coś, co ci pomoże –

Powiązane problemy