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

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

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

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

Przetwarzanie Równoległe i Rozproszone

Wprowadzenie do OpenMP

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

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

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

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

Tworzenie programów równoległych cd. 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

Skalowalność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

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

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

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

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

Programowanie Rozproszone i Równoległe

Architektury systemów równoległych

Wyklad 11 Języki programowania równoległego

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

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

OpenMP część praktyczna

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

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

Równoległe algorytmy sortowania. Krzysztof Banaś Obliczenia równoległe 1

Numeryczna algebra liniowa

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

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

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

Tablice, funkcje - wprowadzenie

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

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

Analiza efektywności przetwarzania współbieżnego

Analiza efektywności przetwarzania współbieżnego. Wykład: Przetwarzanie Równoległe Politechnika Poznańska Rafał Walkowiak Grudzień 2015

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

Wydajność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Algorytmy i Struktury Danych

Nowoczesne technologie przetwarzania informacji

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

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

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

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

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Lab 9 Podstawy Programowania

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

4. Procesy pojęcia podstawowe

OpenMP Szkolenie dla uytkowniku

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

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

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

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

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

Wskaźniki. Informatyka

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

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

O superkomputerach. Marek Grabowski

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

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

Zadania na zaliczenie przedmiotu Przetwarzanie równoległe Zebrał dla roku.ak. 2015/2016 Rafał Walkowiak,

Programowanie procesorów graficznych GPGPU

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

4. Procesy pojęcia podstawowe

Wstęp. do języka C na procesor (kompilator RC51)

Wstęp do programowania

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

2 Przygotował: mgr inż. Maciej Lasota

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

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

Zmienne, stałe i operatory

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Wstęp do Programowania, laboratorium 02

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

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

Szablony klas, zastosowanie szablonów w programach

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

Programowanie współbieżne i rozproszone

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

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

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

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

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

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Język ludzki kod maszynowy

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Argumenty wywołania programu, operacje na plikach

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

Zapoznanie z technikami i narzędziami programistycznymi służącymi do tworzenia programów współbieżnych i obsługi współbieżności przez system.

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

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

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

Transkrypt:

OpenMP

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

Prostota nie ma potrzeby przejmowania się przesyłaniem wiadomości Układ danych i dekompozycja jest obsługiwana automatycznie przez dyrektywy Równoległość inkrementacyjna można pracować na jednej porcji programu w jednym czasie, nie są potrzebne drastyczne zmiany kodu Zunifikowany kod dla szeregowych i równoległych aplikacji konstrukcje OpenMP są traktowane jako komentarz podczas kompilacji przy użyciu sekwencyjnego kompilatora Oryginalny (szeregowy) kod na ogół nie potrzebuje zmian przy jego zrównoleglaniu przy użyciu OpenMP. Redukuje to szanse nieumyślnego wprowadzenia błędów przy konwersji. Zarówno grubo-, jak i drobnoziarnista równoległość jest możliwa.

OpenMP przeznaczony jest wyłącznie do zrównoleglenia kodów działających w systemach z pamięcią wspólną. Wymaga kompilatora wspierającego OpenMP. Skalowalność jest limitowana przepustowością pamięci. Brakuje niezawodnej obsługi błędów. Brakuje drobno-ziarnistych mechanizmów kontroli przypisania wątku do procesora (CPU affinity np. taskset )

Źródło: https://pl.wikipedia.org

format ( dla powiązania z językami C i C++ ): #pragma omp nazwa_dyrektywy lista_klauzul znak_nowej_linii najważniejszymi z dyrektyw są dyrektywy podziału pracy (work sharing constructs), występujące w obszarze równoległym i stosowane do rozdzielenia poleceń realizowanych przez poszczególne procesory najważniejsze klauzule określają sposób traktowania zmiennych przez wątki w obszarze równoległym każda dyrektywa posiada swój własny zestaw dopuszczalnych klauzul

parallel #pragma omp parallel lista_klauzul { /* obszar równoległy */ } lista_klauzul (pusta lub dowolna kombinacja poniższych): if( warunek ) num_threads ( liczba ) klauzule_zmiennych ( private, firstprivate, shared, reduction ) - za chwilę inne

wszystkie wątki w zespole muszą realizować te same dyrektywy podziału pracy (i bariery) nie ma niejawnej bariery przy wejściu rozpoczynanie i kończenie wykonania wybranych dyrektyw może być związane z synchronizacją (realizacją bariery) wątki dzielą się pracą każdy realizuje przydzielone sobie operacje na przydzielonej sobie części danych

single #pragma omp single lista_klauzul {... } lista_klauzul: klauzule_zmiennych ( private, firstprivate, copyprivate ) nowait

sections #pragma omp sections lista_klauzul { #pragma omp section {...} #pragma omp section {...} /* itd. */ } lista_klauzul: private, firstprivate, lastprivate, reduction, nowait obszar równoległy składający się z pojedynczej struktury sections: #pragma omp parallel sections itd.

