Sunteți pe pagina 1din 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Calcul de nalt a performant a


Mitic a Craus Alexandru Archip
Universitatea Tehnic a Gheorghe Asachi din Ia si

Ia si - 2011

2011-2012

1/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Cuprins

Tehnici avansate de programare MPI Tipuri de date denite utilizator Gestiunea dinamic a a proceselor. Comunicatori s , i grupuri de procese
Gestiunea dinamic a a proceselor Comunicatori s , i grupuri de procese

Tehnici avansate de programare OpenMP Regiuni paralele de tip nested Sect , iuni paralele Task-uri OpenMP

2011-2012

2/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

MPI Considerat , ii generale


MPI (Message Passing Interface ) reprezint a, la ora actual a, un standard pentru

programare paralel a/distribuit a.


Scopul principal al acestui standard este de a facilita dezvoltarea aplicat , iilor paralele

s nc at aceste aplicat a e portabile. , i/sau distribuite astfel , ii s


Init a de grupul MPI Forum (anii , ial, dezvoltarea acestui standard a fost coordonat

1993 1994), grup ce a lansat prima versiunea a standardului MPI:


comunicat , ii punct la punct; operat , ii colective; grupuri de procese s , i contexte de comunicat , ie; topologii de procese.

In prezent, ultima versiune a standardului MPI este versiunea 2.2: extinderea operat , iilor colective; crearea si gestiunea dinamic a a proceselor; comunicat , ii one-sided ; mecanisme I/E paralele.

2011-2012

3/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Tipuri de date MPI


Implement arile MPI ofer a suport pentru tipurile de date fundamentale:

Tip de date n C signed char signed short int signed int signed long int unsigned char unsigned short int unsigned int oat double long double

Tip de date MPI MPI CHAR MPI SHORT MPI INT MPI LONG MPI UNSIGNED CHAR MPI UNSIGNED SHORT MPI UNSIGNED MPI FLOAT MPI DOUBLE MPI LONG DOUBLE

Mesajele constituite din astfel de tipuri de date sunt omogene.

2011-2012

4/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Tipuri derivate de date


Pentru unele aplicat a transmiterea de date ce nu sunt , ii complexe poate necesar

omogene sau structuri de date ce nu sunt continue din punct de vedere al spat , iului de memorie ocupat. Standardul MPI ofer a n acest caz dou a mecanisme de gestiune a tipurilor de dat a:
1. utilizatorul poate deni s nregistra tipuri de date proprii, care pot apoi utilizate n ,i comunicat a; , ii tipuri derivate de dat 2. un proces poate mpacheta explicit un set de date mapate n zone de memorie discontinue pentru a le putea transmite ntr-o singur a comunicat n acest caz , ie; procesul destinat n vederea reconstruirii corecte a , ie va despacheta mesajul primit datelor originale. Primul mecanism descris anterior este mai des utilizat. Utilizarea unui tip derivat de

date n cadrul aplicat atorii pas , iilor MPI presupune urm , i:


a) denirea tipului derivat prin intermediul unui constructor. b) nregistrerea tipului derivat n mediul de rulare al aplicat , iei. c) eliberarea tipului derivat denit n pas arii , ii anteriori (obligatoriu, la nalul rul aplicat , iei).

2011-2012

5/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Constructori pentru tipuri derivate MPI TYPE CONTIGUOUS

Acesta este cel mai simplu constructor pentru tipuri de date derivate. Are rolul de a crea un nou tip de date ce permite multiplicarea unui aceluias , i tip

fundamental de date n locat , ii continue de memorie.


Poate utilizat, spre exemplu, pentru utilizarea structurilor de date omogene. Prototipul funct , iei C:

int MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype)


Prototipul metodei C++

Datatype Datatype::Create_contiguous(int count) const

2011-2012

6/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Constructori pentru tipuri derivate MPI TYPE VECTOR

