Sunteți pe pagina 1din 10

Notiuni introductive

Arhitecturi paralele si distribuite

Pentru a realiza un studiu al metodelor numerice paralele si distribuite ar trebui in primul rand sa ne raportam la diferentele lor fata de implementarile seriale: alocarea task-urilor; comunicarea intre procesoare a rezultatele intermediare obtinute prin calcul; sincronizarea calculelor efectuate de procesoare. De aici se obtine o clasicare a metodelor: metode sincrone si metode asincrone. Calculul paralel si distribuit reprezinta in prezent un domeniu larg de interes existand o activitate de cercetare intensa in acest sens motivata de numerosi factori. Intotdeauna a fost nevoie de o solutie de rezolvare a problemelor cu calcule foarte mari, dar, doar recent, tehnologiile avansate au luat in calcul folosirea calculului paralel in rezolvarea acestor probleme tinand cont si de calculatoarele paralele din ce in ce mai puternice. Dezvolatarea algoritmilor paraleli si distribuiti este determinata pe de o parte de legatura dintre nevoile de calcul noi si cele vechi, iar pe de alta parte de progresul tehnologic. Aplicatiile care privesc inteligenta articiala, calculul simbolic si calculul numeric sunt cele care au jucat un rol important in dezvoltarea arhitecturilor paralele si distribuite. Nevoia de determinare rapida a unui numar mare de calcule numerice din cadrul aplicatiilor ce privesc rezolvarea ecuatiilor cu derivate partiale si a procesarii imaginilor a fost ceea ce a dus la dezvoltarea rapiditatii si a paralelizarii masinilor de calcul. Recent a crescut interesul pentru aplicarea calculului paralel si distribuit in aplicatii precum cele ce privesc analiza, simularea si optimizarea la scara larga a sistemelor interconectate. Alte exemple de aplicare a calculului paralel sunt: rezolvarea sistemelor de ecuatii, programarea matematica si problemele de optimizare. O proprietate comuna a acestor probleme este aceea de a putea descompuse in subtask-uri. O distictie importanta este intre sistemele de calculul paralel si cele de calcul distribuit. Sistemele de calcul paralel consistau in mai multe procesoare care sunt localizate la o distanta mica unele de altele si care au fost concepute in scopul realizarii de taskuri de calcul in comun. Comunicarea dintre procesoare este de incredere si poate anticipata. Sistemele de calcul distribuit sunt diferite din mau multe puncte de vedere: procesoarele pot separate si comunicarea dintre ele este mult mai problematica; intarzierile de comunicare nu pot anticipate si legaturile de comunicatie pot sa nu e de incredere; ecare procesor poate angajat in propriile sale activitati in timp ce coopereaza cu alte procesoare pentru realizarea unui task comun. Sunt mai multi parametrii care pot folositi pentru a descrie sau pentru a clasica sistemele de calcul paralel: tipul si numarul de procesoare. Sunt sisteme de calcul paralel care au multe procesoare numite masiv paralele si sunt sisteme cu un numar mic de procesoare numite coarse grained parallelism. prezenta sau absenta unei masini de control global. O clasicare privind acest aspect si referindu-ne la abilitatea diferitelor procesoare de a executa diferite instructiuni la un moment dat este in calculatoare paralele SIMD (Single Instruction Multiple Data) si MIMD (Multiple Instruction Multiple Data). 1

operatii sincrone si asincrone. Distinctia in acest caz se refera la prezenta sau absenta unui ceas global folosit pentru a sincroniza operatiile diferitelor procesoare. Aceasta sincronizare este intotdeauna prezenta in SIMD. Operatiile sincrone sunt de preferat datorita catorva proprietati importante: comportamentul procesoarelor este mult mai usor de controlat si algoritmul este mult simplicat. Dar in unele cazuri este destul de greu de sincronizat o retea de comunicare de date. legaturile dintre procesoare. Un aspect important al calculatoarelor paralele este mecanismul prin care procesoarele fac schimb de informatii. Din acest punct de vedere exista doua cazuri: arhitecturi cu memorie comuna si arhitecturi care transmit mesaje. Plecand de la aceste doua tipuri de arhitecturi avem numerosi hibrizi. Cel mai des intalnit mod de a lucra cu memoria este switching systems (sisteme de comutare) asa cum se poate observa in gura 1. Exista situatii in care nu avem memorie comuna, dar ecare procesor are propria sa memorie locala. In aceasta situatie procesoarele pot comunica printr-o retea de comunicare care consta in legaturi de conexiune care leaga anumite perechi de procesoare (2). Apare astfel problema de a stabili care procesoare sunt conectate. Ar de preferat daca toate procesoarele ar direct conectate unele cu altele, sau daca pot legate printr-un numar de legaturi aditionale.

