8inf856
DESCRIPTION
8INF856. Algorithmes parallèles. Le langage parallèle Cilk. Trois nouveaux mots clés: s pawn s ync Parallel Si on enlève ces mots clés, on obtient un programme C standard. Exemple: Fibonacci. P-Fib (n) if nTRANSCRIPT
8INF856
Algorithmes parallèles
Le langage parallèle Cilk
Trois nouveaux mots clés:1. spawn2. sync3. Parallel
Si on enlève ces mots clés, on obtient un programme C standard.
Exemple: Fibonacci
P-Fib(n) if n<=1 return n else x = spawn P-Fib(n-1) y = P-Fib(n-2) sync return x+y
Exemple: Fibonacci
Mesures de performance
• Travail (work): temps séquentiel• Durée (span): temps parallèle• TP: temps d’exécution sur p processeurs
• T1: travail
• T∞:durée
Mesures de performance
• Loi du travail: TP ≥ T1/P
• Loi de la durée: TP ≥ T∞
• Accélération: T1/Tp ≤ P
• Parallélisme: T1/T∞ ≥ T1/Tp
Analyse de P-Fib
T1(n) = θ(ϕn) où ϕ est le nombre d’or
T∞(n) = max(T∞(n-1), T∞(n-2)) + θ(1)
= T∞(n-1) + θ(1)
= θ(n)
Parallélisme: θ(ϕn/n)
Boucles parallèles
Exemple: On veut multiplier une matrice M par un vecteur x
Mat-Vec(M,x,n) parallèle for i=1 to n do y[i]=0 parallèle for i=1 to n do for j=1 to n do y[i] = y[i] + M[i,j]*x[j] return y
Implémentation des boucles parallèles
On implémente les boucles parallèles à l’aide de l’instruction spawn:
Mat-Vec-Main-Loop(M,x,y,n,d,f) if (d==f) for j=1 to n do y[d] = y[d] + M[d,j]*x[j] else m = (d+f)/2 spawn Mat-Vec-Main-Loop(M,x,y,n,d,m) Mat-Vec-Main-Loop(M,x,y,n,m+1,f) sync
Implémentation des boucles parallèles
Analyse de Mat-Vec(A,x,n)
• Travail: θ(n2)• Durée:
Total: θ(n)• Parallélisme: θ(n2/n) = θ(n)
Θ(lg n)
Θ(lg n) + θ(n)
Θ(1)
Mat-Vec(M,x,n) parallèle for i=1 to n do y[i]=0 parallèle for i=1 to n do for j=1 to n do y[i] = y[i] + M[i,j]*x[j] return y
Multiplication matricielle (1)
Multiplier deux matrices carrées
P-Square-Matrix-Multiply(A,B,n) parallèle for i=1 to n do parallèle for j=1 to n do C[i,j]=0 for k=1 to n do C[i,j] = C[i,j] + A[i,k]*B[k,j] return C
Quel est la durée et le parallélisme?
Multiplication matricielle (2)
Algorithme de Strassen
Tri-fusion parallèle (première version)
Tri-fusion(A, p, r)if (p>= r) returnq= partie entière de (p+r)/2spawn Tri-fusion(A, p, q)Tri-fusion(q+1, r)syncFusion(A, p, q, r)
Fusion parallèleP-fusion(T,p1, r1, p2, r2, A, p3)
n1=r1-p1+1; n2=r2-p2+1if n1<n2 interchanger (n1,p1,r1) et (n2,p2,r2)if n1>0
q1= partie entière de (p1+r1)/2q2=recherche-dychotomique(T[q1], T, p2, r2)q3=p3+(q1-p1) + (q2-p2)A[q3]=T[q1]spawn P-fusion(T, p1, q1-1, p2, q2-1, A,
p3)P-fusion(T, q1+1, r1, q2, r2, A, q3+1)sync
Tri-fusion parallèleP-tri-fusion(A,p,r,B,s)
//tri les éléments de A[p..r] et les place dans B[s..s+r-p]if (n—1) B[s]=A[p]sinon
soit T[1..n], un nouveau tableauq=partie entière de (p+r)/2q’=q-p+1spawn P-tri-fusion(A,p,q,T,1)P-tri-fusion(A,q+1,r,T,q’+1)syncP-fusion(T,1,q’,q’+1,n,B,s)