Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

OpenMP OpenMP : API (Application Program Interface) utilizat pentru a controla explicit paralelismul cu memorie partajata si fire multiple de executie.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "OpenMP OpenMP : API (Application Program Interface) utilizat pentru a controla explicit paralelismul cu memorie partajata si fire multiple de executie."— Μεταγράφημα παρουσίασης:

1 OpenMP OpenMP : API (Application Program Interface) utilizat pentru a controla explicit paralelismul cu memorie partajata si fire multiple de executie. Componente: -directive compilator; -functii runtime de biblioteca; -variabile de mediu. OpenMP este disponibil pentru C/C++ si Fortran. Exista implementari pe o multitudine de platforme, inclusiv Unix si Windows.

2 Model de programare OpenMP: memorie partajata si fire multiple de executie. -> model de programare explicit (nu automat) => programatorul are un control deplin asupra paralelismului. -> modelul fork-join de executie paralela:

3 Program OpenMP incepe cu un proces singular (thread master) -> secvential -> constructie de regiune paralela (FORK) -> mai multe thread-uri in paralel -> JOIN -> thread-ul master, etc. Numarul de thread-uri : se poate modifica dinamic. Structura unui program OpenMP : #include <opm.h> void main ( ) { int var1, var2, var3; cod secvential //incepe sectiunea paralela => FORK #pragma omp parallel private (var1, var2) shared (var3) sectiune paralela executata de toate thread-urile //toate thread-urile => JOIN => thread master } reia cod secvential

4 Formatul unei directive
#pragma omp nume_directiva [clauza, clauza, ...] newline unde clauzele pot fi plasate in orice ordine si se pot chiar repeta. Liniile directive lungi se pot continua pe randul urmator cu ’\’.

5 Directiva pentru regiune paralela
Regiunea paralela = bloc de cod care se va executa de mai multe thread-uri. (constructia paralela OpenMP fundamentala !)

6 La o directiva parallel un thread creaza un set de thread-uri si devine masterul setului (cu numarul de thread 0 in cadrul setului). Numarul de thread-uri : omp_set_num_threads() sau cu variabila de mediu OMP_NUM_THREADS. Clauza if evalueaza expresia scalara: daca expresia ≠ 0 (adevarat) se creaza setul de thread-uri, iar daca expresia = 0 (fals) regiunea este executata numai de thread-ul master. La sfarsitul sectiunii paralele numai thread-ul master isi continua executia.

7 Exemplu: toate thread-urile executa codul corespunzator sectiunii paralele.

8 Directiva pentru partajarea lucrului
Aceasta directiva imparte regiunea de cod intre thread-urile membre, fara insa sa lanseze noi thread-uri. Constructiile de partajare a lucrului sunt: -for; -sections; -single. O constructie de partajare a lucrului trebuie inclusa dinamic intr-o regiune paralela pentru a fi executata in paralel.

9 Directiva for Partajeaza iteratiile unei bucle for intre thread-urile setului (reprezinta un tip de paralelism de date):

10 Forma generala a directivei for este:

11 Clauza schedule, in functie de tip, descrie cum se impart iteratiile buclei for intre thread-urile din set: -static: iteratiile se impart in sectiuni de dimensiune chunk si asignate static thread-urilor (daca nu se specifica chunk, iteratiile se impart in mod egal). -dynamic: iteratiile se impart in sectiuni de dimensiune chunk si se asigneaza dinamic thread-urilor. Cand un thread termina bucata sa, acesta este asignat dinamic la o alta bucata din totalul de iteratii (valoarea implicita chunk=1). -guided: dimensiunea bucatii este redusa exponential cu fiecare bucata repartizata din totalul iteratiilor. Dimensiunea bucatii reprezinta numarul minim de iteratii de repartizat de fiecare data (implicit chunk=1). -runtime: decizia de repartizare este amanata pana in timpul executiei, fiind determinata de variabila de mediu OMP_SCHEDULE (nu se specifica dimensiune chunk). Clauza ordered trebuie sa fie prezenta cand sunt incluse in directiva for si directive ordered. Clauza nowait indica faptul ca thread-ul nu se sincronizeaza la sfarsitul buclei paralele.

12 Exemplu: program pentru adunarea a doi vectori.

13 Directiva sections Imparte lucrul in sectiuni discrete separate, fiecare sectiune fiind executata de un thread, pentru implementarea unui paralelism functional.

14 Forma generala a directivei sections este:
Fiecare sectiune „section” se executa o singura data de catre un singur thread, sectiuni diferite vor fi executate de thread-uri diferite. Exista bariera implicita la sfarsit, numai daca nu se utilizeaza „nowait”.

15 Exemplu: adunarea a doi vectori, primele n/2 iteratii fiind distribuite primului thread, iar restul la un al doilea thread.

16

17 Directiva single Aceasta directiva serializeaza o sectiune de cod. Codul este executat de un singur thread. Forma generala:

18 Directiva parallel for
Se pot combina directivele de sectiune paralela si de partajarea a lucrului cu ajutorul directivei parallel for, prin care se specifica o regiune paralela care contine o singura directiva for. Forma generala:

19 Exemplu: iteratiile sunt repartizate in blocuri de dimensiuni egale la toate thread-urile din set.

