Wprowadzenie do OpenMP

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

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

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

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

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

Przetwarzanie Równoległe i Rozproszone

Programowanie maszyn z pamięcią wspólną w standardzie 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 Jesień 2014

OpenMP część praktyczna

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

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

Techniki Programowania wskaźniki

Sosnowiec, dn... Imię i nazwisko...

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

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

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

I - Microsoft Visual Studio C++

Programowanie Rozproszone i Równoległe

Część 4 życie programu

OpenMP Szkolenie dla uytkowniku

Wyklad 11 Języki programowania równoległego

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

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

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

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

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

HPC na biurku. Wojciech De bski

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

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Podstawy języka skryptowego Lua

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

Programowanie Procedurale

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

Przekazywanie argumentów wskaźniki

Wstęp do Informatyki

Kontrola przebiegu programu

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Programowanie obiektowe w C++ Wykład 12

Szablon klasy std::vector

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

TEMAT : KLASY POLIMORFIZM

Wstęp do programowania

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

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

Wstęp do programowania. Wykład 1

Wstęp do programowania

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

1 Podstawy c++ w pigułce.

Programowanie procesorów graficznych w CUDA.

Obsługa wyjątków. Język C++ WW12

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

C++ wprowadzanie zmiennych

tablica: dane_liczbowe

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

Języki i metodyka programowania. Wprowadzenie do języka C

Programowanie Obiektowe i C++

Programowanie w języku C++

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

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

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

Podstawy Programowania. Wykład 1

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Pytania sprawdzające wiedzę z programowania C++

Zadania: 1. Funkcja przeliczająca F na C: float FtoC(float f){ return (f 32.0) * 5.0 / 9.0; }

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

C++ - [1-3] Debugowanie w Qt Creator

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Czym jest całka? Całkowanie numeryczne

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

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Podstawy Programowania

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Wstęp do Programowania 2

Programowanie komputerowe. Zajęcia 1

Laboratorium 1 - Programowanie proceduralne i obiektowe

Technologie cyfrowe semestr letni 2018/2019

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Programowanie - wykład 4

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

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

1. Wypisywanie danych

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

Programowanie proceduralne w języku C++ Podstawy

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

Transkrypt:

Wprowadzenie do OpenMP OZUKO Kamil Dworak OZUKO Wprowadzenie do OpenMP Kamil Dworak 1 / 25

OpenMP (ang. Open Multi-Processing) opracowany w 1997 przez radę Architecture Review Board, obliczenia rówoległe z użyciem pamięci wspólnej (ang. Shared Memory Computation), rozszerzenie C/C++ i Fortran o nowe dyrektywy kompilatora, biblioteki funkcji oraz zmienne środowiskowe, obliczenia wykonywane są za pomocą 1 procesu, składającego się z zespołu wątków. OZUKO Wprowadzenie do OpenMP Kamil Dworak 2 / 25

Realizacja programu równoległego Rysunek: Realizacja programu równoległego za pomocą OpenMP OZUKO Wprowadzenie do OpenMP Kamil Dworak 3 / 25

Pierwszy program #include <iostream> #include <omp.h> using namespace std; int main() #pragma omp parallel cout << "Watek " << omp_get_thread_num() << "pracuje \n"; if(omp_get_thread_num() == 2) cout << "Dodatkowe obliczenia\n"; system("pause"); return 0; OZUKO Wprowadzenie do OpenMP Kamil Dworak 4 / 25

Wynik działania Wynik działania powyższego programu Watek 0 pracuje Watek 2 pracuje Dodatkowe obliczenia Watek 1 pracuje Watek 3 pracuje OZUKO Wprowadzenie do OpenMP Kamil Dworak 5 / 25

