Wyklad 11 Języki programowania równoległego



Podobne dokumenty
Przetwarzanie Równoległe i Rozproszone

OpenMP. Programowanie aplikacji równoległych i rozproszonych. Wykład 2. Model programowania. Standard OpenMP. Dr inż. Tomasz Olas

Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Open MP wer Rafał Walkowiak Instytut Informatyki Politechniki Poznańskiej Wiosna

Wprowadzenie do OpenMP

Programowanie systemów z pamięcią wspólną specyfikacja OpenMP. Krzysztof Banaś Obliczenia równoległe 1

4. Procesy pojęcia podstawowe

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie współbieżne Wykład 2. Iwona Kochańska

Równoległość i współbieżność

Równoległość i współbieżność

4. Procesy pojęcia podstawowe

Komputerowe Obliczenia Równoległe: Wstęp do OpenMP i MPI

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie współbieżne i rozproszone

Wstęp do programowania 2

4. Procesy pojęcia podstawowe

Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Podstawy programowania skrót z wykładów:

Działanie systemu operacyjnego

Elementy składowe: Przenośność oprogramowania Model SPMD Szczegółowe wersje (bindings) dla różnych języków programowania

Mechanizmy pracy równoległej. Jarosław Kuchta

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Działanie systemu operacyjnego

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Mechanizmy komunikacji. spotkania symetryczne (język CSP) spotkania asymetryczne (Ada) przestrzenie krotek (Linda) potoki, komunikaty i kanały (Unix)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Działanie systemu operacyjnego

Podstawy Programowania C++

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

PRZETWARZANIE RÓWNOLEGŁE I ROZPROSZONE. Mnożenie macierzy kwadratowych metodą klasyczną oraz blokową z wykorzystaniem OpenMP.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Podstawy programowania komputerów

Podstawy programowania w języku C

Open MP wer Rafał Walkowiak Instytut Informatyki Politechniki Poznańskiej Jesień 2014

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wykład 8: klasy cz. 4

5. Model komunikujących się procesów, komunikaty

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Programowanie Rozproszone i Równoległe

Działanie systemu operacyjnego

Mikroprocesor Operacje wejścia / wyjścia

Wprowadzenie do programowania współbieżnego

Wykład 3 Składnia języka C# (cz. 2)

1.1 Definicja procesu

Algorytmy i Struktury Danych

Architektura komputerów. Układy wejścia-wyjścia komputera

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie maszyn z pamięcią wspólną w standardzie OpenMP.

1 Podstawy c++ w pigułce.

Programowanie współbieżne Wstęp do OpenMP. Rafał Skinderowicz

Nazwa Wydziału Nazwa jednostki prowadzącej moduł Nazwa modułu kształcenia Kod modułu Język kształcenia Efekty kształcenia dla modułu kształcenia

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Wywoływanie procedur zdalnych

Wykład 5: Klasy cz. 3

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Java EE produkcja oprogramowania

16. Taksonomia Flynn'a.

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język C++ zajęcia nr 2

Programowanie obiektowe - 1.

Język ludzki kod maszynowy

Procesy, wątki i zasoby

Definicje. Algorytm to:

Wprowadzenie do systemów operacyjnych

Systemy operacyjne. Zajęcia 11. Monitory

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Logiczny model komputera i działanie procesora. Część 1.

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

ArtPlayer oprogramowanie do odtwarzania plików video sterowane Artnet/DMX V1.0.1

Wywoływanie procedur zdalnych

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

3URJUDPRZDQLHZVSyáELH*QHZVWS

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Programowanie maszyn z pamięcią wspólną w standardzie OpenMP.

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

LEKCJA TEMAT: Zasada działania komputera.

Język UML w modelowaniu systemów informatycznych

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Pętle. Dodał Administrator niedziela, 14 marzec :27

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Zmienne, stałe i operatory

Programowanie współbieżne Wykład 7. Iwona Kochaoska

Transkrypt:

Wyklad 11 Języki programowania równoległego Części wykładu: 1. Środowisko programu równoległego - procesy i wątki 2. Podstawowe problemy języków programowania równoległego 3. Języki programowania w środowisku z rozproszoną pamięcią - model OCCAM 4. Języki programowania w środowisku ze wspólną pamięcią - model OpenMP

