Documente Academic
Documente Profesional
Documente Cultură
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
D:=A+2 E:=A*3
S2
S3
S2:
B:=C
S2
S2:
A := D+ E
S2
S2 S3
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
S2 <= S3
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
cmmdc(19,2)=1 k-m=18
x=2, y=10
Daca L=1, U=10: x,y in interval => S1 S2
Exemplu 3
S1: S2:
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
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
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:=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
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
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
Daca A se redenumeste cu A1 in S3 si S4, aceste relatii de dependenta dispar => (S1, S2) || (S3, S4)
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
S2 S2
S2 S1
S1
S1 S2
S2
UNIVERSITATEA ,,TIBISCUS
Facultatea de Calculatoare si Informatic Aplicat