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