20 Directiva parallel sections
Aceasta directiva specifica o regiune paralela continand o singura directiva sections. Forma generala este:

21 Directive de sincronizare
Directiva master Specifica o regiune care este executata numai de thread-ul master, toate celelalte thread-uri ale setului o neglijeaza. Forma generala a directivei este:

22 Directiva critical Specifica o regiune de cod care trebuie executata numai de un singur thread la un moment dat.

23 Exemplu: mai multe thread-uri incrementeaza o locatie x, reprezentand o sectiune critica.

24 Directiva barrier Sincronizeaza toate thread-urile din set. Forma generala: #pragma omp barrier newline Aceasta directiva trebuie sa fie intalnita de catre toate thread-urile din set, sau de niciunul. Un thread care atinge bariera va astepta pana ce toate celelalte thread-uri ating bariera, dupa care se continua executia paralela. Exemplu: (obligatoriu aceasta directiva trebuie sa fie continuta intr-un bloc structurat).

25 Directiva atomic Indica actualizarea atomica (operatie indivizibila) a unei locatii de memorie, furnizand astfel o mini sectiune critica. Forma generala: Se aplica numai instructiunii imediat urmatoare, de forma: x binop = expr x++ ++x x-- --x

26 Alte directive Directiva flush: specifica un punct de sincronizare in care se furnizeaza o imagine consistenta a memoriei (toate variabilele vizibile thread-urilor se inscriu in memorie in acest punct). Directiva ordered: specifica faptul ca iteratiile buclei incluse in aceasta directiva vor fi executate in aceeasi ordine ca la executia pe un uniprocesor. Directiva threadprivate: face ca variabilele globale sa fie locale persistente unui thread in cadrul executiei regiunilor paralele multiple.

27 Clauze Clauza private declara variabilele din lista ca fiind private fiecarui thread: private (lista) Clauza shared declara variabilele din lista ca fiind partajate intre toate thread-urile: shared (lista) Clauza default permite utilizatorului sa specifice domeniul implicit al variabilelor din extinderea lexicala a unei regiuni paralele: default (shared | none)

28 Clauza firstprivate combina clauza private cu initializarea automata a variabilelor din lista:
firstprivate (lista) Se initializeaza cu valorile obiectelor de origine inainte de intrarea in constructia paralela. Clauza lastprivate combina private cu o copie dupa ultima iteratie sau sectiune a obiectului variabila de origine: lastprivate (lista)

29 Clauza copyin asigneaza aceeasi valoare variabilelor threadprivate pentru toate thread-urile setului: copyin (lista) Sursa este setul de variabile ale thread-ului master. Clauza reduction executa o reducere asupra variabilelor din lista: reduction (operator : lista)

30 Exemplu: produs scalar
a doi vectori.

31 -functii legate de numarul de thread-uri;
OpenMP defineste un API pentru apeluri de functii din biblioteca, care executa o varietate de operatii: -functii legate de numarul de thread-uri; -functii de zavorare (semafoare); -functii de stabilire a mediului de executie. Variabila de zavorare trebuie sa fie de tipul omp_lock_t sau omp_nest_lock_t, depinzand de functia utilizata. void omp_set_num_threads(int num_threads)  seteaza numarul de thread-uri care se vor utiliza in urmatoarea regiune paralela. In modul dinamic activat specifica numarul maxim de thread-uri, iar in modul dinamic dezactivat specifica numarul exact de thread-uri.

32 int omp_get_num_threads(void)
returneaza numarul de thread-uri din set in regiunea paralela. int omp_get_max_threads(void) returneaza valoarea maxima care poate fi furnizata de un apel al functiei omp_get_num_threads. int omp_get_thread_num(void) returneaza identificatorul de thread in cadrul setului, fiind o valoare cuprinsa intre 0 si omp_get_num_threads – 1. Masterul primeste identificatorul 0.

33 int omp_get_num_procs(void)
returneaza numarul de procesoare disponibile programului. int omp_in_parallel(void) returneaza un intreg ≠ 0 (adevarat) daca sectiunea de cod care se executa este paralela, respectiv un intreg = 0 (fals) daca sectiunea nu este paralela.

34 Aplicatie: calcularea valorii aproximative a numarului π.
1) Solutia secventiala.

35 2) Solutia cu thread-uri Win32.
Caracteristici: -gestiunea thread-urilor si interactiunea intre thread-uri sunt explicite; -programatorul are control complet asupra thread-urilor. => se dubleaza dimensiunea codului.

36

37 3a) Solutia OpenMP - regiune paralela
3a) Solutia OpenMP - regiune paralela. Program SPMD: toate threa-urile executa acelasi cod, dar utilizand ID-ul thread-ului se poate specifica o executie selectiva.

38 3b) Solutia OpenMP – constructie de partajare a lucrului.

39 3c) Solutia OpenMP – clauza Private si o sectiune critica.

40 3d) Solutia OpenMP – parallel for cu o reducere.
=> OpenMP adauga un numar mic de linii de cod la solutia secventiala (2-4 linii)!


Κατέβασμα ppt "OpenMP OpenMP : API (Application Program Interface) utilizat pentru a controla explicit paralelismul cu memorie partajata si fire multiple de executie."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google