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

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

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

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

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

Wprowadzenie do OpenMP

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 maszyn z pamięcią wspólną w standardzie OpenMP.

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.

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

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

4. Procesy pojęcia podstawowe

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

Programowanie Rozproszone i Równoległe

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

Wprowadzenie do programowania współbieżnego

OpenMP część praktyczna

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

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

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

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

Programowanie współbieżne i rozproszone

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

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

Modele programowania równoległego. Pamięć współdzielona Rafał Walkowiak dla III roku Informatyki PP

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

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

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

4. Procesy pojęcia podstawowe

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

Wstęp do programowania 2

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

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

16. Taksonomia Flynn'a.

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Tabela wewnętrzna - definicja

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

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Szablony klas, zastosowanie szablonów w programach

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

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

Wykład 8: klasy cz. 4

Język Java wątki (streszczenie)

Przykładem jest komputer z procesorem 4 rdzeniowym dostępny w laboratorium W skład projektu wchodzi:

Zaawansowane programowanie w C++ (PCP)

Programowanie w języku C++

Literatura. 3/26/2018 Przetwarzanie równoległe - wstęp 1

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

Program jest więc strukturą statyczną zapisaną na jakimś nośniku. Natomiast proces jest wykonującym się programem.

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

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

Lab 9 Podstawy Programowania

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy Programowania C++

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

Kompilator języka C na procesor 8051 RC51 implementacja

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Współczesne aplikacje sterowania i akwizycji danych są zbiorem komunikujących się wątków lub procesów współbieżnych.

Nowoczesne technologie przetwarzania informacji

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

OpenMP Szkolenie dla uytkowniku

Materiały do laboratorium MS ACCESS BASIC

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

Wskaźniki w C. Anna Gogolińska

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

Pakiety podprogramów Dynamiczny SQL

ZASADY PROGRAMOWANIA KOMPUTERÓW

System operacyjny MACH

Prezentacja systemu RTLinux

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

Mogą pracować w środowisku: Scentralizowanym -mikrokontroler Rozproszonym sieć sterująca, systemy hierarchiczne. Komunikacja z syst.

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

System plików warstwa fizyczna

System plików warstwa fizyczna

System plików warstwa fizyczna

Współbieżność w środowisku Java

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

Wskaźniki. Informatyka

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

System plików. Warstwowy model systemu plików

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

Struktura i funkcjonowanie komputera pamięć komputerowa, hierarchia pamięci pamięć podręczna. System operacyjny. Zarządzanie procesami

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

Podstawy programowania komputerów

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

Wykład 4: Klasy i Metody

Transkrypt:

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

OpenMP standard specyfikacji przetwarzania współbieżnego uniwersalny i przenośny model równoległości (typu rozgałęzienie połączeni) dla architektur z pamięcią współdzieloną przetwarzanie rozpoczyna się od jednego wątku przetwarzania regiony współbieżne (parallel regions) wymagają powstania nowych wątków, obowiązują ścisłe zasady określenia liczby wątków wątki łączą się synchronizują się przy końcu regionu współbieżnego określona pamięć dostępna dla wszystkich wątków (współdzielona) dla komputerów typu SMP (ang. Symmetrical Multi Processor ) - systemy z pamięcią współdzieloną możliwy do implementacji w większości platform obliczeniowych dostarczany w postaci API (interfejsu dla programowania aplikacji) Open MP 2

Synchronizacja jako element struktury kodu Synchronizacja niezbędna do: zapewnienia powiązań części programu równoległego, zapobieżenia potencjalnie niebezpiecznym dla poprawności dostępom do pamięci np. nadpisanie wyniku, brak danej itp. synchronizacji wybranych zdarzeń przetwarzania, globalnej synchronizacji - bariera synchronizacyjna dla zbioru wątków, specyfikowana wprost (dyrektywy i funkcje OpenMP synchronizacyjne) i nie wprost (wbudowana w dyrektywy). Open MP 3

