Sunteți pe pagina 1din 7

Probleme de sincronizare in algoritmii paraleli si distribuiti

1 Introducere
In orice algoritm paralel sau distribuit este necesar sa se coordoneze, intr-o anumita masura, activitatile diferitelor procesoare. Aceasta coordonare este adesea pusa in aplicare prin impartirea algoritmului in etape. Pe durata ecarei etape, ecare procesor trebuie sa execute o serie de calcule care depind de rezultatele calculelor altor procesoare din fazele anterioare, cu toate acestea, calendarul de calcule al unui procesor in timpul unei faze poate independent de calendarul de calcule al altor procesoare in aceeasi faza. Toate interactiunile au loc la sfarsitul ecarei faze. Numim astfel de algoritmi algoritmi sincroni, si in continuare, ii vom compara cu alti algoritmi, numiti asincroni, pentru care nu exista notiunea de faze si coordonarea calculelor diferitelor procesoare este mai putin stricta.

Algoritmi sincroni

Presupunem ca un sir de calcule este impartit in segmente consecutive, numite faze si numerotate 1, 2, . . . . Calculele in ecare faza sunt impartite intre n procesoare ale unui sistem de calcul. In timpul unei faze t, ecare procesor i face anumite calcule folosind datele problemei alaturi de informatiile pe care le primeste de la alte procesoare in timpul fazelor anterioare 1, 2, . . . , t 1. Procesorul i trimite apoi informatii sub forma de mesaje catre toate celelalte procesoare P (i, t) {1, 2, . . . , n} si apoi trece la faza t + 1. O presupunere implicita aici este faptul ca toate calcule diferitelor procesoare pot efectuate independent, intr-o faza, si ca momentul lor de executie este irelevant. Acest lucru este necesar pentru algoritmii distribuiti care reproduc rezultatele algoritmului serial original la sfarsitul ecarei faze. In unele cazuri, un procesor poate sa nu stie de la ce procesoare sa astepte un mesaj in timpul unei faze, asta inseamna ca un procesor j poate sa nu stie multimea {i|j P (i, t)}. Se considera urmatorul proces iterativ: xi (t + 1) = fi (x1 (t), . . . , xn (t)), i = 1, . . . n (1)

unde variabila xi este actualizata de procesorul i. Un algoritm distribuit corespunzator poate pus in aplicare prin asocierea fazelor cu momentele de timp t. Cerinta aici este ca ecare procesor i sa actualizeze variabila xi folosind procesul iterativ (1) si apoi sa trimita un mesaj cu valoarea actualizata tuturor procesoarelor j pentru care xi apare in mod explicit in functia fj . Astfel, multimea de procesoare P (i, t) care a primit un mesaj de la i in faza t este o multime a tuturor procesoarelor j pentru care (i, j) este un arc in graful de dependenta. Consideram cazul in care procesul iterativ (1) este implementat pe o masina cu memorie partajata. Un procesor trimite un mesaj la toate procesoarele simultan scriind-ul in memoria partajata. Sa presupunem ca un procesor va incepe un calcul a unei noi faze numai dupa ce toate mesajele fazei precedente au fost scrise in memoria partajata. Avem astfel un caz special al modelului precedent, unde P (i, t) = {1, 2, . . . , n} si receptarea mesajului se realizeaza simultan pentru toate procesoarele. Un astfel de algoritm distribuit se numeste sincron. Algoritmul sincron este matematic echivalent cu un algoritm guvernat de un ceas global, unul pentru care inceputul ecarei faze si sfarsitul receptionarii mesajelor se realizeaza simultan pentru toate procesoarele. In scopul de a pune in aplicare un algoritm sincron intr-un sistem distribuit, avem nevoie de un mecanism de sincronizare. Un astfel de algoritm este numit synchronizer. 1

2.1

Sincronizarea globala

Ideea este de a lasa ecare procesor detectat atunci cand toate mesajele trimise in timpul unei faze au fost primite, si doar apoi sa inceapa calculul in cadrul etapei urmatoare. Cel mai simplu mod de a efectuarea sincronizarea globala este prin utilizarea de timeout. Presupunem ca nu exista nici un ceas global accesibil tuturor procesoarelor, dar in schimb, ecare procesor poate masura cu precizie lungimea oricarui interval de timp folosind un ceas local. Sa presupunem ca exista o limita superioara cunoscuta Tp pentru timpului necesar ecarui procesor i pentru a executa calculele dintr-o faza, si pentru mesajele aferente trimise de catre i. Sa presupunem, de asemenea, ca exista un interval de timp (necunoscut) de lungime cunoscuta Tf in care toate procesoarele au inceput prima faza. Apoi, sincronizarea va efectuata in cazul in care ecare procesor i incepe faza k in k(Tp + Tj ) unitati de timp dupa ce acesta a inceput prima faza. Figura 1 ilustreaza acest proces. Dicultatea aceastei metode este faptul ca limitele Tp si Tf pot prea conservatoare sau indisponibile.

