Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP

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

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

Wprowadzenie do OpenMP

Przetwarzanie Równoległe i Rozproszone

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

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

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

Wyklad 11 Języki programowania równoległego

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

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

OpenMP część praktyczna

Programowanie Rozproszone i Równoległe

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.

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

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

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

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

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

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

OpenMP Szkolenie dla uytkowniku

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

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

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

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

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

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

4. Procesy pojęcia podstawowe

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

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

Podstawy programowania w języku C

O superkomputerach. Marek Grabowski

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

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

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

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

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

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

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

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

1 Podstawy c++ w pigułce.

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Programowanie Obiektowe i C++

1 Podstawy c++ w pigułce.

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

16. Taksonomia Flynn'a.

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

Część 4 życie programu

Wskaźniki w C. Anna Gogolińska

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

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

Język C - podstawowe informacje

4. Procesy pojęcia podstawowe

Zaawansowane programowanie w C++ (PCP)

Język C++ zajęcia nr 2

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

Programowanie procesorów graficznych GPGPU

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Podstawy Programowania Algorytmy i programowanie

Algorytmy i Struktury Danych

Programowanie niskopoziomowe

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

Pętla for. Wynik działania programu:

PARADYGMATY PROGRAMOWANIA Wykład 4

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

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

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

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

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

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

Tablice (jedno i wielowymiarowe), łańcuchy znaków

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

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

Kompilator języka C na procesor 8051 RC51 implementacja

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

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie współbieżne... (w14)

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wstęp do programowania

HPC na biurku. Wojciech De bski

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

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

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

Nowoczesne technologie przetwarzania informacji

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

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

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

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

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

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

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Transkrypt:

OpenMP p. 1/4 Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska

OpenMP OpenMP p. 2/4 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. API 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.

Standard OpenMP OpenMP p. 3/4 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

Model programowania OpenMP p. 4/4 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:

Zrównoleglenie zagłębione OpenMP p. 5/4 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).

Składnia OpenMP OpenMP p. 6/4 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) OpenMP p. 7/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.

Sekcja równoległa (II) OpenMP p. 8/4

Komunikacja pomiędzy watkami OpenMP p. 9/4 Każdy watek w sekcji równoległej posiada zmienne prywatne i zmienne dzielone (wspólne dla watków). OpenMP standardem programowania w oparciu o model z pamięcia wspólna - komunikacja pomiędzy watkami odbywa się poprzez wspólne zmienne. 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).

OpenMP p. 10/4 Zakres widoczności zmiennych (I) Składnia: #pragma omp parallel [Klauzule] <blok strukturalny języka C/C++> Klauzule: private(list) shared(list) default(shared none) firstprivate(list)

Zakres widoczności zmiennych (II) OpenMP p. 11/4 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.

Zakres widoczności zmiennych (III) OpenMP p. 12/4 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.

OpenMP p. 13/4 Zakres widoczności zmiennych (IV) Przykład: double a = 1; double b = 2; double c = 3; #pragma omp parallel private(b) firstprivate(c) { (1) } (2) 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.

Dyrektywa threadprivate OpenMP p. 14/4 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.

OpenMP p. 15/4 Zrównoleglanie pętli 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 program równoległy void main() { double res[1000]; } for (int i = 0; i < 1000; i++) oblicz(res[i]); void main() { double res[1000]; #pragma omp parallel for for (int i = 0; i < 1000; i++) oblicz(res[i]); }

Zrównoleglanie pętli - przykład OpenMP p. 16/4

OpenMP p. 17/4 omp for 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 OpenMP p. 18/4 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;

Sekcja krytyczna OpenMP p. 19/4 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.

Sekcja krytyczna - przykład OpenMP p. 20/4 #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; }

OpenMP p. 21/4 Klauzula reduction I 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.

OpenMP p. 22/4 Klauzula reduction II Wartości poczatkowe dla poszczególnych operacji: operator wartość poczatkowa + 0 1-0 & 0 0 0 & & 1 0

Klauzula reduction - przykład OpenMP p. 23/4 #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]; std::cout << "sum: " << sum << std::endl; } return 0;

omp ordered OpenMP p. 24/4 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.

omp for - przydział zadań OpenMP p. 25/4 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. sheduler automatycznie przydziela zadania do watków. Możliwe sa cztery rodzaje przydzielania zadań do w dynamic, guided, runtime. atków - static,

omp for - shedule static OpenMP p. 26/4 Gdy jest określona klauzula shedule (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 - shedule dynamic OpenMP p. 27/4 Jeżeli jest wykorzystywana klauzula shedule (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.

omp for - shedule guided OpenMP p. 28/4 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.

omp for - shedule runtime OpenMP p. 29/4 Jeżeli jest wykorzystywana klauzula shedule (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 - shedule(static).

Serializacja w obszarze równoległym OpenMP p. 30/4 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 OpenMP p. 31/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.

OpenMP p. 32/4 omp single 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.

Serializacja w obszarze równoległym OpenMP p. 33/4 #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); }

Punkty synchronizacji watków (I) OpenMP p. 34/4 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.

OpenMP p. 35/4 Punkty synchronizacji watków (II) 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

Konstrukcja sections: omp 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 zad1(); # pragma omp section zad2(); # pragma omp section zad3(); } OpenMP p. 36/4

Konstrukcje łaczone I OpenMP p. 37/4 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 dyrektyw a for.

Konstrukcje łaczone II OpenMP p. 38/4 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.

OpenMP p. 39/4 Zmienne środowiskowe OMP_SHEDULE - ustawia rodzaj i ewentualnie porcje dla parametru runtime klauzuli shedule 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.

Funkcje OpenMP I OpenMP p. 40/4 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ę.

Funkcje OpenMP II OpenMP p. 41/4 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 w główny ma numer 0). atku w grupie (watek 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.

Funkcje OpenMP III OpenMP p. 42/4 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 OpenMP p. 43/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.

Funkcje OpenMP - przykład OpenMP p. 44/4 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> void main() { omp_set_dynamic(0); omp_set_num_threads(10); #pragma omp parallel {... } }

Funkcje lock OpenMP p. 45/4 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().

Funkcje lock - przykład OpenMP p. 46/4 omp_lock_t lock; omp_init_lock(&lock); #pragma omp parallel { omp_set_lock(&lock); sekcja krytyczna } omp_unset_lock(&lock);

Kompilacja warunkowa OpenMP p. 47/4 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.