Środowisko programu równoległego - procesy i wątki Proces - zapis lub wykonanie szeregowe ciągu instrukcji. Procesami w systemie komputerowym zarządza zwykle system operacyjny komputera. Z punktu widzenia systemu operacyjnego, proces jest to obiekt tworzony w celu wykonania programu lub jego części. Stworzenie procesu odbywa się przez wykonanie przez system operacyjny następujących czterech czynności: utworzenie deskryptora procesu przydział przestrzeni adresowej w pamięci operacyjnej załadowanie programu do przydzielonej przestrzeni adresowej przekazanie deskryptora procesu programowi szeregowania.

Program szeregowania, który działa na kolejkach deskryptorów procesów przydziela procesom czas procesora. Operacje wejścia/wyjścia zwykle powodują zawieszenie procesu i przekazanie czasu procesora innemu procesowi gotowemu do wykonania. Procesy wykonują się z podziałem czasu procesora (ang. time sharing). Polega to na przydzielaniu procesom aktywnym kwantów czasu procesora. Zmiana procesu w procesorze powoduje wymianę tzw. kontekstu procesu (ang. process context) w procesorze, zawierającego podstawowe zmienne stanu, rejestry procesora, wskaźniki na zasoby. Kontekst usuwanego procesu zapisany jest w deskryptorze procesu (ang. process descriptor).

Aby zwiększyć zrównoleglenie obliczeń wewnątrz procesu wprowadzono nowy typ elementu programowego tzw. wątek (ang. thread). Wątek jest to osobno zadeklarowany przez odpowiednie instrukcje ciąg instrukcji wewnątrz procesu, wykorzystujący zasoby procesu. Podobnie jak procesy wątki dzielą czas procesora. Wątkami zarządza również program szeregowania wątków (ang. thread scheduler) należący do systemu operacyjnego komputera, ale zmiana wątku w procesorze zajmuje dużo mniej czasu, gdyż wymaga zmiany licznika rozkazów i rejestru stanu procesora. Stąd wątki nazywane są również lekkimi procesami (ang. lightweight process). Procesy i wątki mogą być w jednym z trzech stanów: wykonywany, gotowy do wykonania (oczekujący w kolejce na czas procesora), zawieszony w oczekiwaniu na zajście określonego zdarzenia w systemie, np. zakończenie operacji we/wy.

Program nazywamy współbieżnym (ang. concurrent), jeśli zamieszczono w nim specyfikację równoległego wykonywania procesów. Procesy składowe programu współbieżnego nazywamy procesami współbieżnymi (ang. concurrent processes). Program nazywamy równoległym jeśli jego procesy składowe zostały odwzorowane do wykonania na równolegle działających procesorach. Procesy programu równoległego nazywamy procesami równoległymi.

Sposoby wykonania programów współbieżnych: wieloprogramowość (ang. multiprogramming) - wykonywanie programów (procesów) współbieżnych przez podział czasu jednego procesora - wykonanie pozornie w sposób równoległy, wieloprzetwarzanie (ang. multiprocessing) - wykonywanie programów (procesów) na oddzielnych procesorach mających dostęp do wspólnej pamięci tzw. multiprocesorach - wykonanie rzeczywiście równoległe, przetwarzanie rozproszone (ang. distributed processing) - wykonywanie programów (procesów) na oddzielnych procesorach mających lokalne pamięci bez dostępu do wspólnej pamięci - wykonanie rzeczywiście równoległe

Sposoby uzyskiwania równoległości wykonania programów: wykorzystanie języków programowania równoległego (ang. parallel programming languages), w których równoległość wykonywania elementów programu (procesów, wątków) jest określona przez programistę bezpośrednio w programie. wykorzystanie tzw. kompilatorów zrównoleglających (ang. parallelizing compilers), które automatycznie przetwarzają programy w języku programowania sekwencyjnego na programy równoległe.

Podstawowe problemy języków programowania równoległego, których rozwiązanie musi zapewnić zapewnione w języku: deklaracje procesów i ich elementów składowych, określenie porządku aktywacji procesów w programie mechanizmy wzajemnej synchronizacji procesów w trakcje wykonywania programu, środki dla wyrażenia komunikacji danych czyli wymiany danych między procesami składowymi.

