7.
7.
OpenMP
OpenMP
.
.
Dyrektywy, funkcje i zmienne
Dyrektywy, funkcje i zmienne
Lesław Sieniawski © 2010
Dyrektywy
Dyrektywy
Posta
Posta
ć
ć
dyrektyw kompilatora
dyrektyw kompilatora
#pragma omp nazwa_dyrektywy klauzula… ¶
omp
= słowo kluczowe OpenMP
…
= opcjonalne powtarzanie
¶
= znak nowej linii
Dyrektywa
#pragma
przekazuje polecenia zale
ż
ne
od implementacji:
dyrektywa rozpoznana – wykonywana
nierozpoznana – ignorowana
Posta
Posta
ć
ć
dyrektyw kompilatora (2)
dyrektyw kompilatora (2)
Po niektórych dyrektywach wyst
ę
puje blok
instrukcji (lub pojedyncza instrukcja)
Blok instrukcji
w j
ę
zyku C:
{
instrukcja1;
…
instrukcjaN;
}
Blok instrukcji w j
ę
zyku C+OpenMP mo
ż
e zawiera
ć
dodatkowo konstrukcje
OpenMP
.
<blok_instrukcji>
Posta
Posta
ć
ć
dyrektyw kompilatora (3)
dyrektyw kompilatora (3)
Konstrukcja
(ang. construct):
#pragma omp
… ¶
{
instrukcja1;
…
instrukcjaN;
}
<konstrukcja>
Klauzule wsp
Klauzule wsp
ó
ó
ł
ł
dzielenia danych
dzielenia danych
default (shared | none)
default(shared)
zmienne zadeklarowane
na wy
ż
szym poziomie s
ą
w bloku instrukcji
domy
ś
lnie dost
ę
pne jako zmienne
współdzielone
default(none)
nie działa domy
ś
lny sposób
dost
ę
pno
ś
ci zmiennych w bloku instrukcji
Dotyczy dyrektyw:
parallel
i
task
Klauzule wsp
Klauzule wsp
ó
ó
ł
ł
dzielenia danych (2)
dzielenia danych (2)
shared(
lista
)
– deklaracja jednej lub wi
ę
kszej
liczby zmiennych jako współdzielonych przez w
ą
tki
Dotyczy dyrektyw:
parallel
i
task
• reduction(operator:
lista
)
–
żą
danie
akumulacji warto
ś
ci okre
ś
lonej przez
operator
;
akumulacja zachodzi na prywatnych kopiach
zmiennych wskazanych na
liście.
Po wykonaniu
regionu zakumulowane warto
ś
ci s
ą
ł
ą
czone w
oryginalnych zmiennych. Zmienne musz
ą
by
ć
typu
skalarnego, zadeklarowane jako
shared
Klauzula
Klauzula
reduction
reduction
Dozwolone operatory
0
alternatywa logiczna
||
1
koniunkcja logiczna
&&
0
alternatywa rozł
ą
czna
^
0
alternatywa bitowa
|
~0
koniunkcja bitowa
&
0
odejmowanie
-
1
mno
ż
enie
*
0
dodawanie
+
Warto
ść
pocz
ą
tkowa
Operacja
Operator
Klauzule wsp
Klauzule wsp
ó
ó
ł
ł
dzielenia danych (3)
dzielenia danych (3)
private(
lista
)
- deklaruje zmienne jako
prywatne dla w
ą
tku, bez nadawania warto
ś
ci
pocz
ą
tkowych
firstprivate(
lista
)
- deklaruje zmienne
jako prywatne dla w
ą
tku i nadaje im warto
ś
ci
pocz
ą
tkowe oryginalnych zmiennych w chwili
wej
ś
cia do regionu
lastprivate(
lista
)
- deklaruje zmienne jako
prywatne dla w
ą
tku i w chwili wyj
ś
cia z
regionu kopiuje je do oryginalnych zmiennych
Klauzule kopiowania danych
Klauzule kopiowania danych
copyin
(
lista
)
- kopiuje warto
ś
ci
zmiennych threadprivate w
ą
tku głównego
do zmiennych threadprivate wszystkich
w
ą
tków regionu
parallel
, przed
wej
ś
ciem do tego regionu
copyprivate
(
lista
)
- rozgłasza warto
ś
ci
zmiennych threadprivate danego w
ą
tku do
zmiennych threadprivate innych w
ą
tków
regionu
parallel
,
Dotyczy dyrektywy
single
Klauzule podzia
Klauzule podzia
ł
ł
u p
u p
ę
ę
tli na fragmenty
tli na fragmenty
schedule(
typ [
,chunk])
gdzie
typ
przyjmuje warto
ś
ci:
– static
– iteracje dzieli si
ę
na fragmenty długo
ś
ci
chunk
i statycznie przypisuje do w
ą
tków. Je
ś
li liczba
fragmentów przekracza liczb
ę
w
ą
tków, przypisanie
nast
ę
puje wg algorytmu Round-Robin
– dynamic
- iteracje dzieli si
ę
na fragmenty długo
ś
ci
chunk
i statycznie przypisuje do w
ą
tków. Gdy w
ą
tek
wykona swój fragment, pobiera nast
ę
pny
– auto
– przydziału fragmentów do w
ą
tków dokonuje
system operacyjny
chunk
– długo
ść
fragmentu; wyra
ż
enie całkowite
Inne klauzule
Inne klauzule
num_threads(n)
- w regionie
równoległym dost
ę
pnych b
ę
dzie
n
w
ą
tków
nowait
– usuni
ę
cie domy
ś
lnej bariery na
ko
ń
cu bloku instrukcji
Wyst
Wyst
ę
ę
powanie klauzul w dyrektywach
powanie klauzul w dyrektywach
[źródło: http://computing.llnl.gov/tutorials/openMP/]
Konstrukcja
Konstrukcja
parallel
parallel
#pragma omp parallel klauzula… ¶
<blok_instrukcji>
Semantyka: konstrukcja tworzy grup
ę
w
ą
tków i rozpoczyna
region równoległy
Klauzule:
if(
wyrażenie skalarne
)
num_threads(
wyrażenie typu int
)
default(shared | none)
private(
lista
)
firstprivate(
lista
)
shared(
lista
)
copyin(
lista
)
reduction(
operator
:
lista
)
Konstrukcja
Konstrukcja
parallel
parallel
(2)
(2)
Liczba w
ą
tków
w regionie równoległym zale
ż
y od:
Liczby procesorów
Klauzuli
if
:
if(0)
jeden w
ą
tek, inaczej – wiele
Klauzuli
num_threads(n)
: n = liczba w
ą
tków
Wywołania funkcji
omp_set_num_threads(n)
Warto
ś
ci zmiennej
ś
rodowiska
OMP_NUM_THREADS
Regiony równoległe mog
ą
by
ć
zagnie
ż
d
ż
one
Konstrukcje podzia
Konstrukcje podzia
ł
ł
u zadania
u zadania
Kontrukcja podziału zadania
(ang. Work
Sharing Construct) przypisuje odpowiednie
fragmenty kodu do istniej
ą
cych ju
ż
w
ą
tków
– Musi zawiera
ć
si
ę
w regionie
parallel
– Nie tworzy nowych w
ą
tków
– Wykorzystuje w
ą
tki regionu
parallel
– Zawiera barier
ę
na ko
ń
cu
– Pragma
for
– Pragma
sections
– Pragma
single
Pragma
Pragma
for
for
#pragma omp for klauzula… ¶
<blok_instrukcji>
Semantyka: uruchamia równoległe wykonanie iteracji
zawartych w bloku
for
. Na ko
ń
cu bloku umieszczona
jest niejawnie bariera, chyba
ż
e podano klauzul
ę
nowait
Klauzule:
schedule(
typ [,
chunk
])
private(
lista
)
firstprivate(
lista
)
shared(
lista
)
copyin(
lista
)
reduction(
operator
:
lista
)
nowait
Pragma
Pragma
for
for
(2)
(2)
U
ż
ycie:
Pragma
for
musi wyst
ą
pi
ć
wewn
ą
trz konstrukcji
#pragma parallel
W tre
ś
ci p
ę
tli
for
nie mo
ż
e wyst
ą
pi
ć
instrukcja
break
Zmienna steruj
ą
ca p
ę
tli musi by
ć
typu
int
Warto
ść
pocz
ą
tkowa zmiennej steruj
ą
cej p
ę
tli musi by
ć
typu
int
Warunek zako
ń
czenia p
ę
tli musi by
ć
operatorem relacji
ze zbioru
{ <, <=, >, >= }
Skok warto
ś
ci zmiennej steruj
ą
cej p
ę
tli musi by
ć
całkowity
chunk
– dodatnia liczba całkowita
Pragma
Pragma
sections
sections
#pragma omp sections klauzula… ¶
{
#pragma omp section ¶
<blok_instrukcji>
#pragma omp section ¶
<blok_instrukcji>
…
}
Semantyka: wskazanie fragmentów kodu, które mog
ą
by
ć
wykonane przez odr
ę
bne w
ą
tki
U
ż
ycie: Pragma
sections
musi wyst
ą
pi
ć
wewn
ą
trz
konstrukcji
#pragma parallel
Pragma
Pragma
sections
sections
(2)
(2)
Klauzule:
private(
lista
)
firstprivate(
lista
)
lastprivate(
lista
)
reduction(
operator
:
lista
)
nowait
R
eg
io
n
p
a
r
a
l
l
e
l
Pragma
parallel
Bariera
parallel
Bariera
sections
Pragma
sections
sekcje
master
master
[n
a
p
o
d
st
aw
ie
:
J.
U
ła
si
ew
ic
z…
]
Kombinowane konstrukcje
Kombinowane konstrukcje
parallel
parallel
#pragma omp parallel for klauzula… ¶
<p
ę
tla_for>
#pragma omp parallel sections klauzula… ¶
{
#pragma omp section ¶
<blok_instrukcji>
#pragma omp section ¶
<blok_instrukcji>
…
}
Klauzule: z sumy zbiorów dot. pragmy
parallel
i odpowiednio pragmy
for
lub
sections
Pragma
Pragma
single
single
#
pragma omp single klauzula… ¶
<blok_instrukcji>
Semantyka:
definiuje fragment kodu, który ma by
ć
wykonany przez
(tylko) jeden w
ą
tek grupy
Klauzule:
private(
lista
)
firstprivate(
lista
)
nowait
U
ż
ycie:
W bloku obj
ę
tym przez pragm
ę
parallel
Dla zapewnienia,
ż
e dany fragment kodu zostanie wykonany tylko
jeden raz (np. operacja we/wy)
Pragma
Pragma
task
task
#pragma omp task klauzula… ¶
<blok_instrukcji>
Semantyka: Konstrukcja okre
ś
la jawne podzadanie; jego
ś
rodowisko danych tworzone jest na podstawie klauzul
dost
ę
pu do danych i zasad domy
ś
lnych
Klauzule:
if
(wyrażenie_skalarne
)
untied
default(shared | none)
private(lista)
firstprivate(lista)
shared(lista)
Konstrukcje synchronizacyjne
Konstrukcje synchronizacyjne
Pragma
master
– wykonanie bloku instrukcji
tylko przez w
ą
tek główny
Pragma
critical
– wykonanie bloku instrukcji
z wykluczeniem równoczesno
ś
ci w
ą
tków (sekcja
krytyczna)
Pragma
ordered
– wykonanie bloku instrukcji
w okre
ś
lonej kolejno
ś
ci w
ą
tków
Pragma
atomic
– wykonanie bloku instrukcji jako
instrukcji atomowej
Pragma
barrier
– jawna deklaracja bariery
Pragma
Pragma
master
master
#pragma omp master ¶
<blok_instrukcji>
Semantyka:
Konstrukcja wskazuje blok instrukcji do
wykonania przez w
ą
tek główny. Nie tworzy
implikowanych barier
U
ż
ycie:
W bloku obj
ę
tym przez pragm
ę
parallel
Pragma
Pragma
critical
critical
#pragma omp critical [(
nazwa
)] ¶
<blok_instrukcji>
Semantyka: (sekcja krytyczna) konstrukcja kontroluje dost
ę
p
w
ą
tków do bloku instrukcji – w danej chwili mo
ż
e go wykonywa
ć
tylko jeden w
ą
tek. Inne w
ą
tki b
ę
d
ą
oczekiwa
ć
na wej
ś
cie do
sekcji krytycznej,
a
ż
do jej opuszczenia przez w
ą
tek wykonuj
ą
cy zawarte w niej
instrukcje
Nazwa
– opcjonalny identyfikator sekcji krytycznej; sekcje
krytyczne z t
ą
sam
ą
nazw
ą
s
ą
uto
ż
samiane
U
ż
ycie:
W bloku obj
ę
tym przez pragm
ę
parallel
Blok instrukcji nie mo
ż
e zawiera
ć
rozgał
ę
zie
ń
Pragma
Pragma
ordered
ordered
#pragma omp ordered ¶
<blok_instrukcji>
Semantyka: polecenie wykonania bloku instrukcji
z zachowaniem kolejno
ś
ci iteracji – w
ą
tki b
ę
d
ą
wykonywane w kolejno
ś
ci, w jakiej zmienia si
ę
warto
ść
zmiennej steruj
ą
cej
U
ż
ycie: dotyczy bloku zawartego w konstrukcji
for
Pragma
Pragma
atomic
atomic
#pragma omp atomic ¶
<wyra
ż
enie>
Semantyka:
żą
danie aktualizacji pami
ę
ci w trybie
wył
ą
cznym (mini-sekcja krytyczna)
U
ż
ycie: obejmuje tylko jedn
ą
, najbi
ż
sz
ą
instrukcj
ę
Pragma
Pragma
flush
flush
#pragma omp flush(
lista
) ¶
<wyra
ż
enie>
Semantyka: jawne polecenie uzyskania spójno
ś
ci
obrazu pami
ę
ci operacyjnej przez przepisanie do niej
warto
ś
ci zmiennych znajduj
ą
cych si
ę
w pami
ę
ciach
podr
ę
cznych (ang. cache) poszczególnych
procesorów
lista
– wykaz zmiennych, których dotyczy ta czynno
ść
(pozwala ograniczy
ć
ilo
ść
operacji aktualizacji)
Pragma
Pragma
barrier
barrier
#pragma omp barrier ¶
Semantyka: jawne okre
ś
lenie bariery; ka
ż
dy z w
ą
tków
regionu równoległego b
ę
dzie oczekiwał, a
ż
wszystkie
w
ą
tki osi
ą
gn
ą
ten punkt synchronizacji
U
ż
ycie: konstrukcja nie obejmuje bloku instrukcji
Inne.
Inne.
Pragma
Pragma
threadprivate
threadprivate
#pragma omp threadprivate(
lista
)¶
Semantyka: ustanowienie trwało
ś
ci zmiennych
wymienionych na
liście
.
Zmienne te b
ę
d
ą
zachowane przy kolejnych wej
ś
ciach do regionów
równoległych
U
ż
ycie: nie zawiera bloku instrukcji
Funkcje
Funkcje
Klasyfikacja funkcji
Klasyfikacja funkcji
OpenMP
OpenMP
Zarz
ą
dzanie
ś
rodowiskiem wykonawczym
– ustawianie i badanie warto
ś
ci zmiennych
ś
rodowiska
Synchronizacja w
ą
tków
– Tworzenie/usuwanie zamków,
– Zamykanie/otwieranie zamków
Pomiar czasu wykonania oblicze
ń
– Pobieranie czasu wzgl
ę
dnego
– Badanie rozdzielczo
ś
ci (wirtualnego) zegara
maszynowego
Funkcje zarz
Funkcje zarz
ą
ą
dzania
dzania
ś
ś
rodowiskiem wykonawczym
rodowiskiem wykonawczym
void omp_set_num_threads(int liczba_w
ą
tków)
Semantyka: odczytanie liczby w
ą
tków, które mog
ą
by
ć
wykorzystane w najbli
ż
szym regionie równoległym
int omp_get_num_threads(void)
Semantyka: odczytanie liczby w
ą
tków, które mog
ą
by
ć
wykorzystane w bie
żą
cym regionie równoległym
int omp_get_max_threads(void)
Semantyka: odczytana warto
ść
odpowiada zmiennej
ś
rodowiska OMP_NUM_THREADS
int omp_get_thread_num(void)
Semantyka: odczytanie numeru nadanego bie
żą
cemu
w
ą
tkowi
Funkcje zarz
Funkcje zarz
ą
ą
dzania
dzania
ś
ś
rodowiskiem wykonawczym (2)
rodowiskiem wykonawczym (2)
int omp_get_num_procs(void)
Semantyka: odczytanie liczby zainstalowanych
procesorów
void omp_set_dynamic(int w
ą
tki_dynamiczne)
Semantyka: ustalanie czy w sekcji równoległej w
ą
tki maj
ą
by
ć
zarz
ą
dzane w sposób dynamiczny
U
ż
ycie: w
ą
tki_dynamiczne=0
niedozwolone,
w
ą
tki_dynamiczne=!0
dozwolone
int omp_get_dynamic(void)
Semantyka: odczytanie, czy dynamiczne ustalanie liczby
watków jest dozwolone
U
ż
ycie: zob.
omp_set_dynamic()
Synchronizacja w
Synchronizacja w
ą
ą
tk
tk
ó
ó
w
w
void omp_init_lock(omp_lock_t
*lock)
Semantyka:
utworzenie (otwartego) zamka
;
void omp_set_lock omp_lock_t
*lock)
Semantyka: zamek otwarty
zamkni
ę
cie
zamka
przez bie
żą
cy w
ą
tek; zamek zamkni
ę
ty
blokada bie
żą
cego w
ą
tka
a
ż
do otwarcia
zamka
lock
– identyfikator zamka
Synchronizacja w
Synchronizacja w
ą
ą
tk
tk
ó
ó
w (2)
w (2)
void omp_unset_lock(omp_lock_t *lock)
Semantyka:
otwarcie zamka
; w
ą
tek zablokowa-
ny przez ten zamek zostanie wznowiony
void omp_destroy_lock(omp_lock_t *lock)
Semantyka:
usuni
ę
cie zamka
lock
– identyfikator zamka
Pomiar czasu wykonania oblicze
Pomiar czasu wykonania oblicze
ń
ń
double omp_get_wtime(void)
Semantyka: odczytanie liczby sekund, jakie
upłyn
ę
ły od ustalonej chwili w (dawnej) przeszło
ś
ci
U
ż
ycie: obl. ró
ż
nicy warto
ś
ci pobranych PO i
PRZED wykonaniem badanego fragmentu programu
double omp_get_wtick(void)
Semantyka: odczytanie liczby sekund upływaj
ą
cych
pomi
ę
dzy kolejnymi przerwaniami zegarowymi
Uwaga: Nie zawsze podaje sensowne warto
ś
ci (!)
Zmienne
Zmienne
Zmienne
Zmienne
ś
ś
rodowiska
rodowiska
OMP_SCHEDULE typ [,chunk]
Semantyka: ustala sposób szeregowania w
ą
tków
i wielko
ść
fragmentu p
ę
tli (zob. klauzula
schedule
)
OMP_NUM_THREADS liczba_w
ą
tków
Semantyka: ustala liczb
ę
w
ą
tków dost
ę
pnych w
regionach równoległych
OMP_DYNAMIC dynamic
Semantyka: kontroluje dynamiczne ustalanie liczby
w
ą
tków dost
ę
pnych w regionach równoległych;
dynamic
=
true
lub
false
(zob. funkcja
omp_set_dynamic()
)
Zmienne
Zmienne
ś
ś
rodowiska (2)
rodowiska (2)
OMP_NESTED nested
Semantyka: kontroluje mo
ż
liwo
ść
zagł
ę
biania
regionów równoległych; nested =
true
lub
false
(zob. funkcja
omp_set_nested()
)
OMP_STACKSIZE wielko
ść
_stosu
Semantyka: okre
ś
la pojemno
ść
stosu w
ą
tków;
wielko
ść
_stosu (nieujemna liczba całkowita)
mo
ż
e by
ć
uzupełniona liter
ą
B, K, M lub G
oznaczaj
ą
c
ą
mno
ż
nik (domy
ś
lnie K)
Zmienne
Zmienne
ś
ś
rodowiska (3)
rodowiska (3)
OMP_WAIT_POLICY policy
Semantyka: ustala sposób zachowania czekaj
ą
cych
w
ą
tków;
policy = active
czekanie aktywne
(z wykorzystaniem CPU),
policy = passive
czekanie bez wykorzystania CPU
OMP_MAX_ACTIVE_LEVELS liczba_regionów
Semantyka: ustala maksymaln
ą
liczb
ę
aktywnych
zagnie
ż
dzonych regionów równoległych
OMP_THREAD_LIMIT limit_liczby_w
ą
tków
Semantyka: ustala maksymaln
ą
liczb
ę
w
ą
tków
uczestnicz
ą
cych w wykonaniu programu OpenMP