background image

7.

7.

OpenMP

OpenMP

Dyrektywy, funkcje i zmienne

Dyrektywy, funkcje i zmienne

Lesław Sieniawski © 2010

background image

Dyrektywy

Dyrektywy

background image

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

background image

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>

background image

Posta

Posta

ć

ć

dyrektyw kompilatora (3)

dyrektyw kompilatora (3)

Konstrukcja

(ang. construct):

#pragma omp

… ¶

{

instrukcja1;

instrukcjaN;

}

<konstrukcja>

background image

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

task

background image

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

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

Wyst

Wyst

ę

ę

powanie klauzul w dyrektywach

powanie klauzul w dyrektywach

[źródło: http://computing.llnl.gov/tutorials/openMP/]

background image

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

)

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

p

o

d

st

aw

ie

J.

 U

ła

si

ew

ic

z…

]

background image

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

background image

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)

background image

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)

background image

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

background image

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

background image

Pragma

Pragma

critical

critical

#pragma omp critical [(

nazwa

)] ¶

<blok_instrukcji>

Semantyka: (sekcja krytyczna) konstrukcja kontroluje dost

ę

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

ń

background image

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

background image

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

ę

background image

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)

background image

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

background image

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

background image

Funkcje

Funkcje

background image

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

background image

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

background image

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()

background image

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

background image

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

background image

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 (!)

background image

Zmienne

Zmienne

background image

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()

)

background image

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)

background image

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