Deklaracja lub identyfikacja procesów w programie: Procesy strukturalne Ich składnia i semantyka są zbliżone do procedury(funkcji), wywoływane przez nazwę z podaniem parametrów aktualnych wywołania Przykłady: process z języka Concurrent Pascal, Concurrent C; procedure z języka C, Modula, OCCAM; task z języka Ada. Procesy niestrukturalne Są to ciągi sekwencyjnych instrukcji, których początki są wyznaczane przez operatory (instrukcje) zrównoleglające drogi sterowania, Przykłady: cobegin, coend z języka Algol 68, CSP; begin, end z języka OCCAM.

Porządek aktywacji procesów współbieżnych i ich zakończenia Wyróżniamy następujące metody aktywacji procesów współbieżnych: Porządek aktywacji określony bezpośrednio przez specjalne operatory działające na procesach strukturalnych lub niestrukturalnych Przykłady: cobegin, coend w Algol 68, CSP; FORK, JOIN w Unix, PL1; parbegin, parend w CCS, PAR w OCCAM. Porządek aktywacji określony pośrednio przez deklarację zbioru procesów współbieżnych lub inicjalizację równoległą wcieleń zadeklarowanych procesów, Przykłady w językach Concurrent Pascal, Modula.

Mechanizmy synchronizacji procesów równoległych Synchronizacja (ang. synchronization) w programie równoległym nazywamy oddziaływanie stanu określonych składowych procesów równoległych programu na stan (wykonywanie się) innych procesów. Podstawowe mechanizmy synchronizacji Mechanizmy dla wykluczania wzajemnego (ang. mutual exclusion) wykonywania fragmentów (sekcji) krytycznych (ang. critical section) programów równoległych. Operacje na zmiennych wspólnych dla wielu procesów równoległych Przykład: semafory z operacjami p, v Obiekty strukturalne w programie, grupujące procesy, których wykonanie odbywa się z wykluczaniem wzajemnym Przykład: monitory

Mechanizmy dla zatrzymywania i wznawiania biegu procesów równoległych Operacje bezpośredniego sterowania biegiem procesów równoległych Przykłady: wait(s), send(s) w języku Modula, systemie Unix; corroutines z operacjami call, resume, return w językach SIMULA, Modula 2. Synchroniczne przesyłanie komunikatów, wyrównujące bieg procesów równoległych na operacjach komunikacji Przykład: operacje wyślij (!), odbierz (?) w języku OCCAM. Synchroniczne zdalne wywoływanie procedur, wyrównujące bieg procesów na deklaracjach i wywołaniach procedur w procesach równoległych Przykłady: operatory ACCEPT i wywołania zadań w języku Ada.

Mechanizmy komunikacji między procesami równoległymi Komunikacja przez wspólne zmienne w buforze, do którego mają dostęp sekcje krytyczne umieszczone w procesach równoległych, Przykłady: semafory Komunikacja przez dostęp do procedur działających na wspólnych danych, pod osłoną mechanizmów wykluczania wzajemnego wywołań procedur, Przykład: monitory w języku Ada Komunikacja w realizacji zdalnie wywoływanych procedur przez przekazywanie parametrów i odbieranie wyników Przykład: zdalne wywoływanie procedur Komunikacja przez asynchroniczne przesyłanie komunikatów przy pomocy operacji dotyczących wydzielonych zmiennych Przykład: protokoły komunikacyjne sieci Ethernet, Myrinet, Cambridge Ring. Komunikacja przez synchroniczne przesyłanie komunikatów przy pomocy operacji dotyczących wydzielonych kanałów, Przykłady: operacje wyślij (!), odbierz (?) w języku OCCAM.

3. Języki programowania w środowisku z rozproszoną pamięcią - model OCCAM OCCAM jest modelowym językiem programowania równoległego dla systemów równoległych z rozproszoną pamięcią, w którym komunikację poprzez przesyłanie komunikatów umieszczono na poziomie programu aplikacyjnego. Język OCCAM jest językiem, który był wspomagany sprzętowo w latach 1980 i 90-ych przez architekturę transputerów a później przez emulację programową transputerów pod Windows NT. Innym podstawowym modelem programowania równoległego z przesyłaniem komunikatów jest model MPI (omówiony w Wykładzie 4), w którym komunikacje umieszczono na poziomie biblioteki komunikacyjnej, wywoływanej z programów w językach C, C++, Java. Język OCCAM został zaproponowany w Anglii w 1983 roku na Uniwersytecie w Oxfordzie. Nazwa pochodzi od filozofa szkockiego Wiliama Occama (XIII / XIV wiek), który głosił, że należy używać możliwie najmniejszej liczby pojęć dla opisywania wszelkich zagadnień. Takie założenie było motywem przewodnim przy definiowaniu języka OCCAM.