Acest constructor permite denirea unui tip derivat compus din elemente de acelas ,i

tip de date, ce se reg asesc n blocuri continue aate la distant a de , e egale unul fat , cel alalt.
Prototipul funct , iei C:

int MPI_Type_vector(int count, int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype)
Prototipul metodei C++

Datatype Datatype::Create_vector(int count, int blocklength, int stride) const

2011-2012

7/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Constructori pentru tipuri derivate MPI TYPE INDEXED


Prin intermediul acestui constructor se pot crea tipuri de date similare celor obt , inute

prin intermediul constructorului MPI Type vector, cu deosebirea c a, de aceast a dat a, dimensiunea blocurilor s n mod necesar , i deplasamentul dintre blocuri nu este acelas , i.
Prototipul funct , iei C:

int MPI_Type_indexed(int count, int *array_of_blocklengths, int *array_of_displacements, MPI_Datatype oldtype, MPI_Datatype *newtype)
Prototipul metodei C++

Datatype Datatype::Create_indexed(int count, const int array_of_blocklengths[], const int array_of_displacements[]) const

2011-2012

8/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Constructori pentru tipuri derivate MPI TYPE CREATE STRUCT


MPI TYPE CREATE STRUCT reprezint a constructorul cel mai general destinat

tipurilor de date drivate n MPI.


In esent a, acest constructor poate privit ca o generalizare a celorlalt , , i constructori

prezentat , i anterior.
Prototipul funct , iei C:

int MPI_Type_create_struct(int count, int array_of_blocklengths[], MPI_Aint array_of_displacements[], MPI_Datatype array_of_types[], MPI_Datatype *newtype)
Prototipul metodei C++

static MPI::Datatype MPI::Datatype::Create_struct(int count, const int array_of_blocklengths[], const MPI::Aint array_of_displacements[], const MPI::Datatype array_of_types[])

2011-2012

9/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Constructori pentru tipuri derivate MPI TYPE CREATE STRUCT


Exemplu de utilizare (C):

struct Partstruct { char c; double d[6]; char b[7]; }; MPI_Datatype Particletype; MPI_Datatype type[3] = { MPI_CHAR, MPI_DOUBLE, MPI_CHAR }; int blocklen[3] = { 1, 6, 7 }; MPI_Aint disp[3]; struct Partstruct particle; disp[0] = (void*) &particle.c - (void*) &particle; disp[1] = (void*) &particle.d - (void*) &particle; disp[2] = (void*) &particle.b - (void*) &particle; MPI_Type_create_struct(3, blocklen, disp, type, &Particletype); MPI_Type_commit(&Particletype);
2011-2012 10/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Constructori pentru tipuri derivate MPI TYPE CREATE STRUCT


Exemplu de utilizare (C++):

struct Partstruct { char c; double d[6]; char b[7]; }; MPI::Datatype structtype; MPI::Datatype types[] = {MPI::CHAR, MPI::DOUBLE, MPI::CHAR}; int blocklen[] = {1, 6, 7}; MPI::Aint disp[3]; disp[0] = (char*) &ps.c - (char*) &ps; disp[1] = (char*) &ps.d - (char*) &ps; disp[2] = (char*) &ps.b - (char*) &ps; structtype = MPI::Datatype::Create_struct( 3, blocklen, disp, types); structtype.Commit();
2011-2012 11/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Inregistrarea/Eliberarea tipurilor derivate de date


Pentru a putea utiliza un tip de dat a derivat n cadrul comunicat , iilor MPI, acest tip

de date trebuie construit s nregistrat. ,i


Inregistrarea unui tip derivat n MPI se realizeaz a cu ajutorul funct , iei

MPI TYPE COMMIT:


prototipul funct n C: , iei

int MPI_Type_commit(MPI_Datatype * newtype)


prototipul metodei n C++:

void Datatype::Commit() O utilizare corect a a tipurilor de date derivate implic a eliberarea tipurilor de date

