Udostępnij za pośrednictwem


D. Za pomocą klauzuli harmonogramu

Równoległe region ma co najmniej jeden barierę na jego końcu i mogą mieć dodatkowe bariery.Na każdej bariery innych członków zespołu należy poczekać na ostatni wątek dotrzeć.Aby zminimalizować czas oczekiwania, powinny być rozdzielone udostępniony pracy tak, aby wszystkie wątki przybyć do przegrody w tym samym czasie.Jeśli niektóre udostępniony pracy jest zawarty w do konstrukcje, schedule klauzula może służyć do tego celu.

Gdy istnieją odwołania powtarzających się te same obiekty, wybór harmonogramu dla dla konstrukcji, mogą być określone przede wszystkim przez właściwości systemu pamięci, takich jak obecność i rozmiar pamięci podręcznej oraz czy czasy dostępu do pamięci są jednolite lub niejednorodnej.Takie rozważania może uczynić bardziej pożądane posiadanie każdego wątku konsekwentnie odnoszą się do tego samego zestawu elementów tablicy w serii pętli, nawet jeśli niektóre wątki są przypisywane stosunkowo mniej pracy w niektórych pętli.Można to zrobić za pomocą statyczne harmonogram, z tym samym granice dla wszystkich pętli.W poniższym przykładzie, należy zauważyć, że zostanie użyta wartość zero jako dolną granicą w drugiej pętli, mimo że k byłyby bardziej naturalne harmonogramem nie były ważne.

#pragma omp parallel
{
#pragma omp for schedule(static)
  for(i=0; i<n; i++)
    a[i] = work1(i);
#pragma omp for schedule(static)
  for(i=0; i<n; i++)
    if(i>=k) a[i] += work2(i);
}

W pozostałych przykładach, zakłada się że pamięć dostępu nie jest dominujący i, o ile nie stwierdzono inaczej, że wszystkie wątki otrzymać porównywalne zasobów obliczeniowych.W takich przypadkach wybór harmonogramu dla dla konstrukcji zależy od wszystkich prac udostępnionego, który ma być wykonywana między najbliższą poprzedzającą barierę oraz barierę dorozumianych zamknięcia lub najbliższego kolejnych bariery, jeśli istnieje nowait klauzuli.Dla każdego rodzaju harmonogramu krótki przykład pokazuje, jak tego rodzaju harmonogram jest prawdopodobnie najlepszym wyborem.Krótkie omówienie zgodna z każdym przykładzie.

Statyczne harmonogramu jest również właściwa w najprostszym przypadku, zawierających pojedynczy region równoległych dla skonstruować przy każdej iteracji, wymagających tej samej ilości pracy.

#pragma omp parallel for schedule(static)
for(i=0; i<n; i++) {
  invariant_amount_of_work(i);
}

Statyczne harmonogramu jest określony przez właściwości, że każdy wątek otrzymuje około tej samej liczby iteracji jako inny wątek, a każdy wątek niezależnie ustalić iteracji, przypisane do niego.Dlatego synchronizacja nie jest wymagane do dystrybucji prac i przy założeniu, że każda iteracja wymaga tej samej ilości pracy, wszystkie wątki powinien zostać zakończony na tym samym czasie.

Dla zespołu z p wątków, Niech ceiling(n/p) być liczba całkowita q, który spełnia n = p * q - r z 0 < = r < p.Jedną z implementacji statyczne harmonogramu dla zostałyby przypisane w tym przykładzie q iteracji do pierwszego p–1 wątków, i q r iteracji, aby ostatni wątek.Inna implementacja dopuszczalne zostałyby przypisane q iteracji do pierwszego p r wątków, i q-1 iteracji, aby pozostałe r wątków.Ilustruje to, dlaczego program nie powinny polegać na szczegóły dotyczące konkretnej implementacji.

Dynamiczne harmonogramu jest właściwe w przypadku dla konstruowania z iteracji, wymagające różne lub nawet nieprzewidywalne ilości pracy.

#pragma omp parallel for schedule(dynamic)
  for(i=0; i<n; i++) {
    unpredictable_amount_of_work(i);
}

