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

Podobne dokumenty
Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP

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

Przetwarzanie Równoległe i Rozproszone

Wprowadzenie do OpenMP

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

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

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

Wyklad 11 Języki programowania równoległego

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

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

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

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

Open MP. Rafał Walkowiak Instytut Informatyki Politechniki Poznańskie Jesień 2011

OpenMP część praktyczna

Programowanie Rozproszone i Równoległe

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

OpenMP środowisko programowania komputerów równoległych ze wspólną pamięcią

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

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

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

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

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

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

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

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

OpenMP Szkolenie dla uytkowniku

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

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

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

4. Procesy pojęcia podstawowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

ZASADY PROGRAMOWANIA KOMPUTERÓW

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Programowanie współbieżne OpenMP wybrane wydajność. Rafał Skinderowicz

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

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

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

O superkomputerach. Marek Grabowski

16. Taksonomia Flynn'a.

Podstawy programowania w języku C

Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

1 Podstawy c++ w pigułce.

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

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

Algorytmy i Struktury Danych

4. Procesy pojęcia podstawowe

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

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

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Programowanie Obiektowe i C++

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

Zaawansowane programowanie w C++ (PCP)

Podstawy Programowania Algorytmy i programowanie

1 Podstawy c++ w pigułce.

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

Pętla for. Wynik działania programu:

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

HPC na biurku. Wojciech De bski

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Część 4 życie programu

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Język C - podstawowe informacje

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

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

Wskaźniki w C. Anna Gogolińska

Wstęp do programowania 2

PARADYGMATY PROGRAMOWANIA Wykład 4

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Programowanie procesorów graficznych GPGPU

Język C++ zajęcia nr 2

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

Nowoczesne technologie przetwarzania informacji

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Programowanie niskopoziomowe

Wstęp do programowania

Wykład 8: klasy cz. 4

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Przesłanianie nazw, przestrzenie nazw

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

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

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Zaawansowane programowanie w języku C++ Klasy w C++

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Podstawy programowania. Wykład 9 Preprocesor i modularna struktura programów. Krzysztof Banaś Podstawy programowania 1

Transkrypt:

OpenMP Programowanie aplikacji równoległych i rozproszonych Wykład 2 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska OpenMP (Open Multi-Processing) jest standardem definiujacym interfejs programowania aplikacji (API - Application Programming Interface) do tworzenia programów równoległych opierajacych się na modelu wielowatkowym dla systemów z pamięcia wspólna. Składa się z: dyrektyw kompilatora, funkcji bibliotecznych, zmiennych środowiskowych. Standard OpenMP jest przeznaczony dla języków C/C++ i Fortran. Implementacje standardu OpenMP znajduja się na wielu platformach sprzętowych zawierajacych większość systemów UNIX owych i Windows NT. Wykład 2 p. 1/47 Wykład 2 p. 2/4 Standard OpenMP Model programowania W skład komitetu pracujacego nad standardem OpenMP ARB (The OpenMP Architecture Review Board) wchodza między innymi: Sun, NASA, Intel, Fujitsu, IBM, AMD, Cray, HP, SGI, The Portland Group, Inc., NEC, Microsoft. Standard OpenMP jest stale rozwijany - aktualna wersja standardu jest wersja 2.5 (draft 3.0). Strona domowa: www.openmp.org Zrównoleglanie kodu opiera się o model fork-and-join: watek główny tworzy dodatkowe watki w momencie konieczności wykonywania obliczeń równoległych: Wykład 2 p. 3/47 Wykład 2 p. 4/4

Zrównoleglenie zagłębione Składnia OpenMP Specyfikacja OpenMP przewiduje zrównoleglenie zagłębione (nested parallelism). Każdy watek w grupie może utworzyć własna grupę watków wykonujacych się równolegle. Aby taki model przetwarzania był możliwy należy ustawić odpowiednia zmienna systemowa (domyślnie nie jest ona właczona). Większość konstrukcji w OpenMP jest dyrektywami preprocesora opartymi na dyrektywie pragma zdefiniowanej w C/C++. Ogólny format dyrektywy jest następujacy: #pragma omp konstrukcja [klauzula [klauzula]...]nl Ponieważ podstawowym elementem składni sa dyrektywy preprocesora, to program zrównoleglony przy wykorzystaniu OpenMP może być skompilowany kompilatorem nie wspierajacym standardu OpenMP. Sekcja równoległa (I) Wykład 2 p. 5/47 Sekcja równoległa (II) Wykład 2 p. 6/4 Dyrektywa omp parallel określa obszar wykonywany równolegle przez watki: #pragma omp parallel [klauzula [klauzula]...] < C/C++ blok strukturalny > blok strukturalny jest blokiem instrukcji języka C/C++, który posiada jedno wejście i jedno wyjście. Liczba tworzonych watków jest określona przez zmienna OMP_NUM_THREADS. Wykład 2 p. 7/47 Wykład 2 p. 8/4