derivate la nalul execut and , iei unei aplicat , ii MPI. Acest lucru se poate realiza utiliz funct , ia MPI TYPE FREE:
prototipul funct n C: , iei

int MPI_Type_free(MPI_Datatype * newtype)


prototipul metodei n C++:

void Datatype::Free()

2011-2012

12/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Not , iuni generale

Versiunile 1.0 s ar x de , i 1.1 ale standardului MPI presupuneau existent , a unui num

procese MPI pe tot parcursul rul arii unei aplicat , ii MPI.


Incep and cu versiunea 2.0 a acestui standard, au fost introduse mecanisme ce permit

gestiunea dinamic a a proceselor. Acest lucru are drept consecint a o exibilitate , crescut a a aplicat , iilor MPI.
Dup a cum se s , tie, multe dintre operat , iile MPI sunt strict corelate cu

comunicatorul de care apart , in procesele unei aplicat , ii MPI. In mod predenit, comunicatorul MPI COMM WORLD cont , ine init , ial toate procesele ce apart n momentul lans arii acestei aplicat n , in de o aplicat , ie MPI , ii execut , ie. In foarte multe cazuri, n funct , ie de specicul problemelor de rezolvat, poate deveni util a coordonarea proceselor lansate sub form a de subcomunicatori/subgrupuri de procese, care s a rezolve deferite sarcini specice din cadrul unei aplicat , ii.

2011-2012

13/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea dinamic a a proceselor

Lansarea n execut a prin intermediul unui , ie a unui grup nou de procese se realizeaz

comunicator nou.
Funct a care permite acest lucru este MPI COMM SPAWN. , ia principal

Caracteristicile acestei funct atoarele: , ii sunt urm


este o funct a din punct de vedere al proceselor p arinte acele procese care , ie colectiv

