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ść?

Author: BR123, 2012-11-05

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.

 36
Author: Hristo Iliev,
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