Dynamiczne harmonogramu jest określony przez właściwość, że żaden wątek oczekuje na bariery dla trwa dłużej niż innemu wątkowi na wykonanie jego ostatecznego iteracji.Wymaga to, że iteracji przypisany jeden jednocześnie do wątków staną się one dostępne z synchronizacji dla każdego przydziału.Obciążenie synchronizacji można zmniejszyć, określając rozmiar minimalny fragmentu k większy niż 1, tak aby wątki są przypisywane k w czasie, dopóki nie mniej niż k pozostają.Gwarantuje to, że żaden wątek czeka na dłużej, niż zajmuje innego wątku i wykonania jej fragment końcowego (co najwyżej) barierę k iteracji.

Dynamiczne harmonogram może być przydatne w przypadku wątków otrzymywać różnych zasobów, który ma znacznie taki sam efekt jak zmiennych ilości pracy dla poszczególnych iteracji.Podobnie, dynamiczny harmonogram również może być przydatne, jeśli wątki przybyć dla skonstruować w różnym czasie, chociaż w niektórych przypadkach te z przewodnikiem harmonogram może być pożądane.

Z przewodnikiem harmonogramu jest właściwe w przypadku, w którym wątki mogą przybywają w różnym czasie w do konstruowania z każdej iteracji wymagające o tej samej ilości pracy.Może się to zdarzyć, jeśli, na przykład, dla konstrukcji jest poprzedzony przez jedną lub więcej sekcji lub do konstrukcje z nowait klauzul.

#pragma omp parallel
{
  #pragma omp sections nowait
  {
    // ...
  }
  #pragma omp for schedule(guided)
  for(i=0; i<n; i++) {
    invariant_amount_of_work(i);
  }
}

Podobnie jak dynamiczne, z przewodnikiem zaplanować gwarancje, które żaden wątek oczekuje na barierę dłużej, niż zajmuje innemu wątkowi na wykonanie jego ostatecznego iteracji lub końcowe k iteracji, jeśli rozmiar segmentu z k jest określony.Wśród takich rozkładów z przewodnikiem harmonogramu jest określony przez właściwość wymaga najmniejszą liczbą synchronizacji.Rozmiar fragmentu k, przypisze typowe wdrożenia q = ceiling(n/p) iteracji, aby pierwszy wątek dostępne, ustaw n do większej z n-q i p * ki powtarzaj aż do iteracji wszystkich są przypisane.

Gdy wybór optymalnego harmonogramu nie jest jasne, jak te przykłady, runtime harmonogramu jest wygodne do eksperymentowania z różnymi harmonogramami i rozmiary fragmencie bez konieczności modyfikowania i ponownie skompilować program.Może również być użyteczne przy harmonogramu optymalną zależy (w sposób przewidywalny) danych wejściowych, do którego stosuje się program.

Aby zobaczyć przykład kompromisów między różnymi harmonogramami, należy rozważyć udostępnianie 1000 iteracji między 8 wątków.Załóżmy, że jest niezmienny ilość pracy w każdej iteracji i użyć jej jako jednostki czasu.

Jeśli wszystkie wątki uruchamia się w tym samym czasie, statyczne konstrukcję, wykonanie 125 z w jednostkach, synchronizacja nie spowoduje, że harmonogram.Ale Załóżmy, że jeden wątek wynosi 100 sztuk późno w celu uzyskania.Następnie pozostałe wątki siedmiu oczekiwania dla 100 jednostek na przegrody i czas realizacji całego konstrukcja wzrasta do 225.

Ponieważ zarówno dynamiczne i z przewodnikiem harmonogramy zapewnienia, że żaden wątek oczekuje na więcej niż jednej jednostki na przegrody, opóźnione wątku powoduje, że ich czasów wykonania dla konstrukcji wzrastał tylko do jednostek 138, ewentualnie wzrosła opóźnienia z synchronizacji.Jeśli opóźnienia nie są nieistotne, staje się ważne, że liczba synchronizacje wynosi 1000 dla dynamiczne , ale tylko 41 dla z przewodnikiem, przy założeniu domyślny rozmiar fragmentu jednego.Rozmiar fragmentu 25 dynamiczne i z przewodnikiem zarówno zakończenia w 150 jednostek plus wszelkie opóźnienia od synchronizacje wymagane, którego numer teraz tylko 40 i 20, odpowiednio.