2011-12-12 13 views
6

Mam program OpenMP z C++. Istnieją równoległe regiony, które zawierają #pragma omp task wewnątrz równoległego regionu. Teraz chciałbym wiedzieć, jak zakończyć równoległy region, w zależności od warunku, w którym spotykają się jakiekolwiek działające wątki.Jak warunkowo zakończyć równoległy region w OpenMP?

#pragma omp parallel 
{ 
#pragma omp task 
{ 
    //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region) 
} 

} 

Odpowiedz

5

Nie można zakończyć przedwcześnie budowy równoległej. OpenMP nie ma na to żadnego rozwiązania i określa, że ​​regiony równoległe mogą mieć tylko jeden punkt wyjścia (więc nie ma rozgałęzień poza regionem ...).

Myślę, że jedynym (rozsądnym i przenośnym) sposobem osiągnięcia tego jest posiadanie zmiennej, która wskazuje, czy praca została zakończona i czy wątki regularnie sprawdzają tę zmienną (używając instrukcji atomowych i/lub spłukiwania w celu zapewnienia poprawnej widoczności) . Jeśli zmienna wskazuje, że praca jest wykonana, wątki mogą pominąć pozostałą pracę (umieszczając pozostałą pracę w treści, do której nie jest rozgałęziony, jeśli praca jest wykonana).

Możliwe jest napisanie kodu specyficznego dla systemu, który zawiesza inne wątki i ustawia je na końcu bloku (np. Manipulując stosem i wskazówkami instrukcji ...), ale nie wydaje się to zbyt wskazane (co oznacza, że ​​prawdopodobnie bardzo kruche).

Jeśli powiesz nam nieco więcej o tym, co próbujesz zrobić (i dlaczego tego potrzebujesz), łatwiej będzie ci pomóc (np. Poprzez stworzenie projektu, który nie musi tego robić) .