OpenMP część praktyczna

Podobne dokumenty
Wprowadzenie do OpenMP

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 zrównoleglania aplikacji z wykorzystaniem standardu 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

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

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

Jędrzej Ułasiewicz Programowanie aplikacji równoległych 1. OpenMP

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

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

for (i=1; i<=10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

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

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

Wartości domyślne, szablony funkcji i klas

Bazy danych. Andrzej Łachwa, UJ, /15

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

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

Zagadnienia transportowe

14.Rozwiązywanie zadań tekstowych wykorzystujących równania i nierówności kwadratowe.

INTENSE BUSINESS INTELLIGENCE PLATFORM

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

Programowanie 2. Język C++. Wykład 2.

Kurs wyrównawczy dla kandydatów i studentów UTP

Arkusz zawiera informacje prawnie chronione do momentu rozpocz cia egzaminu.

Laboratorium Podstawy Przetwarzania Rozproszonego SPRAWOZDANIE z zadania SERWIS KOMPUTEROWY

G PROGRAMMING. Part #4

OpenMP Szkolenie dla uytkowniku

Systemy mikroprocesorowe - projekt

Konfiguracja historii plików

Mnożenie macierzy. Systemy z pamięcią współdzieloną Systemy z pamięcią rozproszoną Efektywność

Praca na wielu bazach danych część 2. (Wersja 8.1)

EGZAMIN MATURALNY Z MATEMATYKI

3S TeleCloud - Aplikacje Instrukcja użytkowania usługi 3S KONTAKTY

epuap Ogólna instrukcja organizacyjna kroków dla realizacji integracji

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

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

SFML. (Simple and Fast Multimedia Library)

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Rozdział VIII Zasady przyjmowania uczniów do szkoły

ASD - ćwiczenia III. Dowodzenie poprawności programów iteracyjnych. Nieformalnie o poprawności programów:

Wstęp do programowania

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

np. tu - na pierwszej formatce kreatora zaznaczamy opcję nr 3

Akademickie Centrum Informatyki PS. Wydział Informatyki PS

Instrukcja obsługi platformy zakupowej e-osaa (klient podstawowy)

KLAUZULE ARBITRAŻOWE

Kompozycja i dziedziczenie klas

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

HPC na biurku. Wojciech De bski

MATEMATYKA 9. INSTYTUT MEDICUS Kurs przygotowawczy do matury i rekrutacji na studia medyczne Rok 2017/2018 FUNKCJE WYKŁADNICZE, LOGARYTMY

ZMIANA TREŚCI SPECYFIKACJI ISTOTNYCH WARUNKÓW ZAMÓWIENIA

Od redakcji. Symbolem oznaczono zadania wykraczające poza zakres materiału omówionego w podręczniku Fizyka z plusem cz. 2.

Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych ul. Koszykowa 75, Warszawa

Połączenie VPN Host-LAN IPSec z wykorzystaniem Windows XP. 1. Konfiguracja serwera VPN. 2. Konfiguracja klienta VPN. 3. Zainicjowanie połączenia

REGULAMIN KONKURSU 1 Postanowienia ogólne : 2 Cel Konkursu 3 Założenia ogólne

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

PAKIET MathCad - Część III

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia: zrd.poznan.pl; bip.poznan.

Metoda wykrywania konfliktów zasobowych w aplikacjach wielowątkowych

Polityka prywatności strony internetowej wcrims.pl

PERSON Kraków

Przykłady wybranych fragmentów prac egzaminacyjnych z komentarzami Technik ochrony fizycznej osób i mienia 515[01]

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Charakterystyka systemów plików

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

API transakcyjne BitMarket.pl

mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 6, strona 1. Format JPEG

OGŁOSZENIE O ZAMÓWIENIU DOSTAWY

ROZPORZĄDZENIE MINISTRA PRACY I POLITYKI SPOŁECZNEJ 1)

