Sunteți pe pagina 1din 32

Proiectarea algoritmilor paraleli

Descrierea unui algoritm paralel


Identificarea partilor problemei care se pot executa in paralel Maparea partilor pe mai multe procesoare Impartirea datelor (de intrare, iesire si intermediare) Gestiunea accesului la datele comune mai multor procesoare Sincronizarea intre procese

Paralelizarea automata
Programatorul nu trebuie sa specifice descompunerea in taskuri paralele Compilatorul analizeaza programul pentru a determina relatiile de dependenta intre instructiuni, genereaza graful dependentelor de date si pe baza acestuia concurentizeaza sau vectorizeaza anumite instructiuni Aplicabila pentru paralelizari de granularitate fina, pe cod bine structurat

Situatii de dependenta de date: 1. dependenta adevarata


S1: S2: S3: A:=B+C
S1

D:=A+2 E:=A*3
S2

S3

S1 S2 (S2 depinde de S1) S1 S3 (S3 depinde de S1)

Situatii de dependenta de date: 2. antidependenta


S1: A := B + C
S1

S2:

B:=C
S2

Valoarea variabilei folosite in S1 este atribuita in S2


S1 S2

Situatii de dependenta de date: 3. dependenta de iesire


S1: A := B + C
S1

S2:

A := D+ E

S2

S1 si S2 atribuie valori aceleiasi variabile


S1 S2

Situatii de dependenta de date: 4. dependenta de fluxul de control


S1: S2: S3: A := B + C if (X>0) then A := 0 else D := A; S1 S3 S1 S2

S2 S3

Dependenta de date in interiorul ciclurilor


Instanta unei instructiuni din interiorul unui ciclu: executia instructiunii intr-o anumita iteratie In interiorul unui ciclu se stabilesc relatii de dependenta intre instante ale instructiunilor
In cadrul aceleiasi iteratii Peste mai multe iteratii

Directia de dependenta: =, <. >

Exemplu =
For i:=2 to N do S1: A[i] := B[i] + C[i] S2: D[i] := A[i] End for
S1 = S2

Exemplu <
For i:=2 to N do S1: A[i] := B[i] + C[i] S2: D[i] := A[i-1] End for
S1 < S2

i-1

Exemplu
For i:=2 to N do S1: A[i] := B[i] + C[i] S2: D[i] := A[i+1] End for
S2 < S1

i+1

Cicluri incuibate
Se analizeaza dependentele de date pentru fiecare indice Exista un vector de directii de dependente de date, avand un numar de elemente egal cu numarul de cicluri incuibate

Exemplu 1 - cicluri incuibate


for i:=1 to N do for j:=2 to N do S1: A[i,j] := A[i,j-1] + B[i,j] S2: C[i,j] := A[i,j]+D[i+1,j] S3: D[i,j] :=1 end for end for S1 =< S1 S1 == S2

S2 <= S3

Exemplu 2 - cicluri incuibate


for i:=2 to N do for j:=1 to N do S1: A[i,j] := B[i,j] +1 S2: C[i,j] := A[i-1,j+1] end for end for

S1 <> S2

Testul CMMDC
In cazul unor expresii de indici de tip [c*i+m] si [d*i+k] daca cmmdc(c,d) nu este divizor al lui k-m: NU exista dependenta de date daca cmmdc(c,d) este divizor al lui k-m: depinde de valorile lui L si U

Exemplu 1 Testul cmmdc


for i := L to U do S1: A[2*i] := S2: := A[2*i-1] end for
cmmdc(2,2)=2 k-m=-1
2 nu este divizor al lui -1 =>

Nu exista dependenta de date intre S1 si S2, oricare ar fi L si U

Exemplu 2 Testul cmmdc


for i := L to U do S1: A[19*i+3] := S2: := A[2*i+21] end for
2 este divizor al lui 18 => exista (x,y), trebuie verificat daca in [L,U]

cmmdc(19,2)=1 k-m=18

x=2, y=10
Daca L=1, U=10: x,y in interval => S1 S2

Daca L=3, U=10: x nu e in interval => S1 S2

Exemplu 3
S1: S2:

for i := 1 to 10 step 2 do A[i] := := A[i-1] end for

Nu exista dependenta, multimea valorilor 1,3,5,7,9

Vectorizarea ciclurilor
In cazul unor cicluri incuibate se incearca vectorizarea ciclului cel mai interior Ciclul poate fi vectorizat daca nu exista cicluri in graful de dependente de date

Exemplu 1 vectorizarea unui ciclu


S1

for i :=1 to N do
S1: S2: S3: A[i] := B[i] C[i] :=A[i] + B[i] E[i] :=C[i+1] end for
S2

S1 = S2 S3 < S2
S3

S1: S3: S2:

A[1:N] := B[1:N] E[1:N] :=C[2:N+1] C[1:N] :=A[1:N] + B[1:N]

Exemplu 2 vectorizarea unui ciclu