Poziomy równoległości w OpenMP wysoki poziom równoległości przetwarzania - program podzielony na segmenty, które mogą być realizowane współbieżnie różne watki a więc różne procesory, niski poziom równoległości przetwarzania - współbieżna realizacja przez różne wątki iteracji pętli (potencjalnie współbieżnie przez różne procesory) współbieżność na poziomie wykonania puli zadań Open MP wersja >= 3.0 Open MP 4

Poziomy równoległości OpenMP 2.0 Początek sekcji równoległej Początek równoległej pętli for i=10 T1 T2 T3 synchronizcja Zadania realizowane potencjalnie równolegle przez wątki i=1 synchronizacja Open MP 5

Projektowanie przetwarzania w Open MP program równoległy - jak napisać? Dyrektywy dla kompilatora: #pragma omp nazwa_dyrektywy klauzule Funkcje biblioteki czasu wykonania określenie/poznanie liczby wątków poznanie numeru wątku poznanie liczby wykorzystywanych procesorów funkcje blokady Open MP 6

Projektowanie przetwarzania w OpenMP Sterowanie wykonaniem parallel, for, sections, single, master (dyrektywy) Specyfikacja danych shared, private, reduction Synchronizacja często wbudowana na początku i końcu bloków kodu podlegającym dyrektywom sterującym, specyfikacja wprost zastosowanie dyrektyw: barrier, critical, atomic, flush, ordered; Open MP 7

Dyrektywy sterujące przetwarzaniem (1) parallel podstawowa dyrektywa kodu równoległego dyrektywa tworząca związany z nią zespół wątków (team) realizujących współbieżnie region równoległy czyli blok strukturalny następujący bezpośrednio po dyrektywie; definiująca współbieżnie realizowany fragment kodu; blok strukturalny posiada jedno wejście, jedno wyjście. for (dyrektywa wewnątrz regionu równoległego bezpośrednio przed pętlą for) dyrektywa określająca sposób przydziału iteracji pętli for - każda iteracja wykonywana jest raz - potencjalnie równolegle z innymi iteracjami np. realizowanymi przez inne wątki na tym samym lub innych procesorach. sections, section (wewnątrz regionu równoległego) sections definiuje początek zbioru bloków kodu (każdy z nich oznaczany section) realizowanych każdy jednokrotnie przez jeden z wątków ze zbioru aktywnych wątków (potencjalnie współbieżnie). Open MP 8

Dyrektywy sterujące przetwarzaniem (2) single dyrektywa definiująca blok kodu realizowany przez tylko jeden, dowolny wątek związany z bieżącym regionem II, przy końcu bloku kodu wbudowana bariera synchronizacyjna, master dyrektywa definiująca blok kodu realizowany jednokrotnie tylko przez wątek główny (id=0), bez bariery synchronizacyjnej, parallel for fragment kodu realizowany współbieżnie będący jednym blokiem for, parallel sections fragment kodu realizowany współbieżnie będący jednym blokiem sections Open MP 9

Dyrektywy sterujące przetwarzaniem (3) #pragma omp parallel s1 s1 s1 s2 s2 s2 s2 s2 s2 { s1(); for ( int i =1; i<3, i++) s2(); } //zakładamy, że tworzone są 3 wątki Open MP 10

Dyrektywy sterujące przetwarzaniem (4) #pragma omp parallel sections { s1 s2 s2 #pragma omp section s1(); #pragma omp section for (i =1; i<3, i++) s2(); } //Zakładamy, że tworzone są 3 wątki Open MP 11

s1 Dyrektywy sterujące przetwarzaniem (5) start s1 synch s2 synch s1 #pragma omp parallel { #pragma omp for for (i =1; i<4, i++) s1(); //synchronizacja od #for #pragma omp single s2(); //synchronizacja od #single } Open MP 12