Warszawa: Dostawa oraz montaż mebli III Numer ogłoszenia: ; data zamieszczenia: OGŁOSZENIE O ZAMÓWIENIU - dostawy

InsERT GT Własne COM 1.0

SPECYFIKACJA ISTOTNYCH WARUNKÓW ZAMÓWIENIA DLA PRZETARGU NIEOGRANICZONEGO CZĘŚĆ II OFERTA PRZETARGOWA

Zaawansowana adresacja IPv4

Czy przewiduje się udzielenie zaliczek na poczet wykonania zamówienia: nie III.3) WARUNKI UDZIAŁU W POSTĘPOWANIU ORAZ OPIS SPOSOBU DOKONYWANIA OCENY

Wyklad 11 Języki programowania równoległego

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

MATEMATYKA 4 INSTYTUT MEDICUS FUNKCJA KWADRATOWA. Kurs przygotowawczy na studia medyczne. Rok szkolny 2010/2011. tel

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Zestawienie wolnych miejsc w żłobkach publicznych plik do pobrania w formacie doc -od dnia

REGULAMIN PROGRAMU LOJALNOŚCIOWEGO Z PKS-em TANKUJESZ, NAGRODY OTRZYMUJESZ"

SEKCJA I: ZAMAWIAJĄCY SEKCJA II: PRZEDMIOT ZAMÓWIENIA. Zamieszczanie ogłoszenia: obowiązkowe. Ogłoszenie dotyczy: zamówienia publicznego.

Dynamiczne algorytmy tekstowe

PRZYRODA RODZAJE MAP

OGŁOSZENIE O ZAMÓWIENIU

Zarządzanie Zasobami by CTI. Instrukcja

Urząd Zamówień Publicznych Al. Szucha 2/4; Warszawa Zamieszczanie ogłoszeń on-line w BZP: FORMULARZ ZP-400

Statystyczna analiza danych w programie STATISTICA. Dariusz Gozdowski. Katedra Doświadczalnictwa i Bioinformatyki Wydział Rolnictwa i Biologii SGGW

Adres strony internetowej, na której Zamawiający udostępnia Specyfikację Istotnych Warunków Zamówienia:

Zestaw skróconych instrukcji dotyczący najważniejszych operacji w programie Merkury Quattro.

Polska-Łańcut: Energia elektryczna, cieplna, słoneczna i jądrowa 2014/S Ogłoszenie o udzieleniu zamówienia. Dostawy

Komunikacja w sieci Industrial Ethernet z wykorzystaniem Protokołu S7 oraz funkcji PUT/GET

PL-Wrocław: Meble medyczne 2012/S Ogłoszenie o udzieleniu zamówienia. Dostawy

1. Uczniowie kończący gimnazja, dla których organem prowadzącym jest Miasto Bielsko-Biała, wprowadzają swoje dane do komputera w swoich gimnazjach.

Rozdział 6. Pakowanie plecaka. 6.1 Postawienie problemu

Polska-Lublin: Usługi sprzątania 2016/S Ogłoszenie o udzieleniu zamówienia. Usługi

ASTORIA CAPITAL SA Rejestracja w KRS zmian Statutu Spółki

Spis treści 1. Wstęp 2. Projektowanie systemów informatycznych

Transkrypt:

.... OpenMP część praktyczna Zbigniew Koza Wydział Fizyki i Astronomii Uniwersytet Wrocławski Wrocław, 17 marca 2011 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 1 / 34

Spis treści Spis treści...1 Kompilacja Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 2 / 34

Spis treści Spis treści...1 Kompilacja...2 Podział pracy Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 2 / 34

Spis treści Spis treści...1 Kompilacja...2 Podział pracy...3 Synchronizacja Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 2 / 34

Część 1 Kompilacja...1 Kompilacja...2 Podział pracy...3 Synchronizacja Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 3 / 34

Kompilacja Kompilacja #include <omp.h>... > g++ -fopenmp [...] > icc -fopenmp [...] -fopenmp jest to opcja kompilatora i linkera #ifdef _OPENMP... #endif Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 4 / 34

