APD - Note Curs - 2 Notatia

  • Upload
    ssh-das

  • View
    231

  • Download
    0

Embed Size (px)

Citation preview

  • 8/8/2019 APD - Note Curs - 2 Notatia

    1/27

    16

    Capitolul 2. Limbajul de descriere a algoritmilor

    n accepiunea noastr un program concurent este o colecie de procese paralelecomunicante. Exis mai multe categorii de programe concurente, delimitate n funciede raportul dintre procese i procesoarele pe care acestea se execut. n programeleparalele, procesele sunt executate de procesoare distincte care comunic prinvariabile partajate aflate n memoria comun. Uneori, organizarea unui program cao colecie de procese este util chiar n cazul n care acestea se execut pe un singur

    procesor, intercalat. Fiecare proces poate fi planificat i executat independent decelelalte, existnd practic mai multe fire de execuie (threads) n acelai programmultithread. Noiunea de program multithread se extinde i la situaia n carenumrul de procese dintr-un program este mai mare ca numrul de procesoare pe care

    acestea se pot executa. n programele distribuite, procesele se execut pe mainiinterconectate printr-o reea de calculatoare i, ca urmare, comunic prin schimb demesaje.

    Dei exist multe posibiliti de a structura colecia de procese dintr-un programconcurent, s-au impus cteva tipare: paralelismul iterativ, paralelismul recursiv,

    productori i consumatori, clieni i servere, procese egale (interacting peers). Nevom referi la acestea pe parcursul prezentrii limbajului de descriere a algoritmiloria unor exemple semnificative.

    n mod natural, descrierea adoptat pentru programele paralele se ncadreaz nmodelul CSP (Communicating Sequential Processes) propus de Hoare. Ea se bazeaz

    pe construciile clasice ale unui limbaj de programare secvential, extinse cu notaiilece permit concurena, comunicarea i sincronizarea. n plus, deoarece comenzile cugard (Dijkstra 1975) introduc nedeterminismul n programarea secvenial, cu efecteasupra calitii reprezentrii programelor, ele sunt adoptate ca elemente constitutiveale deciziilori ciclurilor.

    Prezentm la nceput notaiile (pseudocod) corespunztoare descrierii algoritmilorsecveniali. n seciunile urmtoare vom introduce construcii specifice programrii

    paralele (bazate pe variabile partajate i comunicare de mesaje).

  • 8/8/2019 APD - Note Curs - 2 Notatia

    2/27

    17

    2.1. Declaraii

    Tipuri de baz sunt considerate urmtoarele: boolean - boolntreg - intreal - realcaracter - charir - stringenumerat.

    Declaraia variabilelor are forma generalvar id1 : tip1 := val1; ... ; idn : tipn := valn;

    unde iniializrile sunt opionale.Definiiile de constante au forma general

    const id1 = val1; ... ; idn = valn;

    Tablourile se declar prin specificarea tipului indicilor i a tipului de baz; uzual,indicele este de tip subdomeniu. Notaia a..b obinuit este nlocuit cu a:b acolo undeelementele tabloului pot fi prelucrate n paralel. Exemplu:

    var vector: array [1:10] ofint;matrice: array [1:n,1:m] ofreal;

    Dacvectoreste un tablou unidimensional, folosim notaiavector[1:5]

    pentru a desemna primele cinci elemente ale sale (n general, o seciune contigudintr-un tablou). Similar, folosim un constructor de tablou, ca n exemplul urmtor

    var forks: array [1:5] ofbool := ([5]false);n care se declar tabloulforksi se iniializeaz toate elementele cu valoarea false.

    O nregistrare se definete ca o colecie de cmpuri cu tipuri potenial diferite.Exemple:

    type student = rec ( nume : string[20];virsta : int;clase : array [1:5] ofstring[15]);

    var queue: rec ( front : int :=1;rear : int :=1;size : int :=0;contents : array [1:n] ofint);

  • 8/8/2019 APD - Note Curs - 2 Notatia

    3/27

    18

    2.2. Instruciuni

    skip este instruciune inoperant. Execuia ei se termin imediat i nu are nici un efectasupra variabilelor programului. Se folosete n comenzile cu gardi n await.

    Atribuirea x:=e evalueaz expresia e i asociaz rezultatul variabilei x. Aceasta poate fi un scalar, un tablou, o nregistrare, un element de tablou, un cmp denregistrare.

    Interschimbarea x1:=:x2 interschimb valorile celor dou variabile.

    Instruciunea compus este o secven de instruciuni. Nu exist o notaie specialpentru ea.

    Comanda cu gard are forma generalB -> S

    unde B este o expresie booleanS este o instruciune (simpl sau compus). S nu poate fi

    executat dac B nu este true.

    Selecia (if) are forma generalifB1 -> S1[] B2 -> S2

    ...[] Bn -> Snfi

    Grzile sunt evaluate ntr-o ordine arbitrar. Dac Bi este true atunci se execut Si. Cualte cuvinte, dac mai multe grzi sunt true, alegerea instruciunii executate estenedeterminist.

    Iteraia (do) are forma general

    do B1 -> S1[] B

    2-> S

    2

    ...[] Bn -> Sn

  • 8/8/2019 APD - Note Curs - 2 Notatia

    4/27

    19

    od

    Grzile sunt evaluate ntr-o ordine arbitrar. Dac una dintre ele, Bi este true atunci seexecut Si, dup care se repet procesul de evaluare. Execuia lui do se termin atuncicnd nici o gard nu este true.

    Ciclul cu contor (fa) are forma generalfa cuantificatori -> instruciuni af

    Fiecare cuantificator specific un domeniu de valori pentru o variabil contor (de tipimplicit int):

    variabila := val_init to val_finala st BCorpul ciclului este executat o dat pentru fiecare valoare a variabilei contor, dacvaloarea expresiei booleene B este true (such that B).

    n cazul mai multor cuantificatori, acetia se separ prin virgule. Corpul ciclului seexecut pentru fiecare combinaie de valori ale variabilelor contor, cu variabila ceamai din dreapta variind cel mai rapid.

    Exemple:1) transpunerea matricei m:

    fa i:=1 to n, j:=i+1 to n -> m[i,j]:=:m[j,i] af

    2) ordonarea cresctoare a unui vector:

    fa i:=1 to n, j:=i+1 to n st a[i]>a[j] ->a[i]:=:a[j] af

    2.3. Proceduri

    O procedur definete un tipar parametrizat al unei operaii. Forma sa general esteurmtoarea:

    procedure p(f1 : t1; ...; fn : tn) returns r : tr;declaraiiinstruciuni

  • 8/8/2019 APD - Note Curs - 2 Notatia

    5/27

    20

    end;

    unde p este numele proceduriifi sunt parametrii formali cu tipurile tir este numele valorii ntoarse i are tipul tr.

    Partea returns este opional.

    O procedur frreturns este apelat explicit prin instruciunea call:call p(e1,...,en)

    n timp ce o funcie (cu returns) apare ca opernd ntr-o expresie:x := p(e1,...,en).

    n ambele cazuri, ei sunt expresii, avnd acelai tip cu parametrii formali

    corespunztori. Transmiterea parametrilor se poate face prin valoare (cazul implicit)sau prin referin (parametrul respectiv trebuie calificat cu var i are dreptcorespondent un parametru efectiv variabil).

    Exemplu: calculul factorialului.procedure fact(i : int) returns f: int;if i f:=-1[] i=0 or i=1 -> f:=1[] i>1 -> f: = i*fact(i-1)fi

    end;

    2.4. Concureni sincronizare

    n accepiunea noastr, un program paralel descrie dou sau mai multe procesecooperante. Ca urmare, dac la execuia unui program secvenial exist un singur firal controlului (thread of control), la cea a unui program paralel exist mai multe fire,cte unul pentru fiecare proces.

    Fie Si un program secvenial (declaraii + instruciuni). Construcia:co S1 // S2 // ... // Sn oc

    specific execuia paralel a programelor S1 ... Sn, efectul fiind o anumit ntreeserea aciunilor lor atomice. Execuia lui co se termin atunci cnd se termin execuiafiecrui Si.

    Exemplu:

    x:=0; y:=0;co x:= x+1 // y:=y+1 oc

  • 8/8/2019 APD - Note Curs - 2 Notatia

    6/27

    21

    z:=x+y;

    Variabilele declarate nainte de co sunt comune proceselor din co. Procesele potdeclara i variabile locale, domeniul unei astfel de variabile fiind procesul n careapare declaraia.

    Adesea, un program paralel conine procese care execut acelai calcul asupra unorelemente de tablou diferite. Descrierea se poate face folosind cuantificatori la fel ca

    pentru instruciunea fa.

    Exemplu:

    co j:=1 to n -> a[j]:=0 oc

    Fiecare proces are o copie proprie a lui j, care se comport n cadrul procesului ca oconstant. Construcia precedent descrie n procese distincte.

    Exemplu: nmulirea a dou matrice:

    var a, b, c: array [1:n, 1:n] of real;co i:=1 to n , j:=1 to n ->

    var sum: real := 0;fa k:=1 to n -> sum := sum+a[i,k]*b[k,j] af;c[i,j] := sum

    oc

    Aici sunt n2 procese, fiecare avnd constantele locale i i j, precum i variabilele

    locale sum i k. n cazul unor procese cu descrieri lungi, se folosete i urmtoareaform, n care se asociaz nume proceselor paralele coninute de un program.

    Exempluvar a, b, c: array [1:n, 1:n] of real;co Prod(i:1..n, j:1..n)::var sum : real := 0;fa k:=1 to n -> sum:=sum+a[i,k]*b[k,j] afc[i,j]:=sum

    oc

    2.5. Atomicitatea i sincronizarea

    Aa cum s-a precizat, execuia unui program paralel poate fi privit ca o ntreesere aaciunilor atomice ale proceselor. Cnd procesele interacioneaz, nu toatecombinaiile sunt acceptabile. De exemplu, s considerm urmtorul program i s

  • 8/8/2019 APD - Note Curs - 2 Notatia

    7/27

    22

    lum ca aciuni atomice citirea i scrierea unei variabile:

    y:= 0 ; z:= 0 ;co x:=y+z // y:=1 ; z:=2 oc

    Dac adunarea este realizat prin ncrcarea valorii lui y ntr-un registru i adugareaulterioar a valorii lui z, valoarea lui x poate fi 0, 1, 2, sau 3, n func ie de vitezelecelor dou procese. La prima vedere, evaluarea unei expresii nu poate fi considerataciune atomic n context paralel, dect dac variabilele din expresie nu sunt alteratede alte procese.

    In realitate, atomicitatea este asigurat de o condiie mai slab, numit proprietateacel-mult-o-dat (at-most-once), care se formuleaz astfel:

    O expresie e satisface proprietatea de cel-mult-o-dat dac ea se refer cel mult odat la cel mult o variabil simpl (element de tablou sau cmp de nregistare) care ar

    putea fi schimbat de un alt proces n timpul evalurii lui e. O instruciune deatribuire x:= e satisface proprietatea de cel-mult-o-dat fie dac e satisface aceast

    proprietate ix nu este citit de un alt proces (adicx este o variabil local), ori dacx este o variabil simpli e nu se refer la nici o variabil care ar putea fi schimbatde un alt proces.

    De exemplu, nici o atribuire din construcia:co x := y+1 // y := x+1 oc

    nu satisface proprietatea menionat. De asemenea, atribuirea x := y+z din exempluldat la nceputul seciunii nu satisface aceast proprietate, ea referind dou variabilemodificate de un alt proces.

    n cazurile cnd proprietatea anterioar nu este satisfacut, sau dac dorim grupareamai multor aciuni ntr-o singur aciune atomic de granularitate mai mare, estenecesar un mecanism de sincronizare.

    Pentru a specifica aciuni atomice folosim paranteze unghiulare. De exemplu, nseamn c expresia e trebuie evaluat atomic. Pentru sincronizare, folosimconstrucia:

    S>

    unde B este o expresie boolean, iar S este o succesiune de instruciuni (secveniale)care se termin cu siguran.

  • 8/8/2019 APD - Note Curs - 2 Notatia

    8/27

    23

    Semnificaia este urmtoarea: se ateapt ndeplinirea condiiei B, dup care se

    execut S. Execuia este atomic, deci B este cu sigurantrue la nceperea execuieilui S i nici o stare intern a lui S nu este vizibil din afar.

    Exemplu:0 -> s:=s-1>

    ntrzie procesul executat pn cnd s devine pozitiv, apoi decrementez pe s.

    Forma general a instruciunii await specific att excluderea mutual, ct isincronizarea condiionat. Ea admite formele :

    pentru a exprima doar excluderea mutuali pentru a exprima doar sincronizarea condiionat.

    Exemplu. Programul productor-consumator.

    var buf: int, p: int :=0, c:int :=0;co Productor:: var a: array[1:n] of int;

    do p ;buf := a[p+1];p := p+1

    od

    Consumator:: var b: array [1:n] of int;do c c>;

    b[c+1] := buf;c := c+1

    od

    oc

    Observaii: aciunile atomice se rezum la testele condiiilor, fr a cuprinde icelelalte aciuni asupra variabilelor comune. Sugerm cititorului s ncerce gsireaunei justificri neformale a corectitudinii soluiei.Problem. Elaborai o soluie pentru comunicare printr-un tampon limitat, buf[1:k],cu 1 < k < n.

    Sincronizarea prin await, dei general, este criticat din motive legate att declaritatea descrierilor rezultate, ct i de eficiena posibilelor implementri:- conduce uneori la soluii complicate, greu de neles i de demonstrat;- nu face o separare clar ntre variabilele utilizate pentru sincronizare i cele folosite

    pentru rezultatele calculelor;- tehnica de implementare a acestei sincronizri (numit busy waiting - ateptareactiv) este ineficient, fiecare proces testnd continuu condiia din await pn cnd

  • 8/8/2019 APD - Note Curs - 2 Notatia

    9/27

    24

    aceasta devine adevrat.

    Nu este, deci, de mirare c s-au cutat mecanisme de sincronizare care s nltureneajunsurile menionate (semafoare, regiuni critice, monitoare, bariere, comunicare demesaje). Dintre acestea, ne referim n continuare la bariere de sincronizare i lacomunicarea prin mesaje, des utilizate n exprimarea algoritmilor paraleli.

    2.6. Bariere de sincronizare

    Barierele reprezint un mecanism de sincronizare asociat unei clase de paralelismnumit paralelism de date. Corespondentul arhitectural al acesteia l constituiemodelul SIMD.

    Un algoritm pentru paralelism de date este un algoritm iterativ care prelucreaz nparalel i n mod repetat elementele unui tablou. Acest gen de algoritmi este n modnatural asociat modelului SIMD. El este ns util i n cazul multiprocesoarelorasincrone.

    Un atribut important al algoritmilor iterativi paraleli este c fiecare iteraie depinde(n general) de rezultatul iteraiei precedente. O variant este s se organizeze fiecareiteraie ca o colecie de procese paralele:

    do true ->co k := 1 to n -> cod_proces-k oc

    od

    Soluia este ineficient deoarece creeaz i distruge procese la fiecare iteraie. O adoua soluie, mai eficient, creeaz procesele o singur dat, fcnd sincronizarea lorla trecerea de la o iteraie la alta:

    co Proces(i: 1..n):: do true ->cod_proces_iasteapta terminarea tuturor proceselor

    od

    oc

    Acest tip de sincronizare se numete barier.

    Pentru a da algoritmilor o form general, utilizm o notaie explicit pentru marcareabarierelor, i anume barrier. Menionm ns c sistemele SIMD asigur princonstrucie sincronizarea i elimin necesitatea programrii explicite a barierelor. n

  • 8/8/2019 APD - Note Curs - 2 Notatia

    10/27

    25

    cele ce urmeaz, prezentm soluiile unor probleme tipice din categoria

    paralelismului de date.

    2.7. Aplicaii folosind paralelismul de date

    2.7.1. Operaii cu vectori

    Considerm n continuare calculul paralel al sumelor tuturor prefixelor unui tabloulinear. Mai precis, dat fiind tabloul a[1:n], calculm s[1:n], unde s[i] este suma

    primelor i elemente ale tabloului a.

    Soluia secvenial uzual este urmtoarea:

    s[1] := a[1];fa i := 2 to n -> s[i] := a[i] + s[i-1] af

    Pentru a obine o paralelizare a acestei soluii, s considerm mai nti problemasimplificat a calculului sumei tuturor elementelor unui tablou. n acest scop, am

    putea nsuma la nceput elementele tabloului dou cte dou. n etapa urmtoare,nsumm rezultatle obinute tot dou cte doui aa mai departe. Un exemplu, pentruun tablou cu 8 elemente este dat n figura 2.1.

    Figura 2.1Nu este greu de vzut c putem calcula suma elementelor n log2 n pai, folosind n-1procesoare.

    Pentru sumele prefixelor, adaptm aceast soluie, bazat pe ideea dublrii, la fiecarepas, a numrului elementelor ce au fost nsumate. n acest scop, prezentm mai nti oschem modificat a nsumrii tuturor elementelor, care permite deducerea mai

    simpl a algoritmului paralel.

    a1 a2 a3 a4 a5 a6 a7 a8

  • 8/8/2019 APD - Note Curs - 2 Notatia

    11/27

    26

    +---- +---- +---- +----

    a1 s1

    2 a3 s34 a5 s5

    6 a7 s78

    +-------- +--------

    a1 s12 a3 s14 a5 s5

    6 a7 s58

    +------------------

    a1 s1

    2 a3 s14 a5 s5

    6 a7 s18

    Figura 2.2

    var a: array [1:n] of int;co suma (k:1..n)::

    fa j := 1 to sup(log2 n) ->if k mod 2j = 0 -> a[k] := a[k-2j-1] + a[k]fi

    barrier

    af

    oc

    Din pcate, aceast soluie este aplicabil doar dac numrul elementelor tablouluieste o putere a lui 2. n caz contrar, putem aduga un numr corespunztor deelemente nule. O alt soluie pleac de la observaia c n algoritmul de nsumare,numrul de procesoare folosite efectiv se njumtete la fiecare pas, tot mai multe

    procesoare rmnnd libere, Dac folosim aceste procesoare putem ajunge la o soluie

    general, valabil pentru un numr oarecare de elemente. n acest scop, ncercm sutilizm fiecare procesor la fel ca celelalte: la fiecare pas j, valorii pariale a[k] i seadaug valoarea elementului din poziia k-2j-1, dac aceasta exist. Pentru un tabloucu ase elemente, obinem schema din figura 2.3.

  • 8/8/2019 APD - Note Curs - 2 Notatia

    12/27

    27

    Figura 2.3

    Soluia ob

    inut

    ar avea urm

    toarea descriere:

    var a: array [1:n] of int;co suma(k:1..n)::

    fa j := 1 to sup(log2 n) ->if k-2j-1>=1 -> a[k] := a[k-2j-1] + a[k] fi

    barrier

    af

    oc

    Dei algoritmul pare satisfctor, el ascunde o potenial eroare de sincronizare. Sobservm c, la fiecare ciclu, procesele actualizeaz valorile pariale a[k]. Pentru uncalcul corect, ar trebui ca toate procesele s execute simultan operaiile de adunare iapoi toate s fac atribuirile. Deoarece acest lucru impune introducerea unei noi

    bariere ntre adunare i atribuire, cele dou aciuni trebuie desprite. Acest lucru esteposibil prin introducerea unui tablou temp, folosit ca depozitar temporar al vechilorvalori ale tabloului a. Soluia devine urmtoarea:

    var a, temp: array [1:n] of int;co suma(k:1..n)::

    fa j := 1 to sup(log2 n) ->temp[k] := a[k];

    barrier

    if k-2j-1>=1 -> a[k] := temp[k-2j-1] + a[k] fibarrier

    af

    oc

    n fine, putem evita operaiile de logaritmare i de ridicare la putere, prin utilizarea

    unei variabile d care pstreaz distana fa de poziia elementului k, la care se aflelementul cu care acesta se combin:

    a1 a2 a3 a4 a5 a6

    s11 s1

    2 s23 s3

    4s4

    5 s56

    s11 s1

    2 s13 s1

    4 s25 s3

    6

    s11 s1

    2 s13 s1

    4s1

    5 s16

  • 8/8/2019 APD - Note Curs - 2 Notatia

    13/27

    28

    var a, temp: array [1:n] of int;co suma(k:1..n)::

    var d := 1;do dtemp[k] := a[k];

    barrier

    if k-d>=1 -> a[k] := temp[k-d] + a[k]fi

    barrier

    d := 2*dod

    oc

    Problem. Ce modificri trebuie aduse algoritmului pentru a face temp local

    fiecrui proces?

    Putem face douobservaii importante:- n forma final, algoritmul calculeaz toate sumele prefix;- algoritmul poate fi folosit pentru orice operaie binar asociativ: nmulirea, maxim,minim, sau logic, i logic, sau-exclusiv etc.

    Completarea limbajului de descriere a algoritmilor

    Avnd n vedere c in algoritmii SIMD toate aciunile sunt sincronizate (deci oriceaciune ar trebui urmat de o barier), adoptm o notaie simplificat pentru

    descrierea lor. Astfel, pentru execuia mai multor pai n acelai timp folosim notaiado steps i to j in parallel

    step istep i+1...step j

    od

    iar pentru execuia simultan a aceleiai operaii de mai multe procesoare folosimnotaia

    fa i := j to kdo in parallel

    operaiile lui Piaf

  • 8/8/2019 APD - Note Curs - 2 Notatia

    14/27

    29

    saufa i := r, s, ...t do in paralel

    operaiile lui Piaf

    saufa i in S do in paralel

    operaiile lui Piaf

    Cu aceste notaii, calculul sumelor prefix poate fi reprezentat n modul urmtor:

    var a: array [1:n] of int;fa k := 1 to n do in parallel

    (Procesor Pk)var temp: int; /* variabile locale procesorului k */var d := 1;do dif k-d >=1 -> temp := a[k-d];

    a[k] := temp + a[k] fid := 2*d

    od

    af

    O alt variant se poate obine prin interschimbarea celor dou cicluri, deci ignorndntrzierile de planificare a proceselor pe procesoare (aici fiecare procesor execut un

    singur proces).var A: array [1:N] of real;fa j := 0 to log N - 1 dofa k := 2j+1 to N do in parallel(Procesor Pk)var t: real; /* t este locala procesorului k */1. t := A[k-2j];2. A[k] := t + A[k]

    af

    af

    Observaii

    - aceast variant evideniaz, mai bine dect precedenta, procesoarele active nfiecare faz a algoritmului;- Aciunile de citire i de scriere relative la memoria comun sunt specificate distinct

  • 8/8/2019 APD - Note Curs - 2 Notatia

    15/27

    30

    n algoritm, iar paii executai sincron de procesoare sunt foarte bine precizai;

    - Deoarece numrul procesoarelor care termin de calculat suma parial se dubleazla fiecare pas, calculul se face n O(log N) pai folosind O(N) procesoare.- Dimensiunea tabloului A poate fi redusa la N/2, valorile memorate n ultimul pasfiind inutile.- Utilizare tipic: difuzarea lui n, n cazul algoritmilor adaptivi.

    Difuzarea unei valori

    O operaie frecvent n algoritmii paraleli este cea de difuzare a unei valori tuturorprocesoarelor unui sistem. Fie D celula din memoria comun ce trebuie difuzat celorN procesoare ale unui sistem EREW SIMD. Algoritmul urmtor presupune folosirea

    pentru difuzare a unui tablou A[1:N].

    Pas 1: (Procesorul P1)var t: real; /* t este local procesorului 1 */1.1. t := D;1.2. A[1] := t;

    Pas 2: fa i = 0 to (log N -1) dofa j = 2i+1 to 2i+1 do in parallel

    (Procesor Pj)var t: real; /* t este local procesorului j */2.1. t := A[j-2i]2.3. A[j] := t;

    af

    af

    2.7.2. Operaii cu liste

    Organizarea arborescent a datelor este mult utilizat pentru motivul c ea conduce laalgoritmi de inserare i cutare avnd complexitate sup(log n). Folosirea

    paralelismului de date permite atingerea unei performane similare chiar i pentrustructuri lineare cum sunt listele. Prezentm n continuare algoritmul de gsire asfritului unei liste simplu nlnuite. Metoda poate fi aplicati altor operaii, cumar fi: sumele pariale ale valorilor elementelor din list, inserarea unui element ntr-olist de prioriti, punerea n coresponden a dou liste.

    Considerm o list de pn la n elemente, pstrate ntr-un tablou data[1:n], legturilentre elemente fiind pstrate ntr-un tablou distinct, leg[1:n]. Capul listei este pstrat

  • 8/8/2019 APD - Note Curs - 2 Notatia

    16/27

    31

    ntr-un element separat, cap. Dac un element i face parte din list, atunci fie cap = i,

    fie exist un alt element j, cuprins ntre 1 i n, astfel nct leg[j] = i. Legatura ultimuluielement al listei este 0. De asemenea, leg[k] = 0 dac elementul corespunztor nuface parte din list.

    cap 3 4 2 5 0

    1 2 3 4 5 Figura 2.4

    Algoritmul secvenial standard pornete din capul listei i parcurge legturile ntreelemente, pn atinge sfritul listei. De aceea, timpul de execuie este proporional cunumrul de elemente. n varianta paralel, folosind tehnica "dublrii" din algoritmulsumelor prefixelor, putem aduce timpul la sup(log n). n acest scop, folosim un tablouend[1:n], i dedicm un proces separat, Afla(i), pentru calculul fiecrui elementend[i], al acestui tablou. Presupunem c lista conine cel puin dou elemente.

    Iniial, fiecare proces poziioneaz end[i] la valoarea lui leg[i]. Valoarea end[i] esteactualizat n mod repetat. La fiecare ciclu, dac end[i] i end[end[i]] sunt ambelediferite de 0, atunci Afla(i) seteaz end[i] la valoarea end[end[i]]. Astfel, dup unciclu, legturile din end indic elemente aflate la dou legturi distan fa deelementele curente, dup dou cicluri pe cele aflate la patru legturi distan etc. Dup

    sup(log n) pai, toate elementele vor indica sfritul listei. Algoritmul este urmtorul:

    var leg, end: array [1:n] of int;co Afla (i:1..n)::

    var nou: int; d:int:=1;end[i] := leg[i];

    barrier

    do dnou := 0;if end[i]0 and end[end[i]]0 -> nou:=end[end[i]] fi

    barrier

    if nou0 -> end[i]:=nou fibarrier

    d := 2*d

    odoc

  • 8/8/2019 APD - Note Curs - 2 Notatia

    17/27

    32

    n varianta SIMD dispar barierele, iar ciclul i decizia se contopesc.

    var leg, end: array [1:n] of int;fa i:1 to n do in parallel

    end[i] := leg[i];do end[i]0 and end[end[i]]0 ->

    end[i] :=end[end[i]]od

    af

    Observaie. Algoritmul se poate aplica i pentru gsirea rdcinilor unei pduri dearbori dirijai.

    Variant. Considerm c pentru fiecare nod i, leg[i] indic printele nodului, ntr-un

    arbore al pdurii. De asemenea, dac r este rdcina atunci leg[r] = r. n acestecondiii, algoritmul devine:

    var leg, end: array [1:n] of int;fa i:1 to n do in parallel

    end[i] := leg[i];do end[i] end[end[i]] ->

    end[i] :=end[end[i]]od

    af

    Combinaie sume prefix - pointer jumping.Considerm c fiecrui nod i, i se asociaz o pondere w[i]. Putem calcula, pentru

    fiecare i, suma ponderilor nodurilor aflate pe calea de la nodul i la rdcina arboreluidin care face parte. Se d condiia w[r] = 0 pentru orice rdcin r.

    var leg, end, w: array [1:n] of int;fa i:1 to n do in parallel

    end[i] := leg[i];do end[i] end[end[i]] ->

    w[i] := w[i] + w[end[i]];end[i] :=end[end[i]]

    od

    af

    Probleme- Calculul sumelor pariale ale elementelor unei liste nlnuite.- Punerea n coresponden a elementelor a dou liste. Algoritmul asociaz fiecrui

  • 8/8/2019 APD - Note Curs - 2 Notatia

    18/27

    33

    element al unei liste un pointer ctre "prietenul" su din cealalt list. Complexitatea

    cerut este logaritmic.- Algoritmul de calcul al sfritului unei liste simplu nlnuite, n varianta n carelista poate avea mai puin de dou elemente.

    2.7.3. Operaii cu matrice

    n multe aplicaii, ca prelucrarea imaginilor sau rezolvarea ecuaiilor difereniale, seutilizeaz operaii asupra unor structuri matriceale sau de graf, numite calcule grilsau calcule plas. n grafic, ideea este de a utiliza o matrice care corespunde valorilor

    pixelilor. n rezolvarea unor ecuaii difereniale, elementele de la exteriorulmatricei sunt iniializate cu valorile de grani, scopul fiind gsirea valorilor

    elementelor din mijloc, ceea ce corespunde gsirii unei soluii stabile a ecuaiei.n ambele cazuri, tiparul prelucrrior este urmtorul:

    iniializeaz matriceado neterminat ->

    calculeaz o nou valoare pentru fiecare punctevalueaz terminarea

    od

    La fiecare iteraie, noile valori ale punctelor sunt calculate n paralel.

    Pentru exemplificare, considerm o soluie a ecuaiei lui Laplace (2() = 0) n doudimensiuni. Fie grila[0:n+1, 0:n+1] o matrice de puncte. Putem utiliza n calcul ometod cu diferene finite (de exemplu, Jacobi). La fiecare iteraie, calculm o valoarea fiecrui punct interior ca media aritmetic a celor patru vecini cei mai apropiai.Metoda este staionar, astfel c putem termina iteraiile atunci cnd noile valori

    pentru punctele interioare difer cu mai puin de EPS de valorile anterioare.

    var grila, noua: array [0:n+1, 0:n+1] of real;var converge: boolean := false;co CalculGrila(i:1..n, j:1..n)::

    donot converge ->noua[i,j] := (grila[i-1,j]+grila[i+1,j]+grila[i,j-1]+

    grila[i,j+1])/4;

    barriertest_convergenta;

    barrier

  • 8/8/2019 APD - Note Curs - 2 Notatia

    19/27

    34

    grila[i,j] := noua[i,j];

    barrierod

    oc

    Matricea noua este folosit pentru ca valorile din grila s depind doar de vechilevalori. Calculele se termin atunci cnd toate valorile din noua difer cu mai puin deEPS de valorile din grila. Aceste diferene pot fi calculate n paralel, dar rezultateletrebuie combinate, ceea ce poate fi fcut utiliznd un algoritm prefix paralel.

    Problem (Etichetarea regiunilor)Dat fiind o imagine bidimensional (o gril de valori de pixeli) s se identifice i sse eticheteze n mod unic toate regiunile. O regiune este un set maximal de pixeli

    vecini, care au aceeai valoare.

    2.8. Comunicarea asincron prin mesaje

    n cele prezentate pn aici, comunicarea ntre procese este realizat prin date comune(globale), iar sincronizarea prin mecanismul furnizat de instruciunea await.Transmiterea de mesaje, la rndul su, ndeplinete cele dou funcii: comnicarea esterealizat deoarece datele ajung de la transmitor la receptor, iarsincronizarea esterealizat deoarece un mesaj nu poate fi recepionat nainte de a fi transmis.

    La utilizarea comunicrii prin mesaje, canalele sunt obiectele puse n comun de procese. Absena unor variabile comune reclam tehnici speciale, diferite de cele

    folosite n cazul memoriei partajate. Ele in cont de faptul c procesele comunicanteprin mesaje pot fi distribuite unor procesoare care nu au memorie comun. Din acestmotiv, programele paralele care utilizeaz comunicare de mesaje se mai numescprograme distribuite. Asta nu nseamn c astfel de programe nu pot fi executate desisteme cu memorie comun. n acest caz, canalele sunt implementate folosindmemoria partajati nu o reea de comunicaie.

    n cazul comunicrii prin mesaje asincrone, canalele sunt cozi nelimitate de mesaje.Un proces adaug un mesaj unei cozi prin execuia unei operaii send. Deoarececozile sunt teoretic infinite, operaia nu este blocant. Un proces primete un mesajdintr-o coad prin execuia unei operaii receive. Cnd coada este vid, operaia

    ntrzie procesul, pn la primirea unui mesaj. Canalele pstreaz ordinea mesajelor,deci sunt cozi FIFO.

  • 8/8/2019 APD - Note Curs - 2 Notatia

    20/27

    35

    Declaraia unui canal are forma urmtoare:chan nume_canal (id1: tip1,...,idn: tipn)

    n care se specific numele canalului, precum i numele i tipurile cmpurilor carecompun un mesaj transmis prin acel canal.

    Se pot declara i tablouri de canale ca n exemplul urmtor:chan rezultat [1:n](int)

    n care se declar n canale avnd mesaje cu un singur cmp de tip ntreg. Numelecmpurilor sunt opionale, fapt rezultat i din exemplul specificat.

    Un proces tansmite un mesaj unui canal executnd operaia

    send nume_canal (expresie1,..., expresien)unde expresiile trebuie s aib aceleai tipuri cu cele ale cmpurilor mesajelor,specificate n declaraia canalului. Efectul execuiei unui send este calculul valorilorexpresiilor, alctuirea unui mesaj cu aceste valori i adugarea lui la sfritul coziiasociate canalului.

    Un proces recepioneaz un mesaj prin execua unei operaii

    receive nume_canal (variabila1,..., variabilan)

    unde variabilele trebuie s aib aceleai tipuri cu cmpurile din declaraia canalului.

    Efectul este ntrzierea receptorului pn cnd n coad exist cel puin un mesaj,urmat de preluarea primului mesaj din coad i atribuirea valorilor cmpurilorvariabilelor din list.

    Deoarece canalele sunt (declarate) globale, orice proces poate transmite i recepionape un canal. Cnd canalele sunt folosite astfel, ele mai sunt numite cutii potale. Cndreceptorul este unic, avem de-a face cu un port. n fine, atunci cnd i transmitoruleste unic, avem de-a face cu o legtur.

    O alt operaie util este testul existenei mesajelor pe un canal, avnd formaempty (nume_canal)

    i ntrocnd valoarea adevrat sau fals, dup cum canalul nu are nici un mesaj, sau arecel puin unul. Utilizarea acestui test trebuie fcut cu grij, avnd n vedere c:- dac testul este adevrat, nu nseamn c la reluarea execuiei procesului canalul

  • 8/8/2019 APD - Note Curs - 2 Notatia

    21/27

    36

    este n continuare gol;

    - dac testul este fals, nu nseamn c urmtorul receive va produce recepia imediata unui mesaj (dect dac exist un singur receptor).

    Exemplu. (Filtru) Prezentm codul unui proces care transform un flux de caracterentr-o succesiune de linii de lungime maxim cunoscut.chan input (char), output (array [1:MAXLINE] of char);car_linii::

    var line: array [1:MAXLINE] of char, i: int :=1;do true ->receive input (line[i]);do line[i] CR and i < MAXLINE ->

    {line[1:i] conine ultimele i caractere introduse}i := i+1; receive input (line[i])

    odsend output (line); i := 1

    od

    Alt exemplu. (Replicated workers)n problema cuadraturii, trebuie calculat aria mrginit de graficul unei funciicontinue ne-negative f(x), axa x i dreptele x=l i x=r. Soluia clasic impunemprirea intervalului [l,r] ntr-un numr de subintervale i folosirea unui trapez

    pentru a aproxima aria corespunztoare fiecrui subinterval. Dublm apoi numrul desubintervale din [l,r] i comparm rezultatul obinut cu cel anterior. Dac diferenaeste acceptabil calculul se termin, altfel se recurge la o nou dublare a numrului desubintervale.

    O soluie mai bun este cea adaptiv, n care se pornete procesul cu aria obinutprin considerarea unui singur subinterval [l,r] i apoi a dou subintervale [l,m] i [m,r].Dac rezultatele snt suficient de apropiate, aria trapezului mare este considerat oaproximaie bun a ariei de sub curba f(x). Dac nu, problema se mparte n dousubprobleme care se trateaz separat: calculul ariei din subintervalul [l,m] i calcululariei din subintervalul [m,r]. Se repet acest proces pn cnd se obine o soluieacceptabil pentru fiecare subinterval. Spre deosebire de prima soluie, n a doua segenereaz noi subprobleme doar pentru o parte din subintervale. n ambele cazuri,subproblemele snt independente, ceea ce permite paralelizarea uoar a algoritmului.

    n acest scop, se utilizeaz un proces administrator, care genereaz prima problem

    i ateapt rezultatul, precum i mai multe procese de lucru, care rezolvsubproblemele, genernd eventual alte subprobleme. Procesele de lucru mpart unacelai canal sac, ce conine problemele de rezolvat. O problem este caracterizat

  • 8/8/2019 APD - Note Curs - 2 Notatia

    22/27

    37

    prin cinci valori: limitele subintervalului a i b, valorile f(a) i f(b), precum i aria

    corespunztoare (pentru a evita recalcularea sa). Cnd un proces de lucru gseterspunsul la o subproblem, el trimite administratorului, printr-un canal separat,rezultatul. Programul se termin cnd administratorul detecteaz calculul ntregii arii.

    chan sac (a, b, fa, fb, aria: real);chan rezultat (a, b, aria: real);

    Administrator::var l, r, fl, fr, a, b, aria, total: real;alte variabile de marcare a intervalelor terminate;fl := f(l); fr := f(r);aria := (fl+fr)*(r-l)/2;send sac(l, r, fl, fr, aria);do nu s-a calculat toata aria ->

    receive rezultat (a, b, aria);total := total + aria;marcheaza intervalul [a,b] terminat;

    od;

    Lucru(i:1..n)::var a, b, m, fa, fb, fm: real;var arias, ariad, ariat, dif: real;do true ->

    receive sac (a, b, fa, fb, ariat);m := (a+b)/2; fm := f(m);calculeaz arias si ariad;dif := ariat - arias - ariad;if dif mic -> send rezultat (a, b, ariat);[] dif mare -> send sac (a, m, fa, fm, arias);

    send sac (m, b, fm, fb, ariad);fi

    od;

    Exerciii

    1) In programul precedent, toate procesele de lucru recepioneaz din acelai canal(sac). Modificai programul astfel ncat s se foloseasc doar canale cu un singurreceptori mai muli transmitori.2) Scriei un program de sortare rapid folosind procese replicate. Iniial, tabloula[1:n] este local administratorului. La terminarea programului, irul sortat trebuienapoiat administratorului care-l va memora n a[1:n].3) Folosii metoda proceselor replicate pentru a gsi toate soluiile n problema celor 8

    regine.

    2.9. Comunicarea sincron prin mesaje

  • 8/8/2019 APD - Note Curs - 2 Notatia

    23/27

    38

    Comunicarea asincron de mesaje are unele neajunsuri privind confirmarea recepieii eficiena:- pentru ca transmitorul s fie informat de recepia mesajului comunicat, este nevoiede un mesaj de rspuns;- dac rspunsul nu sosete, transmitorul nu poate ti dac mesajul a fost sau nu

    primit (receptorul a czut nainte de , sau dup primirea mesajului);- spaiul ocupat de mesajele transmise dar nerecepionate poate fi mare i deciineficient utilizat.

    Comunicarea sincron elimin aceste neajunsuri. Aici, ambele primitive, send ireceive sunt blocante. Astfel, la execuia unei transmisii, procesul ateapt pn cnd

    un altul efectueaz o recepie din acelai canal. Transmitorul poate continua dacmesajul a fost efectiv preluat. Mesajele nu trebuie s fie memorate temporar n cozi.

    Pe de alt parte, comunicarea sincron este uneori neconvenabil. Dup cum se vede,ea este o legtur unu la unu ntre procese, astfel nct anumite operaii, cum ar fidifuzarea de mesaje, sunt greu de realizat.

    Pentru reprezentarea primitivelor de comunicare sincron, folosim notaia din CSP(Hoare) relativ la comunicarea cu gard. Aceasta poate fi folosit n egal msur ncomunicaia asincron sau n tehnica rendezvous. (Spre deosebire de comunicareasincron, numit i rendezvous simplu, n tehnica rendezvous extins un procesaccept un apel executat de un alt proces, prin intermediul unei instruciuni specifice

    input sau accept, realizeaz diverse prelucrri i apoi ntoarce rezultatele obinute.)

    Comunicarea ntre procese are loc prin primitive de intrare/ieire, de forma:

    Destinaie ! port (e1,...,en)Surs ? port (v1,...,vn)

    unde Destinaie i Surs sunt procese, iar port identific unul din canalele decomunicaie ale acestora. Pentru prima dintre primitive, de ieire, valorile expresiilorei sunt transmise portului specificat al procesului Destinaie. Portul poate lipsi, dacnu exist posibilitatea de confuzie, iar dac mesajul are un singur cmp, se poaterenuna i la paranteze.

    Pentru a doua primitiv, mesajul primit la portul specificat, de la procesul Surs, este

  • 8/8/2019 APD - Note Curs - 2 Notatia

    24/27

    39

    asociat variabilelor vi.

    De menionat c primitivele se execut simultan n tandem, dac:- instruciunea de ieire apare n procesul specificat de instruciunea de intrare;- instruciunea de intrare apare n procesul specificat de instruciunea de ieire;- identificatorii porturilor coincid;- toate atribuirile de forma vi := ei ar fi valide.

    Fie instruciunile:(1) X ? (a,b) i(2) DIV ! (3*x+y, 12).

    Conform primeia, se preiau de la procesul X dou valori i se atribuie variabilelorai

    b. Prin cea de a doua, se evalueaz cele dou expresii i se transmit procesului DIVrezultatele. Dac procesul DIV execut comanda (1), iar procesul X comanda (2),atunci cele dou se deruleaz simultan i au acelai efect ca atribuirea (a,b) := (3*x+y,12).

    Exemple.

    1) Filtru. Copierea unor valori de la vest la est:Copy:: var c: char;

    do true -> vest ? c; est ! c od

    2) Client - Server. Calculul cmmdc printr-un proces server:CMMDC:: var x, y: int;

    do true -> CLIENT ? arg (x,y);

    do x > y -> x := x-y;[] x < y -> y := y-xod

    CLIENT ! result (x)od

    CLIENT-ul trebuie s conin instruciunile...CMMDC ! arg (v1, v2); CMMDC ? result (r);...

    Primitivele de intrare/ieire pot fi extinse la instruciuni de comunicare cu gard,care au forma:

    B; C -> S

    unde B este o expresie bolean opionalC est o primitiv de comunicare opional, iarS este o list de instuciuni.

  • 8/8/2019 APD - Note Curs - 2 Notatia

    25/27

    40

    Dac B este omis, ea are valoarea implicit true. Dac C este omis, expresia se

    reduce la o comand cu gard, uzual.

    mpreun B i C alctuiesc garda. Garda este rezolvat cu succes dac B este trueiexecuia lui C se poate face imediat (este n ateptare o instruciune de comunicare

    pereche). n acest caz, se execut mai nti comanda de comunicare C i apoi secvenaS. Pe de alt parte, dac B estefalse garda nu este reuit. n fine, garda se blocheazdac B este true, dar C nu poate fi executat imediat.

    Comunicarea cu gard este utilizat n instruciunile ifi do. Astfel, la un if, dac celpuin o gard se rezolv cu succes, una din secvenele asociate este luat la ntmplarei executat. Dac toate grzile sunt nereuite atunci ifse termin. Dac nici o gard

    nu este reuit, dar anumite grzi sunt blocate, atunci execuia se ntrzie pn cnduna reuete. Similar se executi do.

    n grzi pot apare att instruciuni de intrare, ct i instruciuni de ieire.

    Exemple.

    1) Filtru. Transmitere cu nlocuire. Transmite ctre procesul est caracterele produsede procesul vest. nlocuiete fiecare pereche de asteriscuri ** cu caracterul sgeat ^.Prin convenie, ultimul caracter transmis de vest nu este un asterisc.

    INLOCUIRE:: do var c: char; vest?c ->

    if casterisc -> est!c[] c=asterisc -> vest?c;if casterisc -> est!asterisc; est!c[] c=asterisc -> est!sageatafi

    fi

    od

    2) Comunicare printr-un tampon limitat.

    Copy:: var buffer: array [1:10] of char;var front: int := 1, rear: int := 1, count: int := 0do count

    count := count+1; rear := (rear mod 10) +1

    [] count > 0; est ! buffer [front] ->count := count -1; front := (front mod 10) +1

    od

  • 8/8/2019 APD - Note Curs - 2 Notatia

    26/27

    41

    Procesul are dou grzi. Prima este reuit dac exist loc n tampon i vest este gatas trimit un caracter. A doua reuete cnd exist caractere in tampon i est este

    pregtit s accepte un caracter. De remarcat c instruciunea do nu se terminniciodat, deoarece cel puin una din condiiile booleene din grzi este ndeplinit.

    3) Client - Server. (Calculul cmmdc.) Procesul CMMDC joac rolul unui server,care accept dou numere ntregi pozitive i d ca rezultat cmmdc al lor. Algoritmuleste o variant uor modificat a celui de la nceputul seciunii.

    CMMDC:: var x, y: intdo Client ? arg (x,y) ->

    do x > y -> x := x-y[] x < y -> y := y-x odClient ! result (x)

    od

    n cazul unui server cu mai muli clieni, fiecare dintre acetia trebuie s aib oidentitate distinct, de exemplu un indice distinct, n cazul unui tablou de utilizatori.Ca urmare, pentru a arta c serverul este pregtit s comunice cu oricare dintreutilizatori, folosim o comand cu gard cu un subdomeniu, de exemplu:

    do (i:1..100) X(i)?(parametri) ->...X(i)!(rezultate)

    od

    Exemplu. Calculul cmmdc.

    CMMDC:: var x, y: intdo (i:1..n) Client(i) ? arg (x,y) ->do x > y -> x := x-y[] x < y -> y := y-x odClient(i) ! result (x)

    od

    Aici, subdomeniul (i:1..n) asociat buclei do exterioare este o prescurtare a unei serii

    de instruciuni de comunicare cu gard, cte una pentru fiecare valoare a lui i. Caurmare, construcia se interpreteaz astfel: CMMDC ateapt s primeasc o intrare

  • 8/8/2019 APD - Note Curs - 2 Notatia

    27/27

    42

    de la unul dintre clieni; indexul clientului care a furnizat intrarea este folosit pentru a

    dirija rspunsul n mod corespunztor. Comportarea este aceea a unui monitor(Hoare).