Ogólne cechy języka OCCAM: dwa rodzaje procesów: strukturalne - deklarowane i wywoływane przez nazwę oraz niestrukturalne, wynikające z przepływu sterowania w programie, porządek aktywacji procesów określony jest bezpośrednio przez operatory strukturalizacji sterowania (konstruktory) komunikacja między procesami współbieżnymi umieszczona na poziomie programu aplikacyjnego tj. bez pośrednictwa systemu operacyjnego. komunikacja poprzez synchroniczne przesyłanie komunikatów (niebuforowane) w kanałach (ang. channel), synchronizacja między procesami współbieżnymi zapewniona przez synchroniczne transmisje komunikatów w kanałach, brak wzajemnego dostępu do struktur danych należących do procesów współbieżnych - pamięci rozproszone procesów, język silnie formatowany - zakres działania operatora języka określony jest układem zapisu programu - przez linie wcięte o dwie spacje.

Podstawowe procesy języka OCCAM: v := e podstawienie wyniku obliczenia wyrażenia e pod zmienną v, c! e wysłanie komunikatu z wynikiem wyrażenia e do kanału c, c? v odebranie komunikatu z kanału c i podstawienie pod zmienną v. Konstruktory Podstawowe procesy są poddawane działaniu konstruktorów: SEQ - wyrażający sekwencyjne wykonanie procesów w kolejnych liniach, PAR - wyrażający współbieżność procesów w kolejnych liniach, ALT - wyrażający wykonanie jednego z procesów uzależnionych tzw. dozorami. Dozory w ALT są funkcją iloczynu zdaniowego (oznaczanego przez &) warunku logicznego (np. a=5) i odbioru komunikatu w kanale (np. c? v).

Podstawowe wyrażenia sterujące: IF, WHILE, CASE Replikatory stanowią zapisy, które generują kopie procesu ze względu na określoną zmienną, przebiegającą kolejne wartości. NP. KONSTRUKTOR i = 1 FOR 10 process [i] powoduje wygenerowanie w programie 10 kopii procesu {i} dla kolejnych wartości i od 1 do 10, umieszczonych po operatorem KONSTRUKTOR. Kanały są to deklarowane obiekty służące do komunikacji. Kanał ma nazwę oraz protokół, który określa typ zmiennej lub zmiennych przesyłanej (-ych) w kanale.

Przykłady prostych programów w języku OCCAM: Przykład 1. Mamy program równoległy po lewej oraz schemat blokowy tego programu ( z pominięciem deklaracji zmiennych i kanałów) Konstruktor SEQ wyznacza sekwencję fragmentów programu. Konstruktor PAR tworzy równoległe fragmenty programu poprzez rozgałęzienie ścieżki sterującej na dwie ścieżki równoległe zawierające dwie sekwencje instrukcji. Zawarte są tam dwie komunikacje, w kanałach chan3 i chan4, między procesami współbieżnymi określonymi przez PAR.

INT d: SEQ d:= 3 d:= d + 1 CHAN OF INT chan3, chan4: PAR INT a, b: SEQ a := d + 2 chan3! a chan4? b INT a: SEQ chan3? a a := d + a chan4! a d := d + 2

Przykład 2 Ten przykład zawiera konstruktor ALT, który zawiera dozorowane procesy. CHAN OF INT alfa, beta, delta: INT x, y: SEQ alfa? x ALT x = 1 & beta? y y := y + 1 x = 2 & delta? y y := y + 2 alfa! y Konstruktor ALT obejmuje dwa procesy: y := y + 1 oraz y := y + 2, dozorowane przez dwa dozory: x = 1 & beta? y oraz x = 2 & delta? y, zawierające sprawdzenie warunków logicznych ( x=1 oraz x=2) i odbiory komunikatów w kanałach beta i delta.