Podział pracy pragma omp parallel Kod zrównoleglony musi zawierać się w ramach bloku #pragma omp parallel Przykład: #pragma omp parallel for for (i = 0; i < rows; i++) for (j = 0; j < columns; j++) v[i] += A[i][j] * u[j]; Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 5 / 34

pragma omp parallel Podział pracy. składnia ogólna.. #pragma omp parallel #pragma omp nazwa dyrektywy opcje i parametry...... Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 6 / 34

pragma omp parallel Podział pracy. składnia ogólna.. #pragma omp parallel #pragma omp nazwa dyrektywy opcje i parametry....... składnia skrócona...#pragma omp parallel nazwa dyrektywy opcje i parametry.. Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 6 / 34

Opcje private i shared Podział pracy Zmienne współdzielone przez wątki deklarujemy w opcji shared Zmienne sterujące pętli Zmienne lokalne w wątku deklarujemy w opcji private Zmienne określające liczbę iteracji pętli Zmienne i tablice tylko do odczytu w pętli Tablice modyfikowane w pętli, jeżeli różne wątki modyfikują ich różne elementy #pragma omp parallel for shared(a, v, u) private(i, j) for (i = 0; i < rows; i++) for (j = 0; j < columns; j++) v[i] += A[i][j] * u[j]; Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 7 / 34

Podział pracy Opcja default(none) Kompilator domyślnie w rozsądny sposób dzieli zmienne na prywatne i współdzielone Opcja default (none) wyłącza ten mechanizm Zaleca się używanie tej opcji #pragma omp parallel for\ default(none) shared(a, v, u) private(i, j) for (i = 0; i < rows; i++) for (j = 0; j < columns; j++) v[i] += A[i][j] * u[j]; Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 8 / 34

Opcja schedule Podział pracy Dyrektywa schedule służy do definiowania sposobu rozdziału pracy na wątki w pętli for. Składnia:. Składnia.. #pragma omp for schedule(rodzaj [,rozmiar_segmentu])... Możliwe rodzaje podziału pracy: static podział dokonany przed uruchomieniem pętli, najmniejszy narzut czasu wykonania dynamic wątki wykonują kolejno pierwszy wolny segment w przestrzeni instrukcji for guided trochę jak w dynamic, wielkość segmentu może ulegać zmniejszaniu runtime podział zależy od wartości zmiennej środowiskowej OMP SCHEDULE Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 9 / 34

Podział pracy Opcja schedule(static) Podział statyczny #pragma omp for schedule(static) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) // parzyste sa coraz bardziej kosztowne for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Iteracja 5 wykonana przez watek nr. 1. Iteracja 0 wykonana przez watek nr. 0. Iteracja 1 wykonana przez watek nr. 0. Iteracja 2 wykonana przez watek nr. 0. Iteracja 3 wykonana przez watek nr. 0. Iteracja 6 wykonana przez watek nr. 1. Iteracja 7 wykonana przez watek nr. 1. Iteracja 4 wykonana przez watek nr. 0. Iteracja 8 wykonana przez watek nr. 1. Iteracja 9 wykonana przez watek nr. 1. czas: 13.486 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 10 / 34

Podział pracy Opcja schedule(static, chunk size) Podział statyczny ze specyfikacją długości segmentu #pragma omp for schedule(static, 1) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) // parzyste sa coraz bardziej kosztowne for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Iteracja 1 wykonana przez watek nr. 1. Iteracja 3 wykonana przez watek nr. 1. Iteracja 5 wykonana przez watek nr. 1. Iteracja 7 wykonana przez watek nr. 1. Iteracja 9 wykonana przez watek nr. 1. Iteracja 0 wykonana przez watek nr. 0. Iteracja 2 wykonana przez watek nr. 0. Iteracja 4 wykonana przez watek nr. 0. Iteracja 6 wykonana przez watek nr. 0. Iteracja 8 wykonana przez watek nr. 0. czas: 20.808 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 11 / 34