Komunikacja pomiędzy watkami Zakres widoczności zmiennych (I) OpenMP jest standardem programowania w oparciu o model z pamięcia wspólna - komunikacja pomiędzy watkami odbywa się poprzez wspólne zmienne. Każdy watek w sekcji równoległej posiada zmienne prywatne i zmienne dzielone (wspólne dla watków). Domyślnie każda zmienna widoczna podczas pracy równoległej jest traktowana jako wspólna dla wszystkich watków. Zmienne lokalne wewnatrz bloku równoległego sa prywatne. Zmienne statyczne zadeklarowane wewnatrz rozszerzenia dynamicznego sa traktowane jako wspólne. Zaalokowana pamięć jest wspólna (chociaż wskaźnik do niej może być prywatny). Składnia: #pragma omp parallel [Klauzule] <blok strukturalny języka C/C++> Klauzule: private(list) shared(list) default(shared none) firstprivate(list) Wykład 2 p. 9/47 Wykład 2 p. 10/4 Zakres widoczności zmiennych (II) Zakres widoczności zmiennych (III) private(list) Zmienne zadeklarowane wewnatrz klauzuli private sa prywatne dla każdego watku. Dla każdego watku tworzona jest zmienna prywatna. Jej wartość jest nieokreślona przy wejściu do bloku równoległego, jak i po wyjściu z niego. firstprivate(list) Rozszerza klauzulę private. Zmienna, która jest tworzona jest kopia zmiennej globalnej. shared(list) Zmienne wymienione w klauzuli sa wspólne dla wszystkich watków. default(shared none) Klauzula default pozwala określić zakresy zmiennych default(shared) oznacza że każda z widocznych zmiennych będzie traktowana jako wspólna, poza zadeklarowanymi przy pomocy threadprivate i stałymi. default(none) Wymaga, aby każda z aktualnie widocznych w rozszerzeniu leksykalnym zmiennych była jawnie zadeklarowana w którejś z klauzul zakresu widoczności danych. Wykład 2 p. 11/47 Wykład 2 p. 12/4

Zakres widoczności zmiennych (IV) Dyrektywa threadprivate Przykład: double a = 1; double b = 2; double c = 3; #pragma omp parallel private(b) firstprivate(c) (1) (2) Składnia: #pragma omp threadprivate (list) Dyrektywa threadprivate oznacza, że wszystkie zmienne podane jako parametry na liście będa prywatne dla watków w całej przestrzeni programu. wewnatrz obszaru równoległego (1): a jest zmienna wspólna dla wszystkich watków (jest równa 1), b i c sa zmiennymi lokalnymi dla watków (wewnatrz watków wartość poczatkowa zmiennej b jest niezdefiniowana, natomiast zmiennej c jest równa 3. poza obszarem równoległym (2): wartości zmiennych b i c sa niezdefiniowane. Wykład 2 p. 13/47 Wykład 2 p. 14/4 Zrównoleglanie pętli Zrównoleglanie pętli - przykład Najczęściej stosowanym sposobem zrównoleglania programów przy użyciu standardu OpenMP jest zrównoleglanie pętli: krok 1: określenie najbardziej czasochłonnych pętli w programie, krok 2: paralelizacja pętli poprzez przetwarzanie jej przez wiele watków. Wykorzystuje się do tego celu dyrektywę omp for: #pragma omp konstrukcja [klauzula [klauzula]...] < pętla, która ma być wykonywana w sposób równoległy > program sekwencyjny int main() double res[1000]; for (int i = 0; i < 1000; i++) oblicz(res[i]); program równoległy int main() double res[1000]; #pragma omp parallel for for (int i = 0; i < 1000; i++) oblicz(res[i]); Wykład 2 p. 15/47 Wykład 2 p. 16/4