for #pragma omp for lista_klauzul for(...){...} // pętla w postaci kanonicznej lista_klauzul: klauzule_zmiennych ( private, firstprivate, lastprivate ) schedule( rodzaj, rozmiar_porcji ) ; rodzaje: static, dynamic, guided, runtime inne: reduction, nowait obszar równoległy składający się z pojedynczej równoległej pętli for: #pragma omp parallel for lista_klauzul znak_nowej_linii for(...) {...}

master #pragma omp master znak_nowej_linii {...} critical #pragma omp critical nazwa znak_nowej_linii {...} barrier #pragma omp barrier znak_nowej_linii atomic #pragma omp atomic znak_nowej_linii flush #pragma omp flush lista_zmiennych znak_nowej_linii ordered

klauzule współdzielenia zmiennych: shared zmienna wspólna wątków private zmienna lokalna wątków firstprivate zmienna lokalna wątków z kopiowaną wartością początkową lastprivate zmienna lokalna wątków z wartością końcową równą wartości jaka byłaby przy wykonaniu sekwencyjnym inne dyrektywa threadprivate (zasięg ważności deklaracji jest taki jak zasięg ważności deklarowanych nazw) #pragma omp threadprivate lista_zmiennych znak_nowej_linii

reduction(op, lista_zmiennych) #pragma omp parallel for reduction(+:a) for(i=0;i<n;i++) a += b[i]; możliwe operatory (op): +, *, -,&, ^, możliwe działania w pętli: x = x op wyrażenie, x++, x op= wyrażenie na początku pętli zmienna jest odpowiednio inicjowana wynik po zakończeniu pętli równoległej ma być taki sam jak byłby po wykonaniu sekwencyjnym szczegóły realizacji są pozostawione implementacji

zmienna jest wspólna (dostępna wszystkim wątkom) jeśli: istnieje przed wejściem do obszaru równoległego i nie występuje w dyrektywach i klauzulach czyniących ją prywatną została zdefiniowana wewnątrz obszaru równoległego jako zmienna statyczna zmienna jest prywatna (lokalna dla wątku) jeśli została zadeklarowana dyrektywą threadprivate została umieszczona w klauzuli private lub podobnej (firstprivate, lastprivate, reduction ) została zdefiniowana wewnątrz obszaru równoległego jako zmienna automatyczna jest zmienną sterującą równoległej pętli for

#include<omp.h> #define LICZBA 100 #define LICZBA_W 4 int main( int argc, char *argv[] ) { int j=liczba/liczba_w; int i; int suma=0; #pragma omp parallel for reduction(+:suma) num_threads(liczba_w) for( i=0; i<=liczba; i++) { suma += i; } }

funkcje związane ze środowiskiem wykonania: plik nagłówkowy: omp.h składnia funkcji set: void funkcja( int ); składnia pozostałych funkcji: int funkcja( void ) omp_set_num_threads - ustalenie liczby wątków omp_get_num_threads - pobranie liczby wątków omp_get_num_procs - pobranie liczby procesorów omp_get_thread_num - pobranie rangi konkretnego wątku (master - 0) omp_in_parallel - sprawdzenie wykonania równoległego omp_get_max_threads - pobranie maksymalnej liczby wątków omp_set_dynamic, omp_get_dynamic dostosowywanie liczby wątków omp_set_nested, omp_get_nested umożliwianie zagnieżdzania

funkcje obsługi zamków: typ zamka: omp_lock_t; argumentem funkcji jest zawsze omp_lock_t* omp_init_lock - inicjowanie omp_destroy_lock - niszczenie omp_set_lock - zamykanie omp_test_lock - próba zamykania bez blokowania omp_unset_lock - otwieranie wersje dla zagnieżdżonych zamków funkcje pomiaru czasu: omp_get_wtime czas zegara omp_get_wtick rozdzielczość (dokładność) zegara

liczbę wątków można próbować określić jawnie poprzez: użycie klauzuli num_threads w dyrektywie parallel, np.: #pragma omp parallel num_threads(10) wywołanie procedury omp_set_num_threads, np.: omp_set_num_threads(10); ustalenie zmiennej środowiskowej OMP_NUM_THREADS,np.: $ set OMP_NUM_THREADS = 10 w pozostałych przypadkach liczba wątków jest ustalana przez implementację OpenMP w danym systemie istnieje możliwość dynamicznego ustalania liczby wątków (aby np. umożliwić działanie dla systemów, które nie dysponują liczbą określoną poprzez num_threads)

#ifdef _OPENMP printf( Kompilator rozpoznaje dyrektywy OpenMP\n ); #endif Zmienne środowiskowe OMP_SCHEDULE określenie dla równoległych pętli z klauzulą schedule(runtime) OMP_NUM_THREADS liczba OMP_DYNAMIC TRUE/FALSE OMP_NESTED TRUE/FALSE