Szeregowanie pętli for (1) Zakres iteracji pętli znany (ustalony w run-time, przy wejściu do pętli) Szeregowanie statyczne zakres iteracji pętli jest podzielony na podzakresy iteracji o jednakowym rozmiarze określonym jako x w schedule(static, x), liczba i wielkość zakresów przydzielanych do każdego wątku z góry ustalona, domyślnie każdy wątek dostaje jeden zakres, wątek 0 od początku zakresu iteracji; bazuje na zakresie pętli wyznaczonym w czasie przetwarzania. Szeregowanie dynamiczne wątki zwracają się do modułu szeregującego w celu uzyskania pierwszego i po jego wykonaniu kolejnego zakresu iteracji do realizacji, specyfikowany rozmiar x w schedule(dynamic, x), domyślnie wielkość przydziału = 1, możliwy proporcjonalnie znaczący koszt czasowy szeregowania w przypadku wielkości przydziału 1 i prostego przetwarzania w ramach ciała pętli. Open MP 13

Szeregowanie pętli for (2) Szeregowanie sterowane wielkość zakresu wyznaczana na bieżąco maleje w zależności od pozostałej do realizacji liczby iteracji schedule(guided) Szeregowanie realizowane w sposób określany w czasie przetwarzania schedule(runtime) decyduje aktualna wartość zmiennej środowiska OMP_SCHEDULE Open MP 14

Synchronizacja w OpenMP (1) Wewnętrzne bariery synchronizacyjne - oczekiwanie (koniec bloku kodu) aż wszystkie wątki ze zbioru zrealizują kod bloku poprzedzonego jedną z dyrektyw: for sections single Klauzula nowait likwiduje barierę synchronizacyjną Open MP 15

Synchronizacja w OpenMP (2) #pragma omp parallel { #pragma omp for nowait for (i=1; i<n; i++) b[i] = (a[i] + a[i-1])/2.0 #pragma omp for } for (i=0; i<m; i++) y[i]=sqrt(z[i]); klauzula nowait zapobiega barierze synchronizacyjnej po zakończeniu bloku poprzedzonego dyrektywą for Open MP 16