omp for Klauzula lastprivate Składnia: #pragma omp for [Klauzule] <pętla języka C/C++, która będzie wykonywana równolegle> Klauzule: private(list) firstprivate(list) lastprivate(list) reduction(operator: list) schedule(kind[, chunk]) ordered nowait Klauzula lastprivate powoduje, że zmienna globalna, która jest zmienna prywatna podczas wykonywania pętli po jej zakończeniu przyjmuje wartość dla ostatniej iteracji pętli int a, v = 0; #pragma omp parallel #pragma omp for lastprivate(a) for (int i = 0; i < 10; ++i) a = i * 100; v += a; std::cout << a << std::endl; Wykład 2 p. 17/47 Wykład 2 p. 18/4 Sekcja krytyczna Sekcja krytyczna - przykład OpenMP udostępnia mechanizm sekcji krytycznej. Fragment kodu, który ma być wykonywany w danym czasie tylko przez jeden watek należy umieścić w bloku po dyrektywie OMP CRITICAL. Szczególnym przypadkiem sekcji krytycznej jest operacja atomowa (dyrektywa OMP ATOMIC). Polega ona na modyfikacji tylko jednej komórki pamięci przez jeden watek w danym czasie, np. inkremetacja, dekrementacja. #include <iostream> int main() double a[100]; double sum = 0.0; #pragma omp parallel double lsum = 0.0; #pragma omp for for (int i = 0; i < 100; ++i) lsum += a[i]; #pragma omp critical sum += lsum; std::cout << "suma: " << sum << std::endl; Wykład 2 p. 19/47 Wykład 2 p. 20/4

Klauzula reduction I Klauzula reduction II reduction(operator: list) operatory: +, *, -, &,,, &&, Na poczatku bloku równoległego tworzone sa prywatne kopie zmiennych z listy (tak jak w przypadku klauzuli private). Następnie sa one inicjowane wartościami zależnymi od użytego operatora. Na końcu obszaru równoległego oryginalne zmienne sa aktualizowane wartościa stanowiac a połaczenie wartości przed wykonaniem konstrukcji z końcowym rezultatem operacji redukcji wykonanej na prywatnych kopiach. Wartości poczatkowe dla poszczególnych operacji: operator wartość poczatkowa + 0 1-0 & 0 0 0 & & 1 0 Wykład 2 p. 21/47 Wykład 2 p. 22/4 Klauzula reduction - przykład omp ordered #include <iostream> int main() double sum = 0.0; double tab[100];... #pragma omp parallel #pragma omp for reduction(+: sum) for (int i = 0; i < 100; i++) sum += tab[i]; Składnia: #pragma omp ordered <blok strukturalny języka C/C++> Dyrektywa omp ordered może wystapić jedynie w dynamicznym rozszerzeniu dyrektyw for lub parallel for. Blok strukturalny występujacy po dyrektywie omp ordered jest wykonywany w danej chwili tylko przez jeden watek w porzadku takim jak w pętli sekwencyjnej. std::cout << "sum: " << sum << std::endl; return 0; Wykład 2 p. 23/47 Wykład 2 p. 24/4

omp for - przydział zadań omp for - schedule static Pętle można podzielić na dwa rodzaje: w każdej iteracji pętli wykonuje się tyle samo operacji, w zwiazku z tym każda iteracja wykonuje się w takim samym czasie, czas wykonania poszczególnych iteracji różni się w zależności od pewnych czynników od innych. OpenMP zawiera mechanizmy do automatycznej optymalizacji przydziału zadań do w atków w dyrektywie omp for. O sposobie przydziału zadań decyduje programista, a tzw. scheduler automatycznie przydziela zadania do watków. Możliwe sa cztery rodzaje przydzielania zadań do watków - static, dynamic, guided, runtime. Gdy jest określona klauzula schedule (static, chunk) iteracje sa przydzielane do poszczególnych watków w blokach o rozmiarze chunk. Bloki iteracji przydzielane sa w sposób cykliczny. chunk musi być liczba całkowita. Kiedy nie został określony rozmiar bloku (chunk), to jest on równy: (number_of_iterations + omp_num_threads() - 1)/omp_num_threads() omp for - schedule dynamic Wykład 2 p. 25/47 omp for - schedule guided Wykład 2 p. 26/4 Jeżeli jest wykorzystywana klauzula schedule (dynamic, chunk), to każdy watek otrzymuje do przetworzenia jeden blok iteracji o rozmiarze chunk. Gdy watek skończy, to otrzymuje do przetworzenia następny blok iteracji. chunk musi być liczba całkowita. Kiedy nie został określony rozmiar bloku (chunk), to jest on równy 1. Iteracje sa dzielone na części o wielkości malejacej wykładniczo, do wielkości równej kwant (domyślnie równej 1). Następnie części sa przydzielane dynamicznie do watków. Wielkość kawałka poczatkowego oraz stopień zanikania sa zależne od implementacji. chunk musi być liczba całkowita. Wykład 2 p. 27/47 Wykład 2 p. 28/4