#include<omp.h> int main() { #ifdef _OPENMP printf("kompilator rozpoznaje dyrektywy OpenMP\n"); #endif printf("maksymalna liczba watkow - "); scanf("%d",&lwat); omp_set_num_threads(lwat); printf("aktualna liczba watkow %d, moj ID %d\n", omp_get_num_threads(), omp_get_thread_num()); #pragma omp parallel { printf("aktualna liczba watkow %d, moj ID %d\n", omp_get_num_threads(), omp_get_thread_num()); } }

specyfikacja OpenMP określa sposób realizacji dyrektyw i funkcji, który jednak nie gwarantuje poprawności programów (w przeciwieństwie do kompilatorów z automatycznym zrównolegleniem, które wprowadzają wykonanie współbieżne tylko tam, gdzie potrafią zagwarantować prawidłowość realizacji) programy równoległe OpenMP z założenia są przystosowane także do wykonania sekwencyjnego (przy ignorowaniu dyrektyw i wykonywaniu pustych namiastek funkcji)

Można się spodziewać otrzymać N razy mniejszy czas wykonania (lub N-krotne przyspieszenie) podczas przetwarzania równoległego przy użyciu OpenMP na N- procesorowej platformie. W praktyce rzadko ma to miejsce z następujących powodów: Duża część programu może nie być możliwa do zrównoleglenia przy użyciu OpenMP, co oznacza, że teoretyczny górny limit przyspieszenia jest zgodny z prawem Amdahla. N procesorów w SMP może posiadać N * (moc obliczeniowa 1 procesora) mocy, jednak przepustowość pamięci zwykle nie mnoży się przez N. Całkiem często oryginalna ścieżka do pamięci jest współdzielona przez wiele procesorów, obniżenie wydajności może zostać zaobserwowane przy korzystaniu ze współdzielonej pamięci. Wiele innych powszechnych problemów wpływających na przyspieszenie w przetwarzaniu równoległych stosuje się do OpenMp, takich jak równoważenie obciążenia i narzut związany z synchronizacją. [1] [1] pl.wikipedia.org

Cel zrównoleglenia skrócenie czasu działania programów, zwiększenie wydajności obliczeń, uzyskanie szybszego przetwarzania Wyrażanie wydajności: liczba operacji na sekundę (MIPS) lub liczba operacji zmiennoprzecinkowych na sekundę (MFLOPS) niemożliwość oszacowania jak szybko wykonywana jest pojedyncza instrukcja (także zmiennoprzecinkowa) zależność od kontekstu trudność określenia z ilu i jakich instrukcji składa się program miary względne, w których porównuje się czasy wykonania programu (rozwiązania zadania) na jednym i wielu procesorach Przyspieszenie obliczeń: S(p) = T s / T p (p) (lub T p (1) / T p (p) ) Efektywność zrównoleglenia: E(p) = S(p) / p

analiza Amdahla (1967) prawo Amdahla: przy liczbie procesorów zmierzającej do nieskończoności czas rozwiązania określonego zadania nie może zmaleć poniżej czasu wykonania części sekwencyjnej programu, przyspieszenie nie może przekroczyć wartości wyznaczonej przez udział części sekwencyjnej, a efektywność zrównoleglenia zmierza do zera prawo Amdahla stwierdza istotne ograniczenie wydajności programów równoległych co więcej, prawo Amdahla nie uwzględnia: komunikacji, która dodatkowo spowalnia obliczenia równoległe braku zrównoważenia obciążenia procesorów

Źródło: https://commons.wikimedia.org/wiki/

prawo Amdahla dotyczy równoległego rozwiązania z coraz większą liczbą procesorów tego samego zadania (analiza przy stałym rozmiarze zadania) można problem zrównoleglenia postawić jako problem rozwiązania sekwencji zadań przy stałym czasie wykonania analiza Gustafsona (1988) przyspieszenie skalowane: modyfikacja definicji przyspieszenia obliczeń i efektywności zrównoleglenia, tak żeby uwzględnić fakt zwiększania rozmiaru zadania wraz ze wzrostem liczby procesorów przy zmodyfikowanych definicjach możliwe jest uzyskanie przyspieszenia zmierzającego do nieskończoności i efektywności nie spadającej poniżej pewnej stałej wartości

Wnioski z przeprowadzonej analizy: możliwe jest osiągnięcie zadowalających parametrów wykonania równoległego jeżeli: nie dążymy do uzyskania zerowego czasu działania dla pewnego konkretnego zadania o stałym rozmiarze staramy się optymalnie zrównoleglić zadania o rozmiarze rosnącym wraz z liczbą używanych procesorów inaczej: nie po to stosujemy obliczenia (masywnie) równoległe, żeby coraz szybciej rozwiązywać te same zadania, ale po to, żeby efektywnie rozwiązywać zadania coraz większe

Dziękuję za uwagę