vor genera grupul nou (grupul nou, prin convent , ie, va denumit grup de procese copil); ecare proces copil (proces ce apart a , ine de grupul nou creat) va trebui s apeleze funct , ia MPI INIT (similar cazului clasic); procesele copil vor executa ecare acelas , i aplicat , ie); , i cod binar (vor rula aceeas pe post de valoare de retur, aceast a funct , ie va genera un intercomunicator; acest intercomunicator are rolul de a lega, din punct de vedere al proceselor p arinte, grupul local (sau grupul p arinte) de grupul nou creat (sau grup remote grupul care cont , ine procesele u); prin intermediul acestui intercomunicator procesele p arinte vor putea transmite/recept atre/de la procesele u. , iona mesaje c

2011-2012

14/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea dinamic a a proceselor

Grupul de procese copil are urm atoarele caracteristici: toate procesele copil (procesele nou create, care apart , in de grupul copil) vor avea un intracomunicator (comunicator local) predenit: MPI COMM WORLD; rolul acestuia este de a gestiona comunicat , iile locale (sau interne) grupului de procese copil; procesele copil pot apela funct , ia MPI COMM GET PARENT, pentru a determina comunicatorul p arinte; acest intercomunicator va avea pe post de grup local grupul proceselor copil s arinte; rolul acestuia este , i pe post de grup remote grupul proceselor p de a permite proceselor copil s a transmit a/recept atre/de la procesele , ioneze mesaje c p arinte. In mod uzual, pentru a putea lansa procese copil, aplicat a cuprind a , iile MPI trebuie s

cel put a s a executabile): , in dou , iere binare (dou


primul dintre acestea va include codul ce trebuie executat de procesele p arinte (sau

procesele master);
al doilea executabil trebuie s a implementeze procesele u ( n mod uzual denumite

procese worker).

2011-2012

15/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea dinamic a a proceselor MPI COMM SPAWN

Prototipul metodei limbajul C:

int MPI_Comm_spawn(char *command, char *argv[], //daca nu exista argumente -> MPI_ARGV_NULL int maxprocs, MPI_Info info, //daca nu exista -> MPI_INFO_NULL int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]) //pentru a ignora -> MPI_ERRCODES_IGNORE

2011-2012

16/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea dinamic a a proceselor MPI COMM SPAWN

Prototipul metodei limbajul C++:

MPI::Intercomm MPI::Intracomm::Spawn(const char* command, const char* argv[], int maxprocs, const MPI::Info& info, int root, int array_of_errcodes[]) const sau MPI::Intercomm MPI::Intracomm::Spawn(const char* command, const char* argv[], int maxprocs, const MPI::Info& info, int root) const

2011-2012

17/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea dinamic a a proceselor MPI COMM GET PARENT


Dup a cum a fost amintit anterior, procesele ce apart , in de un grup copil pot

identica grupul p arinte (grupul proceselor p arinte) prin intermediul unui intercormunicator p arinte.
Obt a prin intermediul funct , inerea acestui intercomunicator se realizeaz , iei

MPI COMM GET PARENT.


Prototipul metodei limbajul C:

int MPI_Comm_get_parent(MPI_Comm *parent)


Prototipul metodei limbajul C++:

static MPI::Intercomm MPI::Comm::Get_parent()


In cazul n care aceast a funct a din cadrul grupului p arinte sau din , ie este apelat

cadrul unui grup independent de procese (grup de procese care nu a fost creat prin intermediul apelului funct , iei MPI COMM SPAWN), valoarea parametrului de ies , ire va MPI COMM NULL (MPI::COMM NULL pentru limbajul C++).

2011-2012

18/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea dinamic a a proceselor Exemplu


Proces p arinte:
#include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { int numworkers, b[100]; MPI_Status status; MPI_Comm workercomm; MPI_Init( &argc, &argv ); if ( argc != 2 || !isnumeric( argv[1] )) printf( "usage: %s <number of workers>\n", argv[0] ); else numworkers = atoi( argv[1] ); MPI_Comm_spawn( "worker", MPI_ARGV_NULL, numworkers, MPI_INFO_NULL, 0, MPI_COMM_SELF, &workercomm, MPI_ERRCODES_IGNORE ); ... /* cod procese master */ /* exemplu de comunicatie */ MPI_Bcast( b, 100, MPI_DOUBLE, MPI_ROOT, workercomm ); ... /* codul suplimentar al grupului parinte*/ ... MPI_Comm_free( &workercomm ); MPI_Finalize(); return 0; } }

Proces copil:
#include "mpi.h" int main( int argc, char *argv[] ) { int numprocs, myrank; double b[100]; int i, row, myrank; double dotp; MPI_Status status; MPI_Comm parentcomm; MPI_Init( &argc, &argv ); MPI_Comm_size( MPI_COMM_WORLD, &numprocs ); MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); MPI_Comm_get_parent( &parentcomm ); MPI_Bcast( b, 100, MPI_DOUBLE, 0, parentcomm ); ... /* codul proceselor fiu */ ... MPI_Comm_free( &parentcomm ); MPI_Finalize( ); return 0;

2011-2012

19/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Aspecte generale

Dup a cum am amintit anterior, orice comunicat a de un , ie MPI este dependent

comunicator care cont , ine un context s , i un grup.


Conform specicat a o mult , iilor MPI, un grup reprezint , ime de procese. Poate util n cadrul unor aplicat a mp art a de procese n , ii s , im mult , imea init , ial

grupuri separate/comunicatori separat , i pentru a us , ura, spre exemplu, gestiunea comunicat a numai o parte din procesele aplicat , iilor ce vizeaz , iei MPI.
Aceast a funct a prin divizarea unui comunicator sau prin , ionalitate poate obt , inut

crearea de grupuri.

2011-2012

20/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Divizarea comunicatorilor

Funct a prin care se poate diviza un comunicator (indiferent dac a este vorba , ia central

despre un intercomunicator sau un intracomunicator), este MPI COMM SPLIT.


Prototipul funct , iei limbajul C:

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)


Prototipul metodei n limbajul C++:

MPI::Intercomm MPI::Intercomm::Split(int color, int key) const sau MPI::Intracomm MPI::Intracomm::Split(int color, int key) const

2011-2012

21/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea grupurilor de procese

A dou a metod a de a diviza mult a de procese este prin utilizarea , imea init , ial

grupurilor de procese.
Aceast a metod a implic a n mod uzual urm atoarele etape: 1. obt , inerea identicatorului grupului original din care fac parte procesele MPI COMM GROUP; 2. divizarea proceselor n grupurile logice ce se doresc a create MPI GROUP INCL (acest pas implic a reorganizarea proceselor din punct de vedere al rangurilor); 3. crearea unui nou comunicator care va gestiona comunicat , iile din cadrul unui grup MPI COMM CREATE.

2011-2012

22/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea grupurilor de procese Metode utile


MPI COMM GROUP obt , ine identicatorul grupului original.
Prototipul funct , iei limbajul C:

int MPI_Comm_group(MPI_Comm comm, MPI_Group *group)


Prototipul metodei limbajul C++:

Group Comm::Get_group() const MPI GROUP INCL creaz a grupurile dorite prin includerea proceselor n grupurile corespunz atoare.
Prototipul funct , iei limbajul C:

int MPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group *newgroup)