Dozory, dla których warunki logiczne są spełnione, zawieszają się w oczekiwaniu na komunikacje. Nadejście komunikatu w kanałach powoduje spełnienie całego dozoru, dla którego spełniony był warunek logiczny. Wtedy wykonuje się proces dozorowany przez ten warunek. Wysłanie komunikatów do dozorów następuje przez jakieś procesy równoległe do dozorowanych - nie pokazane w przykładzie. Gdy spełnionych jest więcej niż jeden dozór wybór procesu do wykonania jest określony porządkiem ich zapisu w programie. Zmienne, pod które podstawiane są wartości otrzymane w komunikacie mogą być użyte do wykonania procesu. W ten sposób dozory nie tylko kontrolują wykonanie procesów ale też mogą dostarczać im danych odebranych w kanałach.

Przykład 3 Przykład zawiera mechanizm replikatorów procesów równoległych i kanałów. [10] CHAN OF INT alfa: PAR i=0 FOR 9 WHILE TRUE INT x: SEQ alfa [i]? x alfa [i+1]! x W tym przykładzie występuje replikator, który tworzy 9 procesów współbieżnych umieszczonych pod konstruktorem PAR. Każdy proces to pętla nieskończona (z powodu warunku TRUE) zawierająca sekwencję odbioru w kanale i nadanie tej samej wiadomości do innego kanału. Kanały o nazwie alfa są tutaj indeksowane zmienną i od 0 do 9.

Do kanału alfa [0] w pierwszej pętli musi nadać komunikat jakiś proces nie pokazany w programie. Potem ten komunikat "wędruje" poprzez wszystkie pętle aż do nadania w kanale alfa [9]. To nadanie może się wykonać jeśli wykona się odbiór w tym kanale w nie pokazanym tutaj procesie równoległym do pętli programu.

W języku OCCAM istnieją instrukcje PLACE (umieść), które służą do umieszczania na konkretnych procesorach procesów strukturalnych ujętych w procedury. Przypisania procesów programu do procesorów systemu umieszczane są w tzw. programie konfigurującym dołączanym do zwykłego tekstu programu obliczeniowego. W programie konfigurującym na wstępie deklaruje się liczbę procesorów w systemie komputerowym oraz istniejące połączenia między procesorami. Łączom między procesorami odpowiadają kanały zewnętrzne, na które można odwzorować kanały logiczne występujące w programie. Instrukcje PLACE służą też do odwzorowania kanałów na łącza zewnętrzne procesora oraz dodatkowo do umieszczania zmiennych w konkretnych komórkach pamięci operacyjnej. Kanały nie odwzorowane na łącza zewnętrzne są traktowane jako tzw. kanały wewnętrzne, które realizują transmisje w obrębie pamięci operacyjnej, przydzielonej komunikującym się procesom.

4. Języki programowania w środowisku ze wspólną pamięcią - model OpenMP OpenMP (skrót od ang. Open Multi Processing) stanowi podstawowe środowisko programowe do tworzenia programów dla systemów równoległych ze wspólną pamięcią. OpenMP został opracowany pod koniec lat 1990-ych przez konsorcjum producentów systemów równoległych (IBM, SGI, Sun, HP, Compaq). OpenMP umożliwia pisanie programów równoległych przy wykorzystaniu standardowych języków sekwencyjnych C, C++ oraz Fortran 90 dla systemów operacyjnych Unix, Linux, Windows. Open MP zapewnia wprowadzenie do programu sekwencyjnego specyfikacji : równoległego wykonywania obliczeń na poziomie wątków; komunikacji pomiędzy poszczególnymi wątkami; synchronizacji wykonywania wątków. Odbywa się to poprzez wstawianie do programów, specyficznych dyrektyw, zmiennych środowiskowych oraz procedur bibliotecznych OpenMP.

Podstawowy model zrównoleglenia obliczeń w OpenMP. Program rozpoczyna się realizacją ciągu instrukcji pojedynczego wątku głównego (ang. main thread), wykonującego się w sposób sekwencyjny. Dyrektywa specyfikująca region równoległy tworzy grupę równolegle wykonujących się wątków, z których jednym jest wątek główny. Gdy przed wymienioną dyrektywą wyspecyfikowano zagnieżdżanie wątków, wątki składowe mogą być dalej zrównoleglane przez dyrektywy regionów równoległych. Na końcu każdego regionu równoległego występuje synchronizacja wątków tego regionu za pomocą wbudowanej bariery. Bariera wyrównuje bieg wszystkich wątków regionu, wstrzymując ich dalsze wykonywanie do wykonania (osiągnięcia) tej bariery przez wszystkie wątki składowe regionu. Po osiągnięciu synchronizacji wszystkich wątków wątek główny kontynuuje pracę sekwencyjną.