Podział pracy Opcja schedule(static, chunk size) Podział statyczny ze specyfikacją długości segmentu (2) #pragma omp for schedule(static, 2) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) // parzyste sa coraz bardziej kosztowne for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Iteracja 0 wykonana przez watek nr. 0. Iteracja 1 wykonana przez watek nr. 0. Iteracja 2 wykonana przez watek nr. 1. Iteracja 3 wykonana przez watek nr. 1. Iteracja 4 wykonana przez watek nr. 0. Iteracja 5 wykonana przez watek nr. 0. Iteracja 6 wykonana przez watek nr. 1. Iteracja 7 wykonana przez watek nr. 1. Iteracja 8 wykonana przez watek nr. 0. Iteracja 9 wykonana przez watek nr. 0. czas: 12.789 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 12 / 34

Podział pracy Opcja schedule(dynamic) Podział dynamiczny #pragma omp for schedule(dynamic) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) // parzyste sa coraz bardziej kosztowne for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Iteracja 0 wykonana przez watek nr. 1. Iteracja 1 wykonana przez watek nr. 0. Iteracja 3 wykonana przez watek nr. 0. Iteracja 2 wykonana przez watek nr. 1. Iteracja 5 wykonana przez watek nr. 1. Iteracja 4 wykonana przez watek nr. 0. Iteracja 7 wykonana przez watek nr. 0. Iteracja 6 wykonana przez watek nr. 1. Iteracja 9 wykonana przez watek nr. 1. Iteracja 8 wykonana przez watek nr. 0. czas: 12.672 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 13 / 34

Podział pracy Opcja schedule(dynamic(chunk size)) Podział dynamiczny ze specyfikacją długości segmentu #pragma omp for schedule(dynamic, 3) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) // parzyste sa coraz bardziej kosztowne for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Iteracja 0 wykonana przez watek nr. 1. Iteracja 3 wykonana przez watek nr. 0. Iteracja 1 wykonana przez watek nr. 1. Iteracja 2 wykonana przez watek nr. 1. Iteracja 4 wykonana przez watek nr. 0. Iteracja 5 wykonana przez watek nr. 0. Iteracja 9 wykonana przez watek nr. 0. Iteracja 6 wykonana przez watek nr. 1. Iteracja 7 wykonana przez watek nr. 1. Iteracja 8 wykonana przez watek nr. 1. czas: 15.23 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 14 / 34

Podział pracy Opcja schedule(guided) Podział naprowadzany #pragma omp for schedule(guided) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) // parzyste sa coraz bardziej kosztowne for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Iteracja 0 wykonana przez watek nr. 1. Iteracja 5 wykonana przez watek nr. 0. Iteracja 1 wykonana przez watek nr. 1. Iteracja 2 wykonana przez watek nr. 1. Iteracja 3 wykonana przez watek nr. 1. Iteracja 4 wykonana przez watek nr. 1. Iteracja 6 wykonana przez watek nr. 0. Iteracja 7 wykonana przez watek nr. 0. Iteracja 9 wykonana przez watek nr. 0. Iteracja 8 wykonana przez watek nr. 1. czas: 13.416 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 15 / 34

Dyrektywa single Podział pracy Dyrektywa single identyfikuje kod wykonywany przez jeden wątek #pragma omp parallel default(none)\ private(i, id, k) shared(z, n, chunk_size) #pragma omp single printf("program jest wykonywany na %d watkach.\n", omp_get_num_threads()); #pragma omp for schedule(guided) for (i = 0; i < n; i++) id = omp_get_thread_num(); if( i % 2 == 0 ) for (k = 1; k < i*100000000; k++) z += 1.0/k; printf("iteracja %d wykonana przez watek nr. %d.\n", i, id); Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 16 / 34

Podział pracy Blok sections Dyrektywa sections wyodrębniania fragmenty kodu wykonywane jednocześnie przez różne wątki Poszczególne zadania umieszcza się w blokach section #pragma omp parallel sections shared(x,y) # pragma omp section cout << "f(x) obliczy watek " << omp_get_thread_num() << "\n"; f(x); # pragma omp section cout << "g(y) obliczy g(y); watek " << omp_get_thread_num() << "\n"; Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 17 / 34