Prototipul metodei limbajul C++:

Group Group::Incl(int n, const int ranks[]) const

2011-2012

23/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Gestiunea grupurilor de procese Metode utile

a un comunicator unui grup de procese. MPI COMM CREATE atas , eaz


Prototipul funct , iei limbajul C:

int MPI_Comm_create(MPI_Comm comm, MPI_Group group,MPI_Comm *newcomm)


Prototipul metodei limbajul C++: divizarea unui intercomunicator: MPI::Intercomm MPI::Intercomm::Create(const Group& group) const
divizarea unui intracomunicator:

MPI::Intracomm MPI::Intracomm::Create(const Group& group) const

2011-2012

24/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

OpenMP Caracteristici generale

OpenMP reprezint a un API portabil destinat dezvot arii aplicat , iilor paralele bazate

memorie comun a. Paralelismul n acest caz este obt , inut prin intermediul relor de execut , ie.
API-ul OpenMP este alc atuit din trei componente: directive compilator, libr arii

runtime s a suport pentru , i variabile de mediu. La nivel de implementare, se ofer limbajele C/C++ s , i Fortran. O aplicat a utiliz and acest API are urm atoarele caracteristici: , ie dezvoltat
n general, o aplicat a n termeni de regiuni secvent , ie OpenMP este descris , iale s , i regiuni

paralele; toate rele de execut a partajat a de memorie; , ie au acces la aceeas , i zon datele pot partajate ( n cadrul aceleias , i zone comune de memorie) sau private; datele partajate sunt accesibile ec arui thread din mult , imea de lucru; datele private pot accesate doar de thread-ul proprietar; transferul datelor se realizeaz a ntr-un mod transparent pentru programator; n cadrul oricarei execut , ii este prezent cel put , in un mecanism de sincronizare.

2011-2012

25/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

OpenMP Caracteristici generale

Limit ari ale API-ului OpenMP: API-ul nu se adreseaz a sistemelor paralele cu memorie partajat a distribuit a; nu este implementat identic de c atre tot atorii; , i produc nu se garanteaz a ntotdeauna o utilizare ecient a a memoriei comune; nu ofer a mecanisme de vericare a accesului datelor partajate: nu veric a interdependet a eventualele conicte ce pot ap area ntre , ele dintre date, nu veric variabile, nu veric a dac a modicarea unei variabile partajate este realizat a sau nu de un singur thread, nu veric a blocajele ce pot ap area n cadrul unor programe paralele; nu acoper a alte directive specice compilatoarelor, directive ce pot asista n dezvoltarea unei paraleliz ari eciente; nu a fost dezvoltat astfel nc at s a acopere sincronizarea operat , iilor de intrare/ies , ire.