Konstrukcja równoległa Wszystkie funkcje OpenMP znajdują się w pliku: #include <omp.h> Za pomocą dyrektyw preprocesora wskazujemy kompilatorowi fragmenty programu, które mają być realizowane równolegle. Ogólna postać dyrektywy: #pragma omp [klauzula1 klauzula2] Przykład: #pragma omp parallel shared(tab) lastprivate(i) OZUKO Wprowadzenie do OpenMP Kamil Dworak 6 / 25

Kompilacja programu równoległego Kompilacja programu równoległego może zostać zrealizowana za pomocą: GCC gcc -fopenmp program_zrodlowy.c -o program_wynikowy liczbę aktywnych wątków można ustawić wykorzystując komendę: setenv OMP_NUM_THREADS 6 Visual Studio ProjectPreferences ConfigurationProperties C\C + + Language OpenMPSupport Yes(/openmp). OZUKO Wprowadzenie do OpenMP Kamil Dworak 7 / 25

Ustawienie liczby wątków z poziomu kody za pomocą funkcji omp_set_num_threads() #include <iostream> #include <omp.h> using namespace std; int main() omp_set_num_threads(4); //... klauzula num_threads: #pragma omp parallel num_threads(2) zmienna środowiskowa Visual Studio - Project Preferences ConfigurationProperties Debugging Environment OMP_NUM_THREADS=4 OZUKO Wprowadzenie do OpenMP Kamil Dworak 8 / 25

Podział obliczeń Rysunek: Podział obliczeń OZUKO Wprowadzenie do OpenMP Kamil Dworak 9 / 25

Konstrukcja iteracyjna for //... const int N = 10; int main() int i; int result[10] = ; int tab[n] = 0, 1, 2, 3, 4, 5, 6, 7,8,9 ; omp_set_num_threads(4); #pragma omp parallel shared(result, tab, N) \ private(i) #pragma omp for for(i = 0; i < N; i ++) result[i] = tab[i] * tab[i]; printf("wynik: %d (watek = %d) ", result[i], omp_get_thread_num()); //... OZUKO Wprowadzenie do OpenMP Kamil Dworak 10 / 25

Konstrukcja iteracyjna for Wynik działania powyższego programu: Wynik: 0 (watek = 0) Wynik: 1 (watek = 0) Wynik: 36(watek = 2) Wynik: 64(watek = 3) Wynik: 81(watek = 3) Wynik: 49(watek = 2) Wynik: 4 (watek = 0) Wynik: 9 (watek = 1) Wynik: 16(watek = 1) Wynik: 25(watek = 1) OZUKO Wprowadzenie do OpenMP Kamil Dworak 11 / 25

Konstrukcja iteracyjna for Wersja oryginalna: #pragma omp parallel [klauzule] #pragma omp for [klauzule] for(int i = 0; i < N; i++) Dopuszczalna wersja skrócona: #pragma omp parallel for [klauzule] for(int i = 0; i < N; i++) OZUKO Wprowadzenie do OpenMP Kamil Dworak 12 / 25

Problem redukcji //... int buffor; #pragma omp parallel shared(suma, tab, N) private (buffor) buffor = 0; #pragma omp for for(int i = 0; i < N; i++) buffor += tab[i]; #pragma omp critical suma += buffor; //... OZUKO Wprowadzenie do OpenMP Kamil Dworak 13 / 25

Problem redukcji Klauzula reduction: //... #pragma omp parallel for shared(n, tab) reduction(+:suma) for(int i = 0; i < N; i ++) suma += tab[i]; //... Operatory redukcji: + - * & ˆ && OZUKO Wprowadzenie do OpenMP Kamil Dworak 14 / 25

Konstrukcja sekcji sections Dyrektywa sections: #pragma omp parallel #pragma omp sections #pragma omp section dodaj(tab1, tab2); #pragma omp section odejmij(tab3, tab4); #pragma omp section pomnoz(tab5, tab6); OZUKO Wprowadzenie do OpenMP Kamil Dworak 15 / 25