Podział pracy Blok sections Kolejność wykonywania bloków section jest niekreślona, podobnie jak przydział wątków do ich realizacji Poszczególne zadania umieszczone w blokach section muszą być niezależne od siebie #pragma omp parallel sections shared(x,y) # pragma omp section f(x); # pragma omp section g(x); # pragma omp section h(x, x); # pragma omp section j(x, 1); Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 18 / 34

Podział pracy Jak zrównoleglać sumy, iloczyny itp? Suma ma być shared czy private? double suma_zla (int n) double suma = 0; int i; # pragma omp parallel for default(none)\ shared(suma, n) private(i) schedule(static) for (i = 2; i <= n; i++) suma += (!(i & 1))? 1.0 / log(i) : -1.0 / log(i); return suma; Oba rozwiązania złe: n = 100000000 Bez OpenMP: c z a s = 1 0. 6, suma = 0. 9 5 1 4 4 3 OpenMP, s h a r e d, s c h e d u l e ( s t a t i c ) c z a s = 5. 7 9, suma = 148303 OpenMP, s h a r e d, s c h e d u l e ( dynamic) c z a s = 3 4. 0, suma = 8 4. 2 8 7 OpenMP, p r i v a t e, s c h e d u l e ( dynamic) c z a s = 2 1. 2, suma = 0 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 19 / 34

Opcja reduction Podział pracy Opcja reduction służy do definiowania zmiennych jako wyników sum, iloczynów etc. double suma_dobra (int n) double suma = 0; int i; # pragma omp parallel for \ default(none) shared(n) private(i), reduction(+ : suma) for (i = 2; i <= n; i++) suma += (!(i & 1))? 1.0 / log(i) : -1.0 / log(i); return suma; Opcja reduction daje poprawny wynik w rozsądnym czasie: n = 100000000 Bez OpenMP, c z a s : 1 0. 6 2 8, suma = 0. 9 5 1 4 4 3 Z OpenMP, c z a s : 5. 5 8 2, suma = 0. 9 5 1 4 4 3 Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 20 / 34

Opcja reduction Podział pracy Opcję reduction można wykorzystywać z większością operatorów binarnych: +, -, *,ˆ,, &, &&, # pragma omp parallel for \ default(none) shared(n) private(i) reduction(*: iloczyn) for (i = 0; i <= n; i++) iloczyn *= 1/(i*i + 1.0); Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 21 / 34

Dyrektywa if Podział pracy Dyrektywa if służy do warunkowego zrównoleglania pętli # pragma omp parallel for \ if (n > 100000) \ default(none) shared(n) private(i) reduction(*: iloczyn) for (i = 0; i <= n; i++) iloczyn *= 1/(i*i + 1.0); Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 22 / 34

Dyrektywa num threads Podział pracy Dyrektywa num threads służy do określania liczby wątków obsługujących blok parallel # pragma omp parallel for \ if (n > 100000) \ num_threads(2)\ default(none) shared(n) private(i) reduction(*: iloczyn) for (i = 0; i <= n; i++) iloczyn *= 1/(i*i + 1.0); Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 23 / 34

Część 1 Synchronizacja...1 Kompilacja...2 Podział pracy...3 Synchronizacja Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 24 / 34

Synchronizacja Synchronizacja wątków Do synchronizacji lub desynchronizacji pracy wątków służą m.in. dyrektywy: i opcje: barrier critical master atomic nowait Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 25 / 34

Dyrektywa barrier Synchronizacja Dyrektywa barrier wstrzymuje wątki, aż wszystkie wątki zespołu osiągną barierę # pragma omp parallel... # pragma omp barrier... Bariery domyślnie ustawiane są na końcu bloków instrukcji objętych niektórymi dyrektywami, m.in. for, sections i single. Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 26 / 34