2011-2012

26/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Construirea unei regiuni paralele simple


Constructorii fundamentali (recapitulare): #include <omp.h> main () { int var1, var2, *var3; //Serial code . . //Beginning of parallel section. Fork a team of threads. #pragma omp construct [clause [clause]...] { int var4, var5; //Parallel section executed by all threads . . //All threads join master thread and disband } //Resume serial code . . }

2011-2012

27/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Construirea unei regiuni paralele simple

Constructorii fundamentali (recapitulare) regiune paralel a generic a: #pragma omp parallel [clause ...] newline if (scalar_expression) private (list) shared (list) default (shared | none) firstprivate (list) reduction (operator: list) copyin (list) num_threads (integer-expression) structured_block

2011-2012

28/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Construirea unei regiuni paralele simple

Constructorii fundamentali (recapitulare) bucl a paralel a: #pragma omp for [clause ...] newline schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) collapse (n) nowait for_loop

2011-2012

29/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Regiuni paralele de tip nested


Exist a unele cazuri n care regiunile/buclele paralele simple nu ofer a performant ele

dorite. Pentru exemplicare, se consider a cazul n care se dores , te calcularea produsului a dou a matrici.
Se consider a pentru acest caz c a matricile au dimensiune nxn s a mas a , i c , ina paralel

pe care va rula aplicat a ofer a o plas a de procesoare de dimensiune nxn. , ia paralel Utiliz and numai bucle paralele simple, paralelizarea algoritmului de nmult , ire a matricilor implic a folosirea a n re de execut arui r , ie (mapate pe n procesoare). Fiec de execut i va repartizat a pentru calcule o linie din matricea rezultat. Se obt , ie , ine n acest caz o utilizare inecient a a puterii de calcul oferit a de mas a. , ina paralel O solut a implic a pentru acest caz utilizarea tuturor celor nxn procesoare , ie ecient pentru solut a a doua abordare este necesar ca , ionarea problemei. Pentru aceast ec arui r de execut a i e repartizat pentru , ie (dintre cele maxim nxn disponibile) s calcule un singur element din matricea rezultat. Abord ari posibile:
regiuni/bucle paralele simple nainte de calculul efectiv, se implementeaz a o funct , ie

de repartit , ie a valorilor de calcul pe plasa de procesoare;


regiuni/bucle paralele de tip nested.

2011-2012

30/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Regiuni paralele de tip nested


O regiune paralel a de tip nested reprezint a o regiune paralel a construit a n cadrul

altei regiuni paralele.


Aceast a funct a prin intermediul a dou a mecanisme: , ionalitate poate obt , inut 1. setarea corespunz atoare a variabilei de mediu $OMP_NESTED 2. utilizarea funct , iei void omp_set_nested( int set )

Figura 1: Exemplicare: regiune paralel a nested


2011-2012 31/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Regiuni paralele de tip nested


