Jak działa klauzula o zamówieniu omp?
vector<int> v;
#pragma omp parallel for ordered schedule(dynamic, anyChunkSizeGreaterThan1)
for (int i = 0; i < n; ++i){
...
...
...
#pragma omp ordered
v.push_back(i);
}
To wypełnia {[1] } listą uporządkowaną o rozmiarze n
.
Po osiągnięciu bloku omp ordered
wszystkie wątki muszą czekać na zakończenie możliwie najniższej iteracji, ale co jeśli żaden z wątków nie został wyznaczony do tej konkretnej iteracji? Czy biblioteka uruchomieniowa OpenMP zawsze upewnia się, że najniższa iteracja jest obsługiwana przez jakiś wątek?
Również dlaczego sugeruje się użycie klauzuli ordered
wraz z dynamic schedule
? Czy static schedule
wpłynie na wydajność?
1 answers
Klauzula ordered
działa w ten sposób: różne wątki wykonują się jednocześnie, dopóki nie napotkają regionu ordered
, który jest następnie wykonywany kolejno w tej samej kolejności, w jakiej zostanie wykonany w pętli szeregowej. To nadal pozwala na pewien stopień współbieżności, zwłaszcza jeśli sekcja kodu poza regionem ordered
ma znaczny czas działania.
Nie ma szczególnego powodu, aby używać dynamic
harmonogramu zamiast static
harmonogramu o małym rozmiarze. Wszystko zależy od struktury kod. Ponieważ ordered
wprowadza zależność pomiędzy wątkami, jeśli jest używana z {[8] } z domyślnym rozmiarem kawałka, drugi wątek musiałby czekać na pierwszy z nich, aby zakończyć wszystkie iteracje, trzeci wątek musiałby czekać na drugi z nich, aby zakończyć swoje iteracje (i tym samym również dla pierwszego), i tak dalej. Można go łatwo wizualizować za pomocą 3 wątków i 9 iteracji (3 na wątek):
tid List of Timeline
iterations
0 0,1,2 ==o==o==o
1 3,4,5 ==.......o==o==o
2 6,7,8 ==..............o==o==o
=
pokazuje, że wątek wykonuje kod równolegle. o
jest wtedy, gdy thread wykonuje region ordered
. .
jest wątkiem bezczynnym, czekającym na swoją kolej, aby wykonać region ordered
. Z schedule(static,1)
następowałoby:
tid List of Timeline
iterations
0 0,3,6 ==o==o==o
1 1,4,7 ==.o==o==o
2 2,5,8 ==..o==o==o
Uważam, że różnica w obu przypadkach jest więcej niż oczywista. Z schedule(dynamic)
powyższe zdjęcia staną się mniej lub bardziej przypadkowe, ponieważ lista iteracji przypisanych do każdego wątku nie jest deterministyczna. Dodałoby to również dodatkowe koszty ogólne. Jest to przydatne tylko wtedy, gdy ilość obliczeń jest inna dla każdej iteracji obliczenia zajmują znacznie więcej czasu niż dodatkowe koszty związane z wykorzystaniem dynamicznego planowania.
Nie martw się o najniższą liczbę iteracji. Zwykle jest obsługiwany do pierwszego wątku w zespole, aby stać się gotowym do wykonania kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 14:00:44