Konstrukcja pojedynczego wątku Dyrektywa single: #pragma omp parallel #pragma omp single printf("start - watek: %d\n", omp_get_thread_num()); // obliczenia... #pragma omp single printf("koniec - watek: %d\n", omp_get_thread_num()); OZUKO Wprowadzenie do OpenMP Kamil Dworak 16 / 25

Podział obliczeń (3) - konstrukcja pojedynczego wątku Dyrektywa master: #pragma omp parallel #pragma omp master printf("start - watek: %d\n", omp_get_thread_num()); // obliczenia... #pragma omp master printf("koniec - watek: %d\n", omp_get_thread_num()); OZUKO Wprowadzenie do OpenMP Kamil Dworak 17 / 25

Wyniki działania (3) - konstrukcja pojedynczego wątku Wyniki działania dla konstrukcji pojedynczego wątku: Single: Start - watek: 0 Koniec - watek: 2 Master: Start - watek: 0 Koniec - watek: 0 OZUKO Wprowadzenie do OpenMP Kamil Dworak 18 / 25

Master - Przykład Drugi #pragma omp parallel #pragma omp for shared(n, wyniki) for(int i = 0; i < N; i ++) wyniki = obliczwartoscfunkcji(i); #pragma omp master for(int i = 0; i < N; i ++) cout << wyniki[i] << endl; #pragma omp for // kolejne obliczenia... OZUKO Wprowadzenie do OpenMP Kamil Dworak 19 / 25

Pozostałe klauzule firstprivate: #pragma omp parallel for firstprivate(a) private(i) shared(tab) for(i = 0; a > 0; i ++) result[i] = tab[i] * a; a--; lastprivate: #pragma omp parallel for lastprivate(i) \ shared(tab1, tab2, N) for(i = 0; i < N; i ++) result[i] = tab1[i] * tab2[i]; OZUKO Wprowadzenie do OpenMP Kamil Dworak 20 / 25

Pozostałe klauzule default: nowait: #pragma omp parallel for default(shared) for(int i = 0; i < N; i ++) result[i] = tab1[i] * tab2[i]; #pragma omp sections nowait #pragma omp section func1(); #pragma omp section func2(); OZUKO Wprowadzenie do OpenMP Kamil Dworak 21 / 25

Pozostałe klauzule if: num_threads: #pragma omp parallel if(n > 100000) shared(tab, N) #pragma omp for for(int i = 0; i < N; i ++) //... #pragma omp parallel num_threads(2) #pragma omp single cout << "Start!\n"; //... OZUKO Wprowadzenie do OpenMP Kamil Dworak 22 / 25

Pozostałe klauzule barrier: atomic: #pragma omp parallel private(id) shared(n) id = omp_get_thread_num(); duzaliczbaobl(id); #pragma omp barrier #pragma omp for //... #pragma omp for private(i) shared(wyniki, czynnik, N) for(i = 0; i < N; i++) wyniki[i] = i * czynnik; #pragma omp atomic czynnik -= 2; // dopuszczalne operacje: + - * / & ^ << >> OZUKO Wprowadzenie do OpenMP Kamil Dworak 23 / 25

Pozostałe klauzule ordered: #pragma omp parallel for shared(result, N) ordered for(int i = 0; i < N; i++) result[i] = i + i; #pragma omp ordered cout << result[i] << endl; // 0, 2, 4, 6, 8, 10... OZUKO Wprowadzenie do OpenMP Kamil Dworak 24 / 25

Pomiar czasu Pomiar czasu wykonywania programu możemy zrealizować za pomocą: omp_get_wtime double start = omp_get_wtime(); // obliczenia... double end = omp_get_wtime(); cout << "Czas trawnia programu: " << end - start << endl; clock_t #include <ctime> //... clock_t start = clock(); // obliczenia... clock_t end = clock(); cout << "Czas trwania programu: " << end - start << endl; OZUKO Wprowadzenie do OpenMP Kamil Dworak 25 / 25