Exemplu de cod pentru produsul a dou a matrici utiliz and regiuni paralele de tip nested:
int main(void) { int **A, **B, **C, size; /* initializari/alocari de memorie */ #pragma omp parallel num_threads(size) { int row_tid = omp_get_thread_num(); omp_set_nested(1); #pragma omp parallel num_threads(size) { int column_tid = omp_get_thread_num(); C[row_tid][column_tid] = 0; for(int j=0; j<size; ++j) { C[row_tid][column_tid] += A[row_tid][j] * B[j][column_tid]; } } } /* afisare/procesare suplimentara a rezultatelor */ return 0; }
2011-2012 32/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Sect , iuni paralele


Exist a anumite aplicat a n mod necesar o bucl a , ii pentru care paralelizarea nu implic

paralel a. De exemplu, parcurgerea elementelor unei liste simplu/dublu nl ant , uite sau a unui arbore binar de c autare.
Pentru rezolvarea acestor cazuri, API-u OpenMP pune la dispozit , ia programatorilor

dou a mecanime importante: sect ncep and cu versiunea 3.0 a , i task-uri ( , iuni s API-ului ) paralele.
O sect a reprezint a un set de instruct , iuni secvent , iale unitare, ce pot , iune paralel

executate n paralel.
Constructorii omp utilizat a sect , i denirea unei regiuni paralele ce utilizeaz , iuni:

#pragma omp sections [clause ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait

2011-2012

33/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Sect , iuni paralele

Constructorii omp utilizat , i denirea unei sect , iuni paralele:

#pragma omp section [clause ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait

2011-2012

34/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Sect , iuni paralele

Exemplu de utilizare:
#include <stdio.h> #include <omp.h> int main(int argc, char **argv) { #pragma omp parallel { #pragma omp sections { #pragma omp section { function1(...); } #pragma omp section { function2(...); } #pragma omp section { function3(...); } } } return 0; }

2011-2012

35/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Sect , iuni paralele


Exemplu de utilizare traversarea postordine a unui arbore binar:
void postordine( bst * curent ) { #pragma omp parallel sections { #pragma omp section { if( curent->left ) postordine( curent->left ); } #pragma omp section { if( curent->right ) postordine( curent->right ); } procesare( curent ); } }

2011-2012

36/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Task-uri OpenMP

Un task OpenMP reprezint a o unitate de lucru independent a, a c arei execut , ie poate

imediat a sau poate nt arziat a.


Un task OpenMP este caracterizat de: setul de instruct , iuni ce va executat; mediul de date n mod uzual init , ializat la crearea task-ului; un set de variabile de control interne. Avantajele task-urilor, fat a de sect atoarele: , , iunile paralele, sunt urm ofer a suport pentru compuneri complexe; pot mbricate n cadrul altor task-uri. Pot utilizate pentru a implementa: bucle paralele a c aror condit a n momentul n care se creaz a , ie de stop nu este cunoscut bucla respectiv a; implementarea unor algoritmi recursivi.

2011-2012

37/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Task-uri OpenMP

Execut , ia task-urilor OpenMP: In general, un task este executat de un singur thread. Un task poate executat imediat de c atre thread-ul ce creaz a task-ul respectiv, sau poate am anat n execut atre urm atorul thread liber. , ie s , i preluat de c Task-urile pot ntrerupte din execut n mod dinamic. , ie sau pot continuate

2011-2012

38/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Task-uri OpenMP

Sintaxa constructorului: #pragma omp task [clause ...] newline if (exp) private (list) firstprivate (list) default untied shared (list)

2011-2012

39/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Task-uri OpenMP

Exemplu de utilizare traversarea postordine a unui arbore binar:


void postordine( bst * curent ) { if( curent->left ) #pragma omp task postordine( curent->left ); if( curnet->right ) #pragma omp task postordine( curent->right ); #pragma omp taskwait proceseaza( curent->data ); }

2011-2012

40/ 41

Cuprins

Tehnici avansate de programare MPI

Tehnici avansate de programare OpenMP

Task-uri OpenMP

Exemplu de utilizare algoritmul QuickSort


Model paralel utiliz and task-uri OpenMP: Algoritmul secvent , ial clasic: void quickSort( array[], low, high ) { if( low < high ) { k = partition( array, low, high ); quickSort( array, low, k-1 ); quickSort( array, k+1, high ); } } void quickSort( array[], low, high ) { if( low < high ) { k = partition( array, low, high ); #pragma omp task quickSort( array, low, k-1 ); #pragma omp task quickSort( array, k+1, high ); } }

2011-2012

41/ 41