Dyrektywy synchronizacyjne (1) barrier synchronizacja wszystkich wątków z bieżącego zbioru (#pragma omp parallel), wątki które dotarły w przetwarzaniu do dyrektywy oczekują na pozostałe wątki; po osiągnięciu miejsca przez wszystkie rozpoczynają one współbieżnie przetwarzanie następnego po dyrektywie wyrażenia; Open MP 17

Dyrektywy synchronizacyjne (3) Flush synchronizacja danych współdzielonych wątków zapewnia spójny obraz pamięci w ramach prywatnego stanu danych wątku realizującego działania dyrektywy i pamięci wspólnej wątków, dotyczy zmiennych wyspecyfikowanych jako parametry (lub wszystkich zmiennych współdzielonych występujących w widzianym przez wątek prywatnym stanie danych programu); w efekcie oznacza że, wszystkie wcześniejsze operacje wątku realizującego flush odwołujące się do (podanych) zmiennych się zakończyły, a następne jeszcze nie zaczęły, możliwe jest, że operacje realizacji dyrektywy wystąpią w czasie później niż miejsce pojawienia się dyrektywy w kodzie, ale przed pierwszą operacją na zmiennej objętej dyrektywą; wymaga, aby kompilator spowodował zapis (do pamięci wspólnej wątków) zmiennych zmodyfikowanych w tym wątku, a przechowywanych w ramach prywatnego stanu danych (np. w rejestrach), usuwa zmienne współdzielone wątków z prywatnego stanu danych wątku i wymaga aby wątek ponownie załadował ich wartości z pamięci przed ich wykorzystaniem w kodzie. Open MP 18

Dyrektywy synchronizacyjne (3) Flush automatycznie realizowana w ramach: barrier, critical we/wy bloku kodu, ordered we/wy bloku kodu, parallel wy bloku kodu, for wy bloku kodu, sections wy bloku kodu, single wy bloku kodu, atomic we/wy (w atomic dotyczy tylko zmiennej uaktualnianej) Open MP 19

critical etykieta atomic Dyrektywy synchronizacyjne (2) specyfikuje blok, który może być realizowany jednocześnie tylko przez jeden wątek programu, wzajemne wykluczanie dotyczy bloków o jednakowych etykietach (lub bez etykiet), wbudowana dyrektywa flush Zapewnia niepodzielność operacji uaktualnienia specyfikowanej lokacji pamięci. Realizowane przez: (wykluczanie dostępu innych wątków do zmiennej i zapewnienie dostępu do pamięci (odczyt i zapis do pamięci) dotyczy wyrażeń: x++, ++x, x--, --x gdzie x jest zmienną chronioną lub postaci: x operator = wyrażenie operator = {+, *, -, /, &, ^,, <<, >>} wyznaczenie wartości wyrażenie nie jest atomowe!! więcej wariantów dyrektywy możliwych wersji dostępów do zmiennej w OpenMP wersja 3.1 Open MP 20

Dyrektywy synchronizacyjne (4) ordered określa ograniczony blok kodu w ramach regionu równoległej pętli który będzie realizowany wg oryginalnej (sekwencyjnej) kolejności iteracji pętli, powoduje sekwencyjność przetwarzania oznaczonego bloku kodu, sprawdzanie zakończenia pracy dla wcześniejszych iteracji, pozwala aby przetwarzanie wątków poza blokiem biegło niezależnie - współbieżnie, pojawia się w ramach bloków poprzedzonych dyrektywą for lub parallel for z opcją ordered. Open MP 21

Dyrektywy synchronizacyjne (5) #pragma omp parallel shared(x,y) private (x_next, y_next) { #pragma omp critical ( danex ) x_next = pobierz_z_kolejki (x); work(x_next); #pragma omp critical ( daney ) y_next = pobierz_z_kolejki (y); work(y_next); } dwie sekcje krytyczne do wzajemnego wykluczania dostępu do dwóch niezależnych kolejek x i y, zapobiegają pobieraniu z kolejki tego samego zadania przez wiele wątków. Open MP 22

Dyrektywy synchronizacyjne (6) #pragma omp parallel { #pragma omp single printf ( Początek pracy1 \n ); //synchronizcja single- nikt nie rozpoczął pracy work1( ); #pragma omp single printf( Kończenie pracy1 \n ); //synchronizcja single niektóre wątki skończyły pracę #pragma omp single nowait printf( Zakończona praca1 i poczatek pracy2 \n ); work2( ); } Pierwszy (gotowy) z zespołu wątków generuje komunikat. Bariera na końcu dyrektywy single. Bariera usunięta za pomocą klauzuli nowait. Open MP 23

Dyrektywy synchronizacyjne (7) #pragma omp parallel for shared (x, y, index, n) for (i=0; i<n; i++) { #pragma omp atomic x[index[i]] += work1(i); y[i] += work2(i); } przewaga dyrektywy atomic nad critical więcej równoległości Zakres atomic: dotyczy x, nie dotyczy: y i wyznaczenia work1(i), i domyślnie prywatne Open MP 24

Dane w OpenMP (1) Dane są: private - lokalne dane wątków lokalne kopie zmiennych niewidoczne dla innych wątków shared - globalne dane Współdzielone dane: zmienne widoczne w momencie osiągnięcia dyrektywy parallel lub parallel for Prywatne dane: zadeklarowane dyrektywą threadprivate, zdefiniowane wewnątrz obszaru równoległego, zmienna sterująca pętli for z dyrektywą podziału pracy, umieszczone w klauzuli private, firsprivate, lastprivate, reduction Open MP 25

threadprivate Dane w OpenMP (2) dyrektywa pozwalająca określić poza regionem równoległym zmienne jako prywatne dla każdego wątku, wartości z jednego regionu II są zachowane i przechodzą do kolejnego regionu II w odpowiednich wątkach int counter = 0; #pragma omp threadprivate(counter) Open MP 26

Klauzule sterujące współdzieleniem danych (1) private (lista) klauzula dyrektywy zrównoleglającej lub współdzielącej pracę, pozwala na określenie zmiennych jako prywatnych dla każdego z wątków, dla każdego wątku tworzony jest nowy obiekt o typie określonym przez typ zmiennej, wartość początkowa obiektu każdego wątku jest zgodna z rezultatem działania konstruktora obiektu. firstprivate (lista) w efekcie tej dyrektywy wartość początkowa lokalnego obiektu (określanego bloku i zadania) jest zgodna z wartością oryginalnego obiektu określoną przed początkiem bloku (w wątku nadrzędnym) Open MP 27

Klauzule sterujące współdzieleniem danych (2) lastprivate (lista) dyrektywa ta tworzy według listy obiekty prywatne dla wątków wartość zmiennej z wątku przetwarzającego ostatnią iterację (nie ostatnią operację) pętli lub section po ich zakończeniu - zostaje skopiowana do zmiennej oryginalnej - w wątku nadrzędnym. shared (lista) klauzula powoduje współdzielenie miedzy wątkami wyspecyfikowanych zmiennych Open MP 28

Klauzule sterujące współdzieleniem danych (3) reduction(operacja:lista zmiennych) klauzula powoduje realizację operacji redukcji (scalenie) w oparciu o podaną zmienną skalarną (współdzieloną operacja redukcji ma postać typu : x = x op expr np.: x = x f( ); x binop = expr np.: x += f( ) expr wartość wyznaczona z podanego wyrażenia Realizacja: Powstaje prywatny obiekt dla każdego wątku (lub zadania każdego wątku OpenMP 3.1) każdej ze zmiennych z listy reduction. Każdy obiekt jest inicjowany w sposób zależny i adekwatny od operatora (np. dla min - max(type)) Na końcu regionu ze zdefiniowaną klauzulą reduction, wartość oryginalnego obiektu (współdzielony) jest aktualizowany do wyniku będącego połączeniem za pomocą podanego operatora jego wartości początkowej i ostatecznych wartości każdego z prywatnych obiektów Wartość obiektu oryginalnego podlegającego redukcji jest nie zdeterminowana do momentu zakończenia bloku posiadającego klauzulę reduction (w przypadku klauzuli nowait konieczna bariera do zapewnienia poprawności wartości obiektu). Open MP 29

Klauzule sterujące współdzieleniem danych (4) reduction przykład #pragma omp parallel for reduction (+:a,y) for (i=0; i<n; i++) { a += b[i]; y = sum(y, c[i]); //operacje realizowane na obiektach y prywatnych wątków } operator redukcji (+) ukryty w wywoływanej funkcji sum() Open MP 30

Klauzule sterujące współdzieleniem danych (5) copyin(lista zmiennych) dotyczy zmiennych typu threadprivate dyrektywa powoduje zsynchronizowanie wartości zmiennej każdego z wątków do wartości oryginalnej zmiennej - w ramach wątku master realizacja na początku regionu równoległego copyprivate(lista zmiennych) zsynchronizowanie wartości zmiennych prywatnych wątków do wartości obiektu jednego z wątków realizującego blok single klauzula dostępna tylko w ramach dyrektywy single realizacja przy wyjściu z bloku single Open MP 31

Klauzule sterujące współdzieleniem danych (6) default(private) - sterowanie współdzieleniem zmiennych, których atrybuty współdzielenia są zdeterminowane nie wprost. Traktowane będą jako prywatne. default(none) wymaga, aby wszystkie zmienne, do których następuje odwołanie w regionie współbieżnym, a które nie posiadają predefiniowanych atrybutów współdzielenia, uzyskały takie poprzez wylistowanie w ramach klauzul atrybutów współdzielenia danych. Open MP 32

Funkcje biblioteki czasu wykonania (1) funkcje środowiska przetwarzania omp_set_num_threads (int liczba_wątków) określa liczbę wątków powoływanych przy wejściu do regionu równoległego, posiada wyższy priorytet nad OMP_NUM_THREADS (zm. środowiskowa) realizowana w obszarze kodu w którym funkcja: omp_in_parallel() zwraca 0 Inne sposoby określania liczby wątków: num_threads klauzula dyrektywy parallel OMP_NUM_THREADS zmienna środowiska omp_set_dynamic() i OMP_DYNAMIC zezwalają na dynamiczną modyfikację liczby wątków Złożony algorytm określenia liczby wątków w regione II w 3.1. bazuje na ICV (internal control variable) Open MP 33

Funkcje biblioteki czasu wykonania (2) omp_get_num_threads pozwala uzyskać liczbę wątków w zbiorze realizującym bieżący region współbieżny; omp_get_max_threads zwraca (także poza regionem równoległym) maksymalną wartość zwracaną przez omp_get_num_threads; omp_get_thread_num zwraca numer wątku (<0,omp_get_num_threads()-1>) w ramach zbioru realizującego region równoległy, wątkowi master zwraca 0; omp_get_num_procs zwraca maksymalną liczbę procesorów, która może zostać przydzielona do programu; Open MP 34

Funkcje biblioteki czasu wykonania (3) omp_in_parallel() zwraca wartość <> 0 jeśli wywołana w ramach regionu realizowanego współbieżnie; omp_set_nested (true/false) - włączenie/ wyłączenie zagnieżdżonej równoległości dla bieżącego wątku (zadania) omp_get_nested() informacja o statusie zagnieżdżonej równoległości dla wątku(zadania) Parametr OpenMP służy do określenia poziomu zagnieżdżania równoległości w 3.1. Open MP 35

Funkcje biblioteki czasu wykonania (4) - funkcje zamków Zamki powodują zawieszenie przetwarzania w przypadku odwołania się procesu do założonego zamka i pozwalają na wznowienie przetwarzania po otwarciu (usunięciu)zamka; Typy: omp_lock_t typ standardowy zamek omp_nest_lock_t typ zagnieżdżony zamek Realizacja: 1. system zapewnia dostęp do najbardziej aktualnego stanu zamka 2. inicjalizacja zamka / usuwanie zamka omp_init_lock/omp_destroy_lock omp_init_nest_lock/omp_destroy_nest_lock tworzenie - ustawiana wartość parametru zagnieżdżenia zamka równa 0 3. omp_set_(nest_)lock - zamykanie wątek jest zawieszany do momentu, gdy wskazany zamek zostanie otwarty przez proces, który go zamknął (typ standardowy), gdy zamek został zamknięty wcześniej przez ten sam wątek (typ zagnieżdżony zamka) następuje zwiększenie licznika zagnieżdżenia; Open MP 36

Funkcje biblioteki czasu wykonania (5) - funkcje zamków 4. Otwarcie zamka: omp_unset_(nest_)lock parametrem jest zamek zamknięty przez ten sam wątek, jest on otwierany (typ standardowy zamka) lub licznik zagnieżdżenia jest zmniejszony i zamek jest zwolniony pod warunkiem, że licznik jest równy 0 (typ zagnieżdżony zamka) 5. test i zamknięcie zamka: omp_test_(nest_)lock funkcja działa jak omp_set_(nest_)lock lecz nie wstrzymuje przetwarzania wątków w przypadku braku możliwości zamknięcie zamka (zwraca zero) zwraca nową wartość licznika zagnieżdżenia Open MP 37

Zmienne środowiskowe dla OpenMP OMP_SCHEDULE OMP_NUM_THREADS OMP_DYNAMIC OMP_NESTED Ustawianie: csh: setenv OMP_SCHEDULE dynamic ksh: export OMP_SCHEDULE= guided,4 Open MP 38

Przykładowe błędy //ZAMIAR: każdy wątek niech wykona raz pracę np = omp_get_num_threads(); /* błędny kod */ #pragma omp parallel for private(i) schedule(static) for (i=0; i<np; i++) work(i); ---------------------------------------------------------------------- #pragma omp parallel private(i) /* kod poprawny */ { } i = omp_get_thread_num( ); work(i); barrier wewnątrz bloku critical lub single Open MP 39

Lastprivate, firsprivate - przkład void example(float*a, float*b) { #pragma omp parallel for lastprivate(i) for(i=0; i<k; i++ )a[i] = b[i]; -- i master a równe k #pragma omp parallel for firstprivate(i) for(j=i; j<n; j++ )a[j] = 1.0; } Open MP 40

Dalsze informacje : OPENMP.ORG Open MP 41