Figure 1: Implementarea sincronizarii globale O alta abordare este aceea prin care ecare procesor trimite un mesaj de terminare a fazei curente catre toate procesoarele dupa ce stie ca toate mesajele sale pentru o anumita faza au fost primite. Presupunem ca ecare mesaj trimis este recunoscut printr-un mesaj de raspuns trimis de receptor catre transmitator, astfel incat ecare procesor stie ca in cele din urma toate mesajele pe care le trimite in timpul unei faze au fost primite, moment in care se poate emite un mesaj de terminare faza. Odata ce un procesor a trimis propriul mesaj de terminare de faza si a primit mesajele corespunzatoare de la toate celelalte procesoare, se pot continua calculele din etapa urmatoare. Intr-un sistem cu memorie partajata, aceasta metoda este conceptual simpla prin utilizarea de variabile speciale, care sunt accesibile tuturor procesoarelor (ca exemplu avem semafoarele, monitoarele). Ideea de baza este aceea ca aceste variabile iau la un moment dat valori care indica faptul ca un procesor a termint faza curenta si poate trece la faza urmatoare. Intr-un sistem bazat pe transmitere de mesaje, sincronizarea globala poate implementata cu ajutorul unui arbore ce are un nod special, desemnat ca radacina (root). Mesajele de terminare a fazelor procesoarelor sunt colectate de root, incepand de la frunze. Odata ce radacina a primit mesaje de incetare a fazelor de la toate procesoarele, poate trimite un mesaj de initiere a fazei urmatoare tuturor procesoarelor, si ecare procesor poate incepe o noua faza la primirea acestui mesaj (gura 2). Se poate observa ca aceasta metoda necesita, in esenta, o acumulare intr-un singur nod, urmata de o emisiune a unui singur nod.

Figure 2: Sincronizarea globala folosind un arbore

2.2

Sincronizarea locala

Ideea principala a acestei metode este ca, daca un procesor stie mesajele pe care sa le astepte in ecare faza, atunci poate incepe o noua faza dupa ce a primit toate aceste mesaje. In particular, procesorul j poate incepe calculul unei noi faze t + 1 dupa ce a primit mesaje de fazei precedente t de la toate procesoarele i din multimea {i|j P (i, t)}. Nu este necesar pentru un procesor sa stie daca oricare alte mesaje trimise in timpul fazei t (inclusiv proprii mesaje) au fost primite, deci nu este nevoie sa se piarda timpul de asteptare pentru ca aceste receptii sa e nalizate si sa e conrmate. Atunci cand procesorul j nu stie multimea {i|j P (i, t)}, dar in schimb cunoaste o multime Sj {i|j P (i, t)}, schema poate modicata astfel incat toate nodurile i Sj cu j P (i, j) trimit un mesaj catre j in cadrul fazei t. /

Algoritmi asincroni

Timpul total de executie a multor algoritmi poate adesea substantial redus printr-o implemenatre asincrona. Analiza algoritmilor asincroni distribuiti ofera un contrast preliminar si informal cu algoritmii sincroni. Avand in vedere un algoritm distribuit, pentru ecare procesor, exista o multime de timpi in care procesorul executa calculele, si alti timpi la care procesorul primeste mesaje de la celelalte procesore. Algoritmul este numit sincron daca el este matematic echivalent cu unul pentru care timpul de calcul, transmiterea si receptionarea mesajelor sunt xe. Spunem ca algoritmul este asincron in cazul in care timpul (prin urmare si ordinea calculelor si receptarea mesajelor de la procesoare) poate varia pe scara larga pentru doua executii diferite ale algoritmului. Pentru a analiza in contrast, ne putem gandi la un algoritm distribuit ca la o colectie de algoritmi locali. Fiecare algoritm local este executat de un procesor diferit si foloseste ocazional date generate de alti algoritmi locali. 3

In cazul cel mai simplu de algoritm sincron, calendarul operatiunilor desfasurate de ecare procesor este complet determinat si este aplicat cu ajutorul unui ceas global. Un tip mai complex de algoritmi sincroni este unul in care momentul exact al operatiunilor desfasurate de ecare algoritm local nu este prestabilit, dar algoritmii locali inca mai trebuie sa astepte la momentele prestabilite ca datele sa devina disponibile. Un exemplu de algoritm asincron este atunci cand algoritmii locali nu asteapta date predeterminate pentru a deveni disponibile; ei continua sa calculeze, incearca sa rezolve problema data cu orice date se intampla sa e disponibile la momentul dat. Cel mai extrem tip de algoritm asincron este cel ce poate tolera modicari in datele problemei sau in sistemul de calcul distribuit, fara a se reporni de la un punct initial. Aceasta situatie apare in principal in retelele de date, in cazul in care nodurile si legaturile de comunicare nu pot reparate sau diferiti algoritmi distribuiti care controleaza reteaua sunt executati. In unele retele, cum ar retelele mobile de pachete radio, schimbarile in topologia retelei pot frecvente. In alte retele, astfel de schimbari pot rare, dar timpul de executie al algoritmului poate atat de mare astfel ca probabilitatea de aparitie a unei modicari topologice in timp ce algoritmul se executa este foarte mica. De exemplu exista situatii in care algoritmul trebuie sa functioneze chiar daca au loc erori in ceea ce priveste nodurile sau legaturile retelei. Exista o serie de dicultati aici. In primul rand, trebuie sa se stie mereu care sunt nodurile si legaturile care au dat erori; aceste informatii pot avea un impact asupra algoritmului distribuit. In al doilea rnd, un nod sau o legatura cu erori va afecta, de obicei, algoritmul. Pentru a face fata situatiei, algoritmul ar trebui sa e capabil sa se adapteze la esec sau ar trebui sa e anulata eroarea si sa e repornit algoritmul (gura 3).

