Programowanie systemów z pamięcią wspólną specyfikacja OpenMP Krzysztof Banaś Obliczenia równoległe 1
OpenMP Przenośność oprogramowania Model SPMD Szczegółowe wersje (bindings) dla różnych języków programowania Elementy składowe: dyrektywy dla kompilatorów funkcje biblioteczne zmienne środowiskowe Krzysztof Banaś Obliczenia równoległe 2
OpenMP składnia dyrektyw 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 pracu (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 Krzysztof Banaś Obliczenia równoległe 3
OpenMP składnia dyrektyw 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 Krzysztof Banaś Obliczenia równoległe 4
OpenMP liczba wątków 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) Krzysztof Banaś Obliczenia równoległe 5
Narzut OpenMP Krzysztof Banaś Obliczenia równoległe 6
OpenMP funkcje biblioteczne 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 Krzysztof Banaś Obliczenia równoległe 7
OpenMP funkcje biblioteczne 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 Krzysztof Banaś Obliczenia równoległe 8
OpenMP makro preprocesora i zmienne środowiskowe #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 Krzysztof Banaś Obliczenia równoległe 9
OpenMP przykład #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()); } Krzysztof Banaś Obliczenia równoległe 10
OpenMP traktowanie zmiennych 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 Krzysztof Banaś Obliczenia równoległe 11
OpenMP traktowanie zmiennych 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 Krzysztof Banaś Obliczenia równoległe 12