omp for - schedule runtime Serializacja w obszarze równoległym Jeżeli jest wykorzystywana klauzula schedule (dynamic, chunk), to decyzja o sposobie przydziału iteracji do watków zostaje odroczona aż do momentu wykonania pętli. Typ przydziału zadań oraz rozmiar bloku iteracji (chunk) moga być zmieniane w trakcie wykonywania programu poprzez zmienna OMP_SHEDULE. Jeżeli zmienna ta nie została ustawiona, to przyjmuje się sposób przydziału - schedule(static). W przypadku, gdy wymagane jest wykonanie pewnych fragmentów kodu programu w sekcji równoległej tylko przez jeden watek standard OpenMP udostępnia dyrektywy: omp master omp single omp master Wykład 2 p. 29/47 omp single Wykład 2 p. 30/4 Składnia: #pragma omp master <blok strukturalny języka C/C++> Blok strukturalny występujacy po dyrektywie omp master jest wykonywany tylko przez watek główny. Pozostałe watki omijaja ten fragment i wykonuja pozostały kod sekcji równoległej. Watki nie sa blokowane przed i po sekcji wykonywanej przez watek główny. Składnia: #pragma omp single [Klauzule] <blok strukturalny języka C/C++> Klauzule: private(list) firstprivate(list) nowait Kod w bloku po dyrektywie omp single jest wykonywany w sekcji równoległej tylko przez jeden watek (nie jest określone przez który). Przy końcu bloku omp single watki sa blokowane. Wykład 2 p. 31/47 Wykład 2 p. 32/4

Serializacja w obszarze równoległym Punkty synchronizacji watków (I) #pragma omp parallel for for (int i = 0; i < 1000; ++i) # pragma omp single starting_operation(); operation(i); # pragma omp critical synchronized_operation(i); # pragma omp master master_operation(i); Ze względu na operowanie watków na wspólnych danych do poprawnego działania programu często niezbędne sa mechanizmy synchronizacji. Każdy watek, który dojdzie do punktu synchronizacji czeka na pozostałe watki. W OpenMP można wyróżnić dwa rodzaje synchronizacji: synchronizacja domyślna, synchronizacja jawna. W chwili, gdy wszystkie watki dojda do punktu synchronizacji wykonuja dalsza część programu lub następuje ich zniszczenie. Wykład 2 p. 33/47 Wykład 2 p. 34/4 Punkty synchronizacji watków (II) omp sections Synchronizacja domyślna występuje na końcu bloku kodu dyrektyw: omp parallel, omp for, omp sections, omp single, chyba, że została użyta klauzula nowait, która nakazuje brak synchronizacji watków. Programista w sposób jawny może określić miejsce synchronizacji w atków poprzez wykorzystanie dyrektywy omp barrier Wykład 2 p. 35/47 Konstrukcja sections: #pragma omp parallel sections [Klauzule] [#pragma omp section] blok strukturalny [#pragma omp section] blok strukturalny... Przykład: #pragma omp parallel #pragma omp sections # pragma omp section f1(); # pragma omp section f2(); # pragma omp section f3(); Wykład 2 p. 36/4

Konstrukcje łaczone I Konstrukcje łaczone II Konstrukcje łaczone sa skrótami konstrukcji parallel i konstrukcji pracy dzielonej zawierajacymi jedynie obszar pracy dzielonej. Konstrukcja parallel for: #pragma omp parallel for [Klauzule] <pętla języka C/C++, która będzie wykonywana równolegle> Dyrektywa parallel for jest skrótem dla konstrukcji parallel zawierajacej pojedyncza dyrektywę for. Jest równoważcna dyrektywie parallel z bezpośrednio po niej następujac a dyrektywa for. Konstrukcja parallel sections: #pragma omp parallel sections [Klauzule] [#pragma omp section] blok strukturalny [#pragma omp section] blok strukturalny... Dyrektywa parallel sections jest skrótem dla konstrukcji parallel zawierajacej pojedyncza dyrektywę sections. Jest równoważna dyrektywie parallel z bezpośrednio po niej następujac a dyrektywa sections. Klauzule sa takie same, za wyjatkiem klauzuli nowait. Zmienne środowiskowe Wykład 2 p. 37/47 Funkcje OpenMP I Wykład 2 p. 38/4 OMP_SHEDULE - ustawia rodzaj i ewentualnie porcje dla parametru runtime klauzuli schedule OMP_NUM_THREADS - ustawia ilość watków wykorzystywana podczas wykonywania programu. OMP_DYNAMIC - ustawia lub blokuje dynamiczne przydzielanie watków. OMP_NESTED - ustawia lub blokuje zagnieżdżanie równoległości. omp_set_num_threads - Ustawia ilość watków używanych podczas wykonywania obszaru równoległego. Działanie jest zależne od tego, czy umożliwione jest dynamiczne przydzielanie watków. Jeśli nie, to ustawiona wartość oznacza ilość watków tworzona przy wejściu w każdy obszar równoległy (także zagnieżdżony). W przeciwnym wypadku wartość oznacza maksymalna ilość watków która może zostać użyta. omp_get_num_threads - Funkcja zwraca aktualna ilość watków w grupie wykonujacych obszar równoległy z którego wywołano funkcję. Wykład 2 p. 39/47 Wykład 2 p. 40/4

