Introduction à l'algorithmique parallèle
Introduction à l'algorithmique parallèle
Algorithmique parallèle
Introduction au parallélisme 1
Plan
Introduction au parallélisme 2
Introduction au parallélisme 3
1
Un Modèle générique du parallélisme: le DAG
Introduction au parallélisme 4
Introduction au parallélisme 5
Introduction au parallélisme 6
2
CILK
Introduction au parallélisme 7
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 8
Dynamic Multithreading
cilk int fib (int n) {
if (n<2) return (n); Example: fib(4)
else {
int x,y;
x = spawn fib(n-1);
y = spawn fib(n-2); 4
sync;
return (x+y);
} 3 2
}
2 1 1 0
“Processor
oblivious”
3
Multithreaded Computation
initial final
thread thread
continue
edge return edge
spawn edge
Stratégie de parallélisation:
1. convertir la boucle en récursion
void vadd (double *X, double *Y, double *Z,int n) {
if (n <= B) {
int i; for (i=0; i<n; i++)
Z[i]= X[i]+Y[i];}
else {
vadd(X, Y ,Z, n/2);
vadd(X+n/2, Y+n/2 ,Z+n/2, n-n/2);}
}
Introduction au parallélisme 11
Stratégie de parallélisation:
2. expliciter le parallélisme
cilk vadd (double *X, double *Y, double *Z,int n) {
if (n <= B) {
int i; for (i=0; i<n; i++)
Z[i]= X[i]+Y[i];}
else {
spawn vadd(X, Y ,Z, n/2);
spawn vadd(X+n/2, Y+n/2 ,Z+n/2, n-n/2);
sync;}
}
Introduction au parallélisme 12
4
ParallélisaDon récursive
cilk vadd (double *X, double *Y, double *Z,int n) {
if (n <= B) {
int i; for (i=0; i<n; i++)
Z[i]= X[i]+Y[i];}
else {
spawn vadd(X, Y ,Z, n/2);
spawn vadd(X+n/2, Y+n/2 ,Z+n/2, n-n/2);
sync;}
}
ParallélisaDon récursive
T(1) = Θ(n)
T∞ = Θ(lg(n))
T1 = Θ( n )
T∞ lg(n)
BASE
July 13, 2006 14
Avantages
Stratégie de parallélisa9on:
1. Conver9r la boucle en récursion
2. Expliciter le parallélisme
• C’est une stratégie Divide & Conquer qui
favorise la localité ET la répar99on de charge
• La performance ne dépend pas de B au
premier ordre
• Mais synchronisa9ons inu9les
Introduction au parallélisme 15
5
GesDon explicite des tâches
cilk void vadd1 (double *X, double *Y, double *Z){
int i; for (i=0; i<B; i++)
Z[i]= X[i]+Y[i];}
}
cilk void vadd (double *X, double *Y, double *Z){
int j; for(j=0; j<N; j+=B) {
spawn vadd1(X+j, Y+j, Z+j);}
sync;
}
Aussi à la PVM, threads
… T∞ = B + N/B
T1 = N
… Conclusion ?
Réaliste : l’addi9on et le spawn sont au mieux du même ordre
Introduction au parallélisme 18
6
RelaxaDon
ij 0 k+1
• Calculer en chaque 0
point la moyenne des 4
voisins
• Tant que la différence
entre le tableau actuel k+1
et le précédent n’est
pas négligeable
Stencil 5 points
19 Introduction au parallélisme
Introduction au parallélisme
Introduction au parallélisme
7
Plan
Introduction au parallélisme 22
PrimiDves
Introduction au parallélisme 23
La réducDon
• Réalisa9ons op9misées
spécifiques de chaque
architecture, visibles à
travers des construc9ons
du langage
– OpenMP: reduc9on(+:result) S(n, n) = ?
– MPI_reduce S(n, p) = ?
Introduction au parallélisme 24
8
La réducDon
• Où est le résultat ?
– OpenMP: partout, plus
précisément dans une
variable partagée
– MPI_reduce : sur un seul
processeur
– Si on veut l’avoir sur tous
les processeurs,
MPI_Allreduce
– Pourquoi ?
Introduction au parallélisme 25
Introduction au parallélisme 26
9
ApplicaDons élémentaires
Introduction au parallélisme 28
Master Method
Problème : résoudre
T(n) = aT (n/b) + f(n)
Avec a ≥ 1, b > 1 et f(n) asymptotiquement
positive
Introduction au parallélisme 30
€
10
Master Method – Cas 1
Introduction au parallélisme 33
11
Produit de matrices
c11 c12 c1n a11 a12 $ a1n b11 b12 $ b1n
c21 c22 c2n a21 a22 a2n b21 b22 b2n
= X
$ $
$ $ $ $ $ $ $ $
cn1 cn2 cnn an1 an2 $ ann bn1 bn2 $ bnn
C A B
n
c ij = ∑ aik bkj
k=1
<init C>
for (i= 0; i < n; i++)
for (j = 0 ; j < n; j++)
for (k = 0; k <n; k++)
C[i,j] = A[i,k]*B[k,j];
Introduction au parallélisme 35
<init C>
parfor (i= 0; i < n; i++)
parfor (j = 0 ; j < n; j++) {
parfor (k = 0; k <n; k++)
temp[i,j,k] = A[i,k]*B[k,j];
C[i,j] = Sum_reduce (3, temp);
}
En réalité, temp est réalisé soit comme une variable
privée (EAU), soit comme une variable locale
(EAM)
Introduction au parallélisme 36
12
ParallélisaDon naïve
€ Introduction au parallélisme 37
13
AddiDon de matrices
14
ConstrucDon de tableau
Complexité
séquen9elle : n2
ApplicaDons
• Relaxa9on de Gauss‐Seidel
– Même applica9ons que la relaxa9on de Jacobi
– Converge beaucoup plus vite
• Programma9on dynamique
– Edit distance
– Alignement de séquences
–…
Introduction au parallélisme 44
ConstrucDon Récursive
spawn I;
sync;
spawn II;
I II spawn III;
sync;
n spawn IV;
sync;
III IV
DAG ?
15
ConstrucDon récursive
n
T∞(n)= 3T∞(n/2)
T∞(n) = Θ(nlg(3))
I II T1/T∞ = n2/nlg(3)
n ≈ n0.42
Pour n = 1000,
III IV T1/T∞ ≈ 17
Plus de parallélisme
n
spawn I;
sync;
spawn II;
I II IV spawn III;
sync;
spawn IV;
n spawn V;
III V VII spawn VI
sync;
spawn VII;
spawn VIII;
VI VIII IX sync;
spawn IX;
sync;
July 14, 2006 47
Plus de parallélisme
n
T∞(n)= 5T∞(n/3)
T∞(n) = nlg3(5)
I II IV
T1/T∞ = n2/nlg3(5)
n ≈ n0.54
III V VII
Pour n = 1000,
VI VIII IX T1/T∞ ≈ 40
16
Calculs creux
Introduction au parallélisme 49
ReprésentaDon CRS
V[k] == A[i][C[k]] C 1 2 1 3 2 4 3 5
Introduction au parallélisme 50
for i= 1, n
for k = L[i], L[i+1] ‐1
y[i] += V[k]*x[C[k]]
Introduction au parallélisme 51
17
DécomposiDon de domaines
Branch‐And‐Bound
Introduction au parallélisme 54
18
Branch‐And‐Bound
Introduction au parallélisme 55
Introduction au parallélisme 56
Introduction au parallélisme 57
19
ApplicaDons irrégulières dynamiques
Introduction au parallélisme 58
Plan
Introduction au parallélisme 59
Scheduling = placement‐ordonnancement
Introduction au parallélisme 60
20
Scheduling staDque
Introduction au parallélisme 61
DistribuDon bloc
I = p*B +j
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
DistribuDon bloc
I = p*B +j
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2
21
DistribuDon cyclique
I = j*P + p
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4
I indice global
p numéro de processeur. p = I mod P
j indice local. j = I/P
Introduction au parallélisme 64
DistribuDon cyclique
I = j*P + p
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5
I indice global
p numéro de processeur. p = I mod P
j indice local. j = I/P
Introduction au parallélisme 65
I = b*B + j = B*(c*P+ p) + j
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
I indice global
p numéro de processeur. p = I mod P
j indice local. j = I/P
Introduction au parallélisme 66
22
BisecDon récursive
Introduction au parallélisme 67
BisecDon récursive
Introduction au parallélisme 68
BisecDon récursive
Applicable aussi à un
maillage
Et plus généralement à
toute structure de données
• irrégulière
• creuse
• organisée spatialement
(localité)
Introduction au parallélisme 69
23
Limites du scheduling staDque
Parallélisme de contrôle
Pour un problème modérément général et
réaliste
P processeurs iden9ques
M tâches indépendantes de durée ti
La minimisa9on du makespan est un problème
NP‐complet
Scheduling dynamique
Introduction au parallélisme 70
Scheduling dynamique
• Parallélisme de contrôle
• Exécuter toute tâche
prête dès que possible
• (Rela9vement) facile à
implémenter
• Distance à l’op9mal ?
Introduction au parallélisme 72
24
Scheduling glouton (greedy)
P processeurs
• Exécuter tout ce qui peut l’être dès que
possible
• Phase pleine: le nombre de processus ac9fs
est ≥ P
– Choix des processus ac9vés = algorithmique du
scheduling
• Phase incomplète: le nombre de processus
ac9fs est < P
Introduction au parallélisme 73
Introduction au parallélisme 74
25
Scheduling glouton (greedy)
Centralisé: Maître‐Esclave
Maître M
– Gère la distribu9on des tâches :
glouton, GSS, …
– Effectue les opéra9ons globales par S S S
exemple réduc9on
P Esclaves
– Exécutent un bloc, et redemandent du
travail dès que terminé
Introduction au parallélisme 77
Maître‐Esclave à grain fin
Introduction au parallélisme 78
26
Maître‐Esclave à grain fin
N = 256, P = 4
Sta9que : 64, 64, 64, 64
PSS : 1,1,1,1,1,1,1…
GSS : 64,48,36,27,20,…
FSS : 32,32,32,32,8, 8, 8, 8, 4, 4, 4, 2,…
Introduction au parallélisme 79
Spawn!
P P P P
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 80
Spawn! Spawn!
P P P P
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 81
27
Cilk’s Work-Stealing Scheduler
Each processor maintains a work
deque of ready threads, and it
manipulates the bottom of the deque
like a stack.
Return!
P P P P
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 82
Return!
P P P P
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 83
Steal!
P P P P
When a processor runs out of
work, it steals a thread from the
top of a random victim’s deque.
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 84
28
Cilk’s Work-Stealing Scheduler
Each processor maintains a work deque
of ready threads, and it manipulates the
bottom of the deque like a stack.
Steal!
P P P P
When a processor runs out of
work, it steals a thread from the
top of a random victim’s deque.
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 85
P P P P
When a processor runs out of
work, it steals a thread from the
top of a random victim’s deque.
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 86
Spawn!
P P P P
When a processor runs out of
work, it steals a thread from the
top of a random victim’s deque.
© 2006 Charles E. Leiserson Multithreaded Programming in Cilk — LECTURE 1 July 13, 2006 87
29
Placement/ordonnancement dynamique
Introduction au parallélisme 88
30