Opcja nowait Synchronizacja Opcja nowait wyłącza domyślną barierę # pragma omp parallel... # pragma omp single nowait... # pragma omp for nowait... # pragma omp sections nowait... Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 27 / 34

Synchronizacja Dyrektywa critical Dyrektywa critical tworzy region ( sekcję krytyczną ), który może być wykonywany przez co najwyżej jeden wątek naraz Nazwany region krytyczny obejmuje wszystkie sekcje krytyczne o tej samej nazwie Służy do unikania pościgu (race condition) przy dostępie do zmiennych Powinna zawierać kod, który wykonuje się szybko, by nie blokować pracy innych wątków Nie powinna zastępować innych konstrukcji, np. opcji reduction # pragma omp parallel... # pragma omp critical (sumowanie) suma += suma lokalna w watku;... Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 28 / 34

Dyrektywa atomic Synchronizacja Dyrektywa atomic sygnalizuje, że objęta nią prosta instrukcja przypisania do zmiennej współdzielonej wykona się atomowo (wątek nie zostanie wywłaszczony przed jej zakończeniem). # pragma omp parallel shared(x)... # pragma omp atomic x++;... Dopuszczalne operacje atomowe: ++, --, +=, *=, -=, /=, &=, ˆ =, =, <<=, >>= Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 29 / 34

Funkcje OpenMP Synchronizacja void omp_set_num_threads (int); // ustaw # watkow w nast. parallel int omp_get_num_threads (void); // ile aktywnych watkow? int omp_get_max_threads (void); int omp_get_thread_num (void); // numer watku int omp_get_num_procs (void); // liczba procesorow double omp_get_wtime (void); double omp_get_wtick (void); int omp_in_parallel (void); void omp_set_dynamic (int); int omp_get_dynamic (void); void omp_set_schedule (omp_sched_t, int); void omp_get_schedule (omp_sched_t *, int *); Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 30 / 34

Synchronizacja Zmienne środowiskowe OMP SCHEDULE OMP DYNAMIC OMP NUM THREADS OMP NESTED > env OMP_NUM_THREADS=4./a.out Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 31 / 34

Synchronizacja OpenMP w bibliotece standardowej Przykład: sortowanie 50000000 liczb. const int N = 50000000; std::vector<double> v(n); srand(0); for (int i = 0; i < N; i++) v[i] = rand(); std::sort(v.begin(), v.end()); Kompilacja kompilatorem g++ 4.5 > g++ -O2 -D_GLIBCXX_PARALLEL -fopenmp test.cpp Przyspieszenie: 4 razy na 6-rdzeniowym AMD Phenom II X6 1055T Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 32 / 34

Synchronizacja OpenMP w bibliotece standardowej Przykład: sortowanie 50000000 liczb. const int N = 50000000; std::vector<double> v(n); srand(0); for (int i = 0; i < N; i++) v[i] = rand(); std::sort(v.begin(), v.end()); Kompilacja kompilatorem g++ 4.5 > g++ -O2 -D_GLIBCXX_PARALLEL -fopenmp test.cpp Przyspieszenie: 4 razy na 6-rdzeniowym AMD Phenom II X6 1055T Bez modyfikacji kodu źródłowego!!! Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 32 / 34

Synchronizacja OpenMP w bibliotece standardowej Wśród algorytmów biblioteki standardowej zrównoleglonych w g++ znajdują się m.in.: accumulate inner product partial sum adjacent difference find for each sort stable sort search min element, max element replace Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 33 / 34

Synchronizacja Literatura OpenMP Application Program Interface Version 3.0 May 2008 www.openmp.org Barbara Chapman, Gabriele Jost, Ruud van der Pas, Using OpenMP Portable Shared Memory Parallel Programming, The MIT Press, 2008 Paweł Przybyłowicz, Kurs OpenMP - pierwsze kroki The GNU C++ Library Manual Zbigniew Koza (WFiA UWr) OpenMP część praktyczna 34 / 34