S1: S2: S3: S4:

for i :=2 to N do A[i] := B[i] C[i] :=A[i] + B[i-1] E[i] :=C[i+1] B[i] :=C[i] + 1 end for
A[2:N] := B[2:N] E[2:N] :=C[3:N+1] for i:=2 to N do C[i] :=A[i] + B[i] B[i] :=C[i]+2 end for

S1

S1 = S2 S2 = S4 S1 = S4

S2

S3

S3 < S2
S1: S3: S2: S4:
S4

S4 < S2

Concurentizarea ciclurilor
Se partitioneaza setul de iteratii ale unui ciclu si se asigneaza cate un subset de iteratii fiecarui procesor Probleme:
Incarcarea echilibrata a procesoarelor Sincronizarea intre procese
Daca toate dependentele de date dintr-un ciclu au directia =, iteratiile sunt independente si pot fi executate concurent fara sincronizare intre ele Daca exista dependente de date care au directia < este nevoie de sincronizare

Vectorizare si concurentizare
Un singur ciclu: se imparte domeniul indicelui in
subdomenii care se atribuie fiecare cate unui procesor, apoi fiecare subdomeniu se vectorizeaza Pentru eficienta, este recomandat ca dimensiunea unui subdomeniu sa fie egala cu lungimea registrilor vectoriali LRG for i:=1 to LRG do
end for

for i:=1 to 100 do end for

for i:=LRG+1 to 2*LRG do end for for i:=n*LRG+1 to 100 do end for

Vectorizare si concurentizare
Cicluri incuibate: reguli:
Ciclul cel mai interior se vectorizeaza, cel exterior se concurentizeaza Dependentele de date care au directia < necesita sincronizare, deci sunt mai potrivite pentru vectorizare Dependentele de date care au directia = permit concurentizarea Vectorizarea este eficienta daca elementele vectorului sunt la adrese succesive de memorie

Exemplu vectorizare si concurentizare


for i:=1 to n do
for j:=1 to n do A[i,j]:= B[i,j] end for end for forall i:=1 to n do A[i,1:n] :=B[i, 1:n] end forall

Se presupune ca memorarea matricilor se face pe linii:

Linia 1

Linia 2

Linia n

Exemplu
for j :=1 to n do
for i := 1 to n do S1: A[i,j+1] := B[i,j] +C[i,j] S2: D[i,j] := A[i,j]*2 end for end for S1 <= S2

Se presupune ca memorarea matricilor se face pe coloane: => vectorizare dupa i


Concurentizarea dupa j => necesita sincronizare datorita dependentei <

Continuare exemplu
Vectorizare dupa i (av: memorarea e pe coloane) Concurentizare dupa j (dezav: sincronizare)
foracross j :=1 to n do
S1: A[1:n,j+1] := B[1:n,j] +C[1:n,j] signal(j) if (j>1) wait (j-1) end if S2: D[1:n,j] := A[1:n,j]*2 end foracross

Continuare exemplu
Se transforma codul, interschimband ciclurile Vectorizare dupa j (dezav: memorarea nu e pe linii, operatiile vectoriale sunt mai lente la incarcarea registrilor vect) Concurentizare dupa i (av: nu trebuie sincronizare)

forall i :=1 to n do S1: S2: A[i,2:n+1] := B[i,1:n] +C[i,1:n] D[i,1:n] := A[i,1:n]*2 end forall

Eliminarea dependentelor de iesire si a antidependentelor


Redenumirea variabilelor
S1: S2: S3: S4: A := B+C D := A+1 A := D+F F := A -1 S2 S3 S1 S3
Din cauza ca variabila A este refolosita in S3

S1: S2: S3: S4:

A := B+C D := A+1 A1 := D+F F := A1 -1

Daca A se redenumeste cu A1 in S3 si S4, aceste relatii de dependenta dispar => (S1, S2) || (S3, S4)

Eliminarea dependentelor de iesire si a antidependentelor


Divizarea nodurilor : pentru eliminarea ciclurilor din
graful dependentelor de date
S1

for i :=1 to N do S1: A[i] := B[i] + C[i] S2: D[i] := (A[i]+A[i+1])/2 end for

S1 S2

S2 S1
S2

Divizarea nodurilor (continuare)


for i :=1 to N do S2: ATEMP[i] :=A[i+1] S1: A[i] := B[i] + C[i] S2: D[i] := (A[i]+ATEMP[i])/2 end for
S2

S2 S2

S2 S1
S1

S1 S2

S2

S2: S1: S2:

ATEMP[1:N] :=A[2:N+1] A[1:N] := B[1:N] + C[1:N] D[1:N] := (A[1:N]+ATEMP[1:N])/2

UNIVERSITATEA ,,TIBISCUS
Facultatea de Calculatoare si Informatic Aplicat

PROIECT Calcul Paralel si Distribuit

Student: oav Alin

S-ar putea să vă placă și