Documente Academic
Documente Profesional
Documente Cultură
Ia si - 2011
2011-2012
1/ 41
Cuprins
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
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
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
2011-2012
4/ 41
Cuprins
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
2011-2012
5/ 41
Cuprins
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
2011-2012
6/ 41
Cuprins
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++
2011-2012
7/ 41
Cuprins
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
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
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
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
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
void Datatype::Free()
2011-2012
12/ 41
Cuprins
Versiunile 1.0 s ar x de , i 1.1 ale standardului MPI presupuneau existent , a unui num
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
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
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
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
procesele master);
al doilea executabil trebuie s a implementeze procesele u ( n mod uzual denumite
procese worker).
2011-2012
15/ 41
Cuprins
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
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
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
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
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
Aspecte generale
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
Divizarea comunicatorilor
Funct a prin care se poate diviza un comunicator (indiferent dac a este vorba , ia central
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
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
Group Comm::Get_group() const MPI GROUP INCL creaz a grupurile dorite prin includerea proceselor n grupurile corespunz atoare.
Prototipul funct , iei limbajul C:
2011-2012
23/ 41
Cuprins
2011-2012
24/ 41
Cuprins
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
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
2011-2012
27/ 41
Cuprins
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
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
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
2011-2012
30/ 41
Cuprins
Cuprins
Cuprins
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
#pragma omp section [clause ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait
2011-2012
34/ 41
Cuprins
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
2011-2012
36/ 41
Cuprins
Task-uri OpenMP
2011-2012
37/ 41
Cuprins
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
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
Task-uri OpenMP
2011-2012
40/ 41
Cuprins
Task-uri OpenMP
2011-2012
41/ 41