Figure 3: Exemplu de dicultate de comunicare

3.1

Metode de relaxare asincrone

Consideram un sistem cu n procesoare si o problema de punct x n-dimensionala, unde dorim sa aam un vector x = (x1 , . . . , xn ) ce satisface: xi = fi (x1 , . . . , xn ), i = 1, . . . n (2)

unde fi sunt functii date de n variabile. Presupunem ca ecare procesor i updateaza variabila xi conform relatiei (2) pornind de la un set de date initiale. O implementare sincrona a algoritmului necesita ca procesorul i sa nu realizeze updatarea k pana nu a primit toate rezultatele de care are nevoie in cadrul functiei fi din etapa k 1. In aceasta situatie apar probleme de sincronizare: Procesorul i dupa ce updateaza variabila xi trebuie sa ramana idle in timp ce asteapta mesaje de la alte procesoare (gura 4). In particular, o comunicare lenta incetineste intregul calcul.

Figure 4: Exemplu de comunicare cu intarziere

Figure 5: Exemplu de comunicare lenta (canal de comunicare lent/ procesor lent) Procesoarele care sunt rapide, e pentru ca au o putere de calcul mare, e pentru ca au putine calcule de efectuat, trebuie sa astepte ca procesoarele mai lente sa-si termine iteratiile (gura 5). Intr-o versiune asincrona a algoritmului precedent exista o exibilitate mai mare in ceea ce priveste folosirea informatiilor primite de la alte procesoare. In cadrul etapei k, pentru updatarea variabilei procesorului i, pot folosite date de la etapele trecute, nu neaparat cele mai recente rezultate. De exemplu, procesorul 5

i poate executa uptatarea din cadrul etapei k folosind rezultate de la procesorul j de la etapa k + 10, si in acelasi timp procesorul j poate sa execute faza k + 100 folosind rezultate din faza k 10 a procesorului i. Viteza de calcul si de comunicare poate diferita pentru procesoare diferite si de aceea pot exista multiple intarzieri de comunicare. Aceste viteze si intarzieri pot varia foarte mult pe masura ce algorimul progreseaza. Exista deasemena exibilitate in ceea ce priveste conditiile initiale ale ecarui procesor, variabila xi disponibila initial poate diferi de la un procesor la altul. Procesoarele pot deasemenea executa mai multe iteratii daca nu sunt fortate sa astepte rezultate mai recente pentru diferite variabile. Exista pericolul ca astfel de rezultate sa nu e eciente deoarece folosesc informatii care nu mai sunt valabile. Totusi, atunci cand functioneza, algoritmii asincroni reduc penalizarile de sincronizare si obtin mai rapid o solutie a problemei (gura 6).

Figure 6: Diagrama de timp pentru algoritmi sincroni/asincroni Un dezavantaj important al algoritmilor asincroni este acela ca ei pot distruge proprietatea de convergenta pe care o are un algoritm atunci cand este executat sincron. Astfel sunt cazuri in care trebuiesc impuse limitari in ceea ce privesti intarzierile care pot exista pentru a se garanta convergenta algoritmului. In toate cazurile, analiza algorimilor asincroni este considerata a mai dicila decat cea a algoritmilor sincroni. Algoritmii asincroni pot oferi un avantaj important in ceea ce priveste metodele de relaxare si acest lucru poate observat analizand metodele Jacobi si Seidel-Gauss pentru rezolvarea problemelor de punct x. Metoda Jacobi genereaza un sir x(t) = (x1 (t), . . . , xn ()t) cu ajutorul relatiei xi (t + 1) = fi (x1 (t), . . . , xn (t)), i = 1, . . . , n plecand de la un set de date initiale. Metoda Seidel-Gauss foloseste o formula ce utilizeaza cea mai recenta updatare a unei variabile: x1 (t + 1) = fi (x1 (t), . . . , xn (t)) x2 (t + 1) = fi (x1 (t + 1), x2 (t), . . . , xn (t)) ......... xn (t + 1) = fi (x1 (t + 1), . . . , xn1 (t + 1), xn (t)) (3)

Figure 7: Metoda Jacobi - algoritm sincron si asincron Metoda Jacobi este mai potrivita pentru implementari distribuite si este in esenta echivalenta cu algoritmi distribuiti sincroni. Metoda Seidel-Gauss nu este foarte potrivita pentru implementari paralele si distribuite. Este totusi posibil ca algoritmii asincroni sa mareasca viteza metodei Seidel-Gauss in comparatie cu metoda Jacobi fara sa sacrice paralelismul metodei Jacobi (gura 7).