Zmienne środowiskowe Zmienne środowiskowe służą do globalnego ustalania parametrów dla potrzeb tworzonego równoległego fragmentu programu. OMP NUM THREADS określa liczbę wątków w równoległej grupie, OMP NESTED pozwala lub zabrania na zagnieżdżanie regionów równoległych (TRUE, FALSE), OMP DYNAMIC pozwala lub zabrania na dynamiczne dopasowywanie liczby wątków (TRUE, FALSE), OMP SCHEDULE definiuje sposób zrównoleglenia pętli (przydział iteracji do równoległych wątków) (static, dynamic, guided, runtime). OMP SCHEDULE static rozdziela iteracje na kolejne wątki przed rozpoczęciem wykonywania zgodnie z podaną liczbą iteracji na wątek, OMP SCHEDULE dynamic rozdziela iteracje na wolne wątki dynamicznie podczas wykonywania, OMP SCHEDULE guided rozdziela statycznie iteracje, tak że ich liczba na wątek maleje wykładniczo, OMP SCHEDULE runtime odkłada podział iteracji do wykonania programu. Zmienne środowiskowe ustawia się przez polecenia powłoki. Przykład Dla powłok sh oraz bash export OMP_NUM_THREADS= 8 Dla powłok csh oraz tcsh setenv OMP_NUM_THREADS 8

Specyfikacja równoległości obliczeń Dyrektywa parallel Dyrektywa parallel tworzy tzw. region równoległy czyli równoległą grupę wątków. #pragma omp parallel klauzule { // blok strukturalny... } W dyrektywie parallel mogą wystąpić następujące tzw. klauzule, czyli deklaracje uzupełniające podstawową dyrektywę: if(wyrażenie skalarne) num threads(wyrażenie skalarne) private(lista zmiennych) firstprivate(lista zmiennych) shared(lista zmiennych) default(shared albo none) copyin(lista zmiennych) reduction(operator : lista zmiennych)

Grupa wątków jest tworzona gdy nie występuje klauzula if albo wyrażenie w klauzuli if ma wartość różną od zera. Klauzula num_threads służy do zadeklarowania liczby wątków w tworzonej grupie równoległych wątków. Jeśli nie ma klauzuli num_threads to liczba wątków w grupie zależy od zmiennej środowiskowej OMP NUM THREADS - master staje się wątkiem 0 a numeracja nie zmienia się w trakcie wykonania. Każdy wątek wykonuje instrukcję zadaną blokiem strukturalnym. Po synchronizacji zakończenia wykonywania regionu dalsze instrukcje po ograniczniku } wykonuje sekwencyjnie watek główny.

Deklaracje zmiennych i ich zasięgu Z wyjątkiem klauzul if oraz num_threads, pozostałe klauzule dyrektywy parallel służą do zdefiniowania typu współdzielenia i zasięgu zmiennych używanych w bloku strukturalnym tej dyrektywy. Znaczenie tych klauzul jest następujące: private(lista): zmienne na liście są prywatnymi zmiennymi każdego wątku, (obiekty są automatycznie alokowane dla każdego wątku), firstprivate(lista): jak wyżej, ale w każdym wątku zmienne są inicjowane wartościami z wątku głównego, shared(lista): zmienne z listy są wspólne dla wszystkich wątków w grupie, default(shared): wszystkie zmienne domyślnie są wspólne (o ile nie znajdują się na żadnej liście typu private ), default: dla wszystkich zmiennych trzeba określić, czy są wspólne czy prywatne, reduction(operator : lista): dla zmiennych z listy jest wykonywana operacja redukcyjna określona przez operator. Zmienna nie wymieniona w żadnej z klauzul typu private, jest wspólna. Zmienne deklarowane w bloku są automatycznie prywatne.

Dyrektywa zrównoleglenia pętli for Dyrektywa for umożliwia rozdzielenie wykonania iteracji pętli między równoległe wątki w grupie. Dyrektywę for pisze się dopiero po dyrektywie parallel. #pragma omp parallel klauzule {... #pragma omp for klauzule for (... ;... ;... ) {... }... } Wymaga się, aby pętla for była w postaci kanonicznej, czyli przed jej wykonaniem musi być znana liczba iteracji.