Figure 1: Sistem de conectare

Figure 2: Retea de comunicare Structura retelei de conectare este foarte importanta atat in sistemele de calcul paralel cat si in cele de calcul distribuit dar cu o diferenta: in calculatoarele paralele reteaua de conectare este sub controlul unui designer si din aceasta cauza de obicei este regulata, iar in sistemele distribuite topologia retelei este predeterminata si iregulata. 2

2 Modele si exemple
Exista o varietate de modele de calcule paralele si distribuite. Un model simplu folosit in general in calculul paralel pentru algoritmi asincroni este acela al reprezentarii algoritmilor paraleli prin grafuri directe aciclice. Fiecare nod al grafului reprezinta operatiile pe care le face algoritmul si ecare arc este folosit pentru a reprezenta dependenta datelor. In particular, un arc (i, j) indica faptul ca operatia corespunzatoare nodului j foloseste rezultatele operatiei corespunzatoare nodului i. Un astfel de exemplu este cel din gura 3.

Figure 3: Exemplu de graf direct orientat pentru (x1 + x2 )(x2 + x3 ) Un graf direct orientat realizeaza doar o reprezentare partiala a unui algoritm. In cadrul grafului sunt specicate operatiile care se efectueaza, operanzii si impune anumite conditii privind ordinea in care aceste operatii se efectueaza. Pentru a determina un algoritm paralel trebuie sa specicam si ce procesor executa o anumita operatie si la ce moment o executa. Pentru aceasta trebuie impus ca un procesor sa execute cel mult o operatie la un moment dat, si ca daca avem un nod (i, j) atunci operatia care ii corespunde nodului j poate incepe doar dupa ce operatia corespunzatoare nodului i a fost terminata. Exista situatii cand pentru aceeasi problema de calcul exista mai multi algoritmi, deci sunt situatii in care avem mai multe grafuri direct orientate pentru rezolvarea unei probleme (gura 4). Apare astfel situatia determinarii unui graf ce minimizeaza timpul de calcul al solutiei problemei. Pentru cateva clase de probleme exista metode care construiesc un graf direct orientat cu un factor constant de optimizare. In continuare consideram cateva exemple simple de taskuri de calcul numeric care pot reprezentate prin algoritmi paraleli simpli. Toti algorimii considerati pot reprezentati printr-un graf direct orientat. Pentru a usura calculele presupunem ca ecare operatie este executata intr-o unitate de timp si ca transmiterea de date intre procesoare se realizeaza instantaneu.

2.1

Calcule cu vectori si matrici


Cea mai simpla sarcina de calcul este aceea de a aduna n scalari. Cel mai bun algoritm serial necesita n 1 operatii, deci timpul de executie al algoritmului este n 1. In continuare prezentam un algoritm paralel construit sub presupunerea ca n este o putere a lui 2. Partitionam cei n scalari in n perechi diferite si folosim n procesoare pentru a aduna cei doi scalari 2 2 din ecare pereche. Deci, dupa o unitate de timp, avem de executat sarcina de a aduna n scalari. 2 Continuand in aceeasi maniera, dupa log n pasi vom mai avea de efectuat o singura adunare si calculul 3

1. Adunarea scalarilor

Figure 4: Graf direct orientat pentru (x1 + x2 )(x2 + x3 ) se va termina (gura 5). Acest algoritm poate generalizat la cazul in care n nu este putere a lui 2 si astfel timpul de executie devine log n folosind n procesoare. 2

Figure 5: Calcul paralel pentru adunarea a 16/15 scalari Aceeasi problema a adunarii a n scalri poate rezolvata folosind graful direct orientat reprezentat in gura 6 si care aduce o imbunatatire a ecientei algoritmului. 2. Produsul scalar Produsul scalar
n i=1

xi yi a doi vectori n-dimensionali poate calculata cu cu n procesoare in log n+1

unitati de timp astfel: la primul pas ecare procesor i calculeaza produsul xi yi si apoi avem nevoie de log n unitati de timp pentru adunarea scalarilor folosind algoritmul anterior. 3. Adunarea si inmultirea matricilor Suma a n matrici de dimensiune m m poate calculta in log n unitati de timp si folosind m2 n 2 procesoare. Inmultirea a doua matrici de dimensiune m n si n l consta in evaluarea a ml produse scalare de vectori n-dimensionali si poate deci indeplinita in log n+1 unitati de timp folosind nml procesoare. 4. Puterile unei matrici 4

