Programowanie systemów z pamięcią wspólną specyfikacja OpenMP
Transkrypt
Programowanie systemów z pamięcią wspólną specyfikacja OpenMP
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