Klauzule dyrektywy for : schedule(rodzaj, rozmiar) private(lista zmiennych) firstprivate(lista zmiennych) reduction(operator : lista zmiennych) lastprivate(lista zmiennych) nowait ordered Klauzula schedule specyfikuje sposób podziału wykonań iteracji pętli między wątki, gdzie rodzaj może przyjmować wartości static, dynamic, guided, runtime. Wartość parametru static rozdziela iteracje na wątki przed rozpoczęciem wykonywania zgodnie z podaną liczbą iteracji na wątek, dynamic rozdziela iteracje na wolne wątki dynamicznie podczas wykonywania, guided rozdziela iteracje, tak że ich liczba na wątek maleje wykładniczo, runtime odkłada podział iteracji do wykonania programu. Znaczenie klauzul private, firstprivate, reduction jest podobne jak dla dyrektywy parallel.

Klauzula lastprivate działa jak private, ale po zakończeniu wykonywania pętli, zmienne mają taką wartość, jak przy sekwencyjnym wykonaniu pętli. Klauzula nowait usuwa wykonanie synchronizacji na barierze po wykonaniu wszystkich wątków po pętli. Klauzula ordered umożliwia wykonanie wybranej części treści iteracji pętli for sekwencyjnie.

Dyrektywa zrównoleglenia kodu nieiteracyjnego sections Dyrektywa sections służy do zrównoleglenia wykonania nieiteracyjnego kodu sekwencyjnego przez wątki grupy zorganizowanej za pomocą dyrektywy parallel. Dyrektywa sections występuje w kodzie po dyrektywie parallel. #pragma omp parallel klauzule {... #pragma omp sections klauzule { #pragma omp section { // blok strukturalny 1... }... #pragma omp section { // blok strukturalny n... } } }

Dyrektywa sections przydziela blokom strukturalnym po dyrektywach section kolejne wątki w grupie utworzonej przez dyrektywę parallel. Przydział wątków blokom poprzedzającym dyrektywę sections odbywa się zawsze dynamicznie. Klauzule dyrektywy sections private(lista zmiennych) firstprivate(lista zmiennych) reduction(operator : lista zmiennych) lastprivate(lista zmiennych) nowait Znaczenie tych klauzul jest podobne jak dla dyrektywy for.

Skrócone formy dyrektyw zrównoleglania kodu w OpenMP Dyrektywa parallel for #pragma omp parallel for klauzule.. for (... ;... ;... ) {... } Możliwe do zastosowania klauzule są podobne jak dla dyrektyw parallel oraz for, z wyjątkiem nowait.

Dyrektywa parallel sections #pragma omp parallel sections klauzule.... { #pragma omp section { // blok strukturalny 1... }... #pragma omp section { // blok strukturalny n... } } Możliwe do zastosowania klauzule są podobne jak dla dyrektyw parallel oraz sections, z wyjątkiem nowait.

Dyrektywy synchronizacji grup wątków Dyrektywa barrier Dyrektywa barrier definiuje barierę dla wątków regionu równoległego w którym się znajduje. #pragma omp parallel klauzule {... #pragma omp barrier... } Dyrektywa barrier powoduje wstrzymanie wykonania wątków, które dotrą do bariery do czasu, gdy wszystkie wątki w regionie osiągną to miejsce w ich kodzie.

Dyrektywa master Dyrektywa master desygnuje zawierający ją wątek do wykonania na tylko przez wątek główny. Przy wykonaniu brak jest synchronizacji na wejściu i wyjściu. #pragma omp parallel klauzule {... #pragma omp master {... }... }

Dyrektywa sekcji krytycznej critical Dyrektywa critical deklaruje, że blok strukturalny następujący po niej ma być wykonywany w trybie wzajemnego wykluczania przez wszystkie wątki regionu, w którym się znajduje. Dyrektywa sekcji krytycznej występuje po dyrektywie parallel. #pragma omp parallel klauzule {... #pragma omp critical {... }... } Istnieje odmiana tej dyrektywy z nazwą sekcji krytycznej, w której nazwa sekcji krytycznej występuje po słowie critical w nawiasach okrągłych.