Figure 6: Algoritm alternativ pentru adunarea paralela a 16 scalari Presupunem ca avem o matrice A de dimensiune n n si dorim sa calculam Ak pentru k Z. Daca k este putere a lui 2, atunci task-ul poate indeplinit prin pasi repetitivi: calculam intai A2 , apoi A2 A2 = A4 , etc. Dupa log k pasi se obtine Ak . Aceasta procedura presupune log k inmultiri consecutive de matrici si poate deci incheiata in log k(log n + 1) unitati de timp folosind n3 procesoare. O alta situatie de calcul a puterii unei matrici este reprezentata in gura 7.

Figure 7: Calcul paralel al puterilor unei matrici

2.2

Paralelizarea metodelor iterative

Pentru rezolvarea de sisteme de ecuatii, pentru optimizari si alte tipuri de probleme se folosesc in general algoritmi iterativi (metode de relaxare) de tipul: x(t + 1) = f (x(t)), t = 0, 1, . . . (1)

unde ecare x(t) este un vector n-dimensional si f : Rn Rn . O notatie alternativa este x = f (x). Daca sirul {x(t)} generat de (1) este convergent la x si daca functia f este continua, atunci x este punct x al lui f , f (x ) = x . Fie xi (t) componenta i a lui x(t) si e fi componenta i a functiei f . Atunci putem scrie (1) ca: xi (t + 1) = fi (x1 (t), . . . , xn (t)), i = 1, n (2)

Algoritmul iterativ x = f (x) poate paralelizat prin luarea a n procesoare care sa calculeze o componenta diferita a lui x, asa cum se observa in (2). La ecare pas, procesorul i cunoaste valorile tuturor componentelor lui x(t) de care depinde fi , calculeaza noua valoare a lui xi (t+1) si comunica aceasta valoare altor procesoare pentru a se putea trece la urmatoarea iteratie. Comunicatiile necesare pentru executia unei iteratii de tipul (2) pot descrise cu ajutorul unui graf direct ca cel reprezentat in gura 8, numit si graf de dependenta. Nodurile reprezinta componentele lui x si pentru ecare doua noduri i si j exista arcul (i, j), daca functia fj depinde de xi , asta inseamna ca procesorul i trebuie sa comunice valoarea lui xi (t) procesorului j.

Figure 8: Graf de dependenta Graful din gura 8 este realizat pentru urmatoarea situatie: x1 (t + 1) = f1 (x1 (t), x3 (t)) x2 (t + 1) = f2 (x1 (t), x2 (t)) x3 (t + 1) = f3 (x2 (t), x3 (t), x4 (t)) x4 (t + 1) = f4 (x2 (t), x4 (t)) Daca presupunem ca procesul iterativ reprezentat in ecuatia (1) se termina in T pasi, T N , structura algoritmului poate reprezentata printr-un graf direct orientat (9). 2.2.1 Iteratia Seidel-Gauss Iteratia (2) in care toate componentele lui x sunt updatate simultan este numita iteratie de tip Jacobi. Intr-o forma alternativa, componentele lui x sunt updatate pe rand si valoarea cel mai recent calculata este folosita. Astfel ecuatia (2) devine: xi (t + 1) = fi (x1 (t + 1), . . . , xi1 (t + 1), xi (t), . . . , xn (t)), i = 1, n Iteratia (3) se numeste algoritmul Seidel-Gauss bazat pe functia f . Example 2.1 Consideram urmatoarea situatie: x1 (t + 1) = f1 (x1 (t), x3 (t)) x2 (t + 1) = f2 (x1 (t + 1), x2 (t)) x3 (t + 1) = f3 (x2 (t + 1), x3 (t), x4 (t)) x4 (t + 1) = f4 (x2 (t + 1), x4 (t)) 6 (3)

Figure 9: Graf direct orientat asociat grafului de dependenta