Funkcje OpenMP II Funkcje OpenMP III omp_get_max_threads - Zwraca maksymalna wartość, jaka może zostać zwrócona po wywołaniu funkcji omp_get_num_threads. omp_get_thread_num - Zwraca numer watku w grupie (watek główny ma numer 0). omp_get_num_procs - Zwraca maksymalna liczbę procesorów jaka może być przeznaczona na na wykonywanie programu. omp_in_parallel - Zwraca wartość niezerowa jeśli została wywołana z dynamicznego rozszerzenia obszaru równoległego wykonywanego równolegle. W przeciwnym wypadku zwraca 0. omp_set_dynamic - Umożliwia lub zabrania dynamicznego przydzielania watków do wykonywania obszarów równoległych. Jeżeli zezwolimy na dynamiczne przydzielanie, to ilość watków używanych do wykonywania obszarów równoległych może zmieniać się automatycznie, tak, aby jak najlepiej wykorzystane zostały zasoby systemowe. W szczególności ilość watków podana przez użytkownika jest ilościa maksymalna. Ustawienie domyślne jest zależne od implementacji. omp_get_dynamic - Zwraca wartość niezerowa, gdy ustawione jest dynamiczne przydzielanie watków, w przeciwnym przypadku 0. Funkcje OpenMP IV Wykład 2 p. 41/47 Funkcje OpenMP - przykład Wykład 2 p. 42/4 omp_set_nested - Włacza lub wyłacza zagnieżdżanie równoległości. Jeżeli nie ma zgody na zagnieżdżanie, to zagnieżdżajace się obszary równoległe sa wykonywane sekwencyjnie, w przeciwnym wypadku zagnieżdżajace się obszary równoległe moga tworzyć dodatkowe grupy watków. omp_get_nested - Zwraca wartość niezerowa jeśli zagnieżdżanie jest właczone, a 0 w przeciwnym wypadku. W celu zmiany liczby watków jakie będa wykorzystywane w sekcji równoległej najpierw należy wyłaczyć tryb dynamicznego przydziału watków do wykonania, a następnie ustawić liczbę watków jaka ma być tworzona: #include <omp.h> int main() omp_set_dynamic(0); omp_set_num_threads(10); #pragma omp parallel... Wykład 2 p. 43/47 Wykład 2 p. 44/4

Funkcje lock Funkcje lock - przykład Do synchronizacji watków można w OpenMP wykorzystać również niskopoziomowe funkcje zarzadzaj ace ryglami (ang. lock): omp_init_lock(), omp_set_lock(), omp_unset_lock(), omp_test_lock(). omp_lock_t lock; omp_init_lock(&lock); #pragma omp parallel omp_set_lock(&lock); sekcja krytyczna omp_unset_lock(&lock); Wykład 2 p. 45/47 Wykład 2 p. 46/4 Kompilacja warunkowa Jedna z cech standardu OpenMP jest możliwość przeprowadzenia prawidłowej kompilacji kodu zrównoleglonego przy wykorzystaniu standardu OpenMP przez kompilator nie wspierajacy standardu OpenMP. W takim przypadku wygenerowana zostanie wersja sekwencyjna programu. Kompilatory OpenMP rozpoznaja makrodefinicję _OPENMP, co pozwala na przeprowadzenie kompilacji warunkowej: #ifdef _OPENMP... #endif Makrodefinicja _OPENMP nie może być poddawana operacjom preprocesora #define i #undef. Wykład 2 p. 47/47