Figure 10: Paralelizarea iteratiei Seidel-Gauss Exista mai multe alternative ale algoritmului Seidel-Gauss corespunzator functiei f , deoarece ordinea in care sunt updatate componentele poate diferita. Atata timp cat viteza de convergenta nu se modica semnicativ este natural sa schimbam ordinea de calcul a componentelor astfel incat paralelismul la ecare iteratie este e maximizat. Example 2.2 Consideram urmatoarea situatie: x1 (t + 1) = f1 (x1 (t), x3 (t)) x3 (t + 1) = f3 (x2 (t + 1), x3 (t), x4 (t)) x4 (t + 1) = f4 (x2 (t + 1), x4 (t)) x2 (t + 1) = f2 (x1 (t + 1), x2 (t)) Proposition 2.1 Urmatoarele armatii sunt echivalente:

Figure 11: Paralelizarea iteratiei Seidel-Gauss - alta ordine de updatare a componentelor Exista o ordine a variabilelor astfel incat o parte a algoritmului Seidel-Gauss sa poata executata in K pasi paraleli. Exista o colorare a grafului de dependenta care foloseste K culori si cu proprietatea ca nu exista un ciclu pozitiv cu toate nodurile intr-un ciclu care au aceleasi culori. Exista o colorare a grafului de dependenta care foloseste cel mult K culori astfel incat nodurile adiacente au culori diferite. In cazul in care consideram exemplul din gura 8, doua culori sunt suciente: h(1) = h(3) = h(4) = 1 si h(2) = 2. In cazul in care se folosesc schemele cu culori pentru o implementare paralela a algoritmului SeidelGauss, este usor de folosit cate un procesor diferit pentru ecare componenta a lui x, deoarece ecare procesor va idle atata timp cat sunt updatate variabile de culori diferite. Un remediu imediat ar acela de a folosi mai putine procesoare, ecare procesor avand asignate mai multe variabile de culori diferite. Example 2.3 Intr-o varietate de algoritmi de forma x = f (x), folositi pentru rezolvarea de ecuatii cu derivate partiale sau in procesarea de imagini, ecarei componente a vectorului x ii este asociat un punct particular dintr-o anumita regiune dintr-un spatiu 2-dimensional. Fie N multimea tuturor punctelor (i, j) R2 astfel incat i si j sunt numere intregi ce satisfac 0 i M si 0 j M . Fie xij o componenta a vectorului x care corespunde punctului (i, j). Prin conectarea celor mai apropiati vecini obtinem graful reprezentat in gura 12. Vedem acest graf ca si graf direct daca facem arcele bidirectionale si presupunem ca este un graf de dependenta asociat ecuatiei x = f (x). Asignam cate un procesor ecarui punct (i, j). Acest procesor este responsabil de updatarea valorii lui xij si pentru a face acest lucru are nevoie sa cunoasca valorile componentelor lui x asociate punctelor vecine. Este astfel natural de presupus ca procesoarele asociate punctelor vecine sunt unite printr-o conexiune directa. In ceea ce priveste implementarea unei metode Seidel-Gauss asociate situatiei prezentate, observam ca graful din gura 12 poate colorat folosind doua culori asa cum se observa in gura 13. Daca asignam cate un procesor ecarei componente xij , atunci acesta va idle jumatate din timp. Este deci rezonabil sa asignam doua componente de culori diferite ecarui procesor. In practica, numarul de puncte este foarte mare si deci ecare procesor va avea asignate mai mult de doua puncte.

Exercitii
1. Se considera urmatoarea ecuatie:

Figure 12: Graf de dependenta pentru un algoritm iterativ

Figure 13: Nodurile colorate ale grafului de dependenta

x(t + 1) = a(t)x(t) + b(t)x(t 1) Se pune problema calculului lui x(t). Datele de intrare sunt: x(1), x(0), a(0), . . . , a(n 1), b(0), . . . , b(n 1). Gasiti un algoritm paralel care sa rezolve aceasta problema presupunand ca avem un numar sucient de procesoare. 2. Se considera urmatoarea ecuatie: x(t + 1) = a(t)x(t) + b(t)x(t 1) Se pune problema calculului lui x(t). Datele de intrare sunt: x(n1), x(0), a(0), . . . , a(n1), b(0), . . . , b(n1). Gasiti un algoritm paralel care sa rezolve aceasta problema presupunand ca avem un numar sucient de procesoare. 3. Propuneti un algoritm paralel pentru calculul valorii polinomului p(x) = an xn + + a1 x + a0 pentru o valoare data x. 4. Se considera graful de dependenta din gura 14, unde toate arcele sunt interpretate ca ind bidirectionale. 9

Figure 14: Graf de dependenta - exercitiu Precizati cu cate culori poate colorat graful si care este numarul minim de culori. Vericati de cate procesoare aveti nevoie penru o implementare paralela.

10