intensité algorithmique

Transcription

intensité algorithmique
Mais pourquoi donc est ce que mon code ne
va pas si vite que ça?
Intensité arithmétique, Roofline model, Numa
etc...
Thierry Dumont
Institut Camille Jordan
Mars 2016
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Machines actuelles :
1, 2, 4... processeurs,
chaque processeur a n cœurs, avec n = 2, 4, 8, .....
Bientôt : une centaine de cœurs par machine.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Machines actuelles :
1, 2, 4... processeurs,
chaque processeur a n cœurs, avec n = 2, 4, 8, .....
Bientôt : une centaine de cœurs par machine.
Parallélisme obligatoire !
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Processus légers (threads) :
Seq.
Par.
Thierry Dumont
Seq.
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Partage de la mémoire (sans sécurité).
meme @
RAM
RAM
RAM
RAM
RAM
@ differentes
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Partage de la mémoire (sans sécurité).
meme @
RAM
meme @
RAM
RAM
RAM
RAM
RAM
RAM
@ differentes
Thierry Dumont
meme @, simultanement
NON!
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Partage de la mémoire (sans sécurité).
meme @
RAM
meme @
RAM
RAM
RAM
RAM
RAM
RAM
@ differentes
meme @, simultanement
NON!
Standard : Open MP, mais aussi TBB (C++).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Exemple : le produit matrice x vecteur.
1
2
3
4
5
6
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Exemple : le produit matrice x vecteur.
1
1
2
2
2
1
3
2
4
1
2
5
1
2
6
Thierry Dumont
1
2
2
1
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le parallélisme en mémoire partagée expliqué en 2
minutes.
Exemple : le produit matrice x vecteur.
1
1
2
2
2
1
3
2
4
1
2
5
1
2
6
OK !
1
2
2
1
NON !
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Exemple :
machine Intel « Sandy bridge » 2 processeurs, avec chacun 8
cœurs, tournant à 2.6 Ghz (2.6 109 cycles/second).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Exemple :
machine Intel « Sandy bridge » 2 processeurs, avec chacun 8
cœurs, tournant à 2.6 Ghz (2.6 109 cycles/second).
Aspect SIMD :
AVX instructions :
In one clock cycle, do :
yi = ai xi + bi , i = 1, 4 (8 flops).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Exemple :
machine Intel « Sandy bridge » 2 processeurs, avec chacun 8
cœurs, tournant à 2.6 Ghz (2.6 109 cycles/second).
Aspect SIMD :
AVX instructions :
In one clock cycle, do :
yi = ai xi + bi , i = 1, 4 (8 flops).
La performance peak est donc de :
2×8
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Exemple :
machine Intel « Sandy bridge » 2 processeurs, avec chacun 8
cœurs, tournant à 2.6 Ghz (2.6 109 cycles/second).
Aspect SIMD :
AVX instructions :
In one clock cycle, do :
yi = ai xi + bi , i = 1, 4 (8 flops).
La performance peak est donc de :
2 × 8 × 2.6 109
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Exemple :
machine Intel « Sandy bridge » 2 processeurs, avec chacun 8
cœurs, tournant à 2.6 Ghz (2.6 109 cycles/second).
Aspect SIMD :
AVX instructions :
In one clock cycle, do :
yi = ai xi + bi , i = 1, 4 (8 flops).
La performance peak est donc de :
2 × 8 × 2.6 109 × 8
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Performances d’une machine : rêves et réalité
On compte les flops : ×, +−.
Attention aux divisions (plus lentes) !
Exemple :
machine Intel « Sandy bridge » 2 processeurs, avec chacun 8
cœurs, tournant à 2.6 Ghz (2.6 109 cycles/second).
Aspect SIMD :
AVX instructions :
In one clock cycle, do :
yi = ai xi + bi , i = 1, 4 (8 flops).
La performance peak est donc de :
2 × 8 × 2.6 109 × 8 = 332 Gflops/seconde.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Essai : produit matrice x vecteur
Blas Intel, parallèle.
45
40
35
Gflops/s
30
25
20
15
10
5
0
10
100
1000
10000
100000
n
Compte d’opérations :
produit scalaire de 2 vecteurs de taille n : 2n flops.
produit matrice(n × n) x vecteur n : n produits scalaires
=> 2n2 flops.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Bande passante
Un calcul ne peut être effectué que si :
1
les opérandes sont disponibles,
2
on peut écrire le résultat.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Bande passante
Un calcul ne peut être effectué que si :
1
les opérandes sont disponibles,
2
on peut écrire le résultat.
=> la bande passante entre (processeur / cache) et la
mémoire limite les performances.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Bande passante
Un calcul ne peut être effectué que si :
1
les opérandes sont disponibles,
2
on peut écrire le résultat.
=> la bande passante entre (processeur / cache) et la
mémoire limite les performances.
Intensité arithmétique
Ia = nombre d’ operations / quantité de mémoire échangée.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Bande passante
Un calcul ne peut être effectué que si :
1
les opérandes sont disponibles,
2
on peut écrire le résultat.
=> la bande passante entre (processeur / cache) et la
mémoire limite les performances.
Intensité arithmétique
Ia = nombre d’ operations / quantité de mémoire échangée.
GFlops/sec atteignables =
min( Performance « peak », Bande passante × Ia ).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le « Roofline Model »
1000
332 Gflops/s
Gflops/s
100
10
1
8.7 Gflops/s
1
10
100
Arithmetic Intensity
Memory bounded
Thierry Dumont
1000
10000
CPU bounded
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le « Roofline Model »
1000
332 Gflops/s
Gflops/s
100
41.5 Gflops/s
10
1
no AVX, no vectorisation.
8.7 Gflops/s
1
10
100
Arithmetic Intensity
Memory bounded
Thierry Dumont
1000
10000
CPU bounded
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Le « Roofline Model »
1000
332 Gflops/s
Gflops/s
100
41.5 Gflops/s
10
1
no AVX, no vectorisation.
8.7 Gflops/s
1
10
100
Arithmetic Intensity
Memory bounded
1000
10000
CPU bounded
Williams S. et al: Roofline : An Insightful Visual Performance Model for
Multicore Architectures – Commun. ACM, 1999.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique et Roofline Model : quelques
exemples
Unitée utilisée : double.
1
Produit scalaire s =
Pn
i=1 xi .yi
Thierry Dumont
:
Ia = 1.
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique et Roofline Model : quelques
exemples
Unitée utilisée : double.
1
2
P
Produit scalaire s = ni=1 xi .yi : Ia = 1.
Appliquer le stencil du Laplacien à 7 en dimension 3 :
Ia = 8/8 = 1.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique et Roofline Model : quelques
exemples
Unitée utilisée : double.
1
2
3
P
Produit scalaire s = ni=1 xi .yi : Ia = 1.
Appliquer le stencil du Laplacien à 7 en dimension 3 :
Ia = 8/8 = 1.
Produit Matrice × Matrix C = A.B : Ia = 2 n3 /4 n2 =
O(n).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique et Roofline Model : quelques
exemples
Unitée utilisée : double.
1
2
3
P
Produit scalaire s = ni=1 xi .yi : Ia = 1.
Appliquer le stencil du Laplacien à 7 en dimension 3 :
Ia = 8/8 = 1.
Produit Matrice × Matrix C = A.B : Ia = 2 n3 /4 n2 =
O(n).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Matrix × Matrix product (DGEMM, Intel mkl parallel version) :
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Produit Matrice × Vecteur (DGEMV, Intel mkl parallel version) :
45
40
35
Gflops/s
30
25
20
15
10
5
0
10
100
1000
10000
100000
n
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Appiquer le stencil du laplacien en 3-d (7 points), stocké en
matrice CSR :
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Appiquer le stencil du laplacien en 3-d (7 points), stocké en
matrice CSR :
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Appiquer le stencil du laplacien en 3-d (7 points), stocké en
matrice CSR :
On fait l’hypothèse (raisonable) que :
sizeof(double) = 2 sizeof(int).
Algorithm Bdwth : 37/2 double ; Flops : 13 => Ia ' 0.7.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Appiquer le stencil du laplacien en 3-d (7 points), stocké en
matrice CSR :
On fait l’hypothèse (raisonable) que :
sizeof(double) = 2 sizeof(int).
Algorithm Bdwth : 37/2 double ; Flops : 13 => Ia ' 0.7.
Machine Bdwth : 8.73 Giga doubles/s
=> Attainable = 0.7 × 8.73 = 6.11 Gflops.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Appiquer le stencil du laplacien en 3-d (7 points), stocké en
matrice CSR :
On fait l’hypothèse (raisonable) que :
sizeof(double) = 2 sizeof(int).
Algorithm Bdwth : 37/2 double ; Flops : 13 => Ia ' 0.7.
Machine Bdwth : 8.73 Giga doubles/s
=> Attainable = 0.7 × 8.73 = 6.11 Gflops.
Measured : 6.42 Gflops.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Intensité arithmétique : experiences
Appiquer le stencil du laplacien en 3-d (7 points), stocké en
matrice CSR :
On fait l’hypothèse (raisonable) que :
sizeof(double) = 2 sizeof(int).
Algorithm Bdwth : 37/2 double ; Flops : 13 => Ia ' 0.7.
Machine Bdwth : 8.73 Giga doubles/s
=> Attainable = 0.7 × 8.73 = 6.11 Gflops.
Measured : 6.42 Gflops.
Note : bounded to 1.15 × 8.73 ' 10 Gflops/s whatever the data
structure.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Comment mesurer la bande passante d’une machine ?
Divers programmes, dont stream
https://www.cs.virginia.edu/stream/
Programme en C.
NB : augmenter le plus possible la taille des tableaux !
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Est-ce sans espoir ?
On peut (il faut !) favoriser la réutilisation des données stockées
dans le cache L1.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Est-ce sans espoir ?
On peut (il faut !) favoriser la réutilisation des données stockées
dans le cache L1.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Est-ce sans espoir ?
On peut (il faut !) favoriser la réutilisation des données stockées
dans le cache L1.
uij = 0.25 (ui+1,j + ui−1,j − 4uij + ui,j+1 + ui,j−1 ).
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Y = Stencil7 (U) +
k
X
αi Vi .
i=0
k
0
1
2
3
Max.Ia
4.0
3.3
3.0
2.8
Thierry Dumont
Gflops/s
34.8
29.0
26.1
24.4
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Y = Stencil7 (U) +
k
X
αi Vi .
i=0
k
0
1
2
3
Max.Ia
4.0
3.3
3.0
2.8
Gflops/s
34.8
29.0
26.1
24.4
Program the loops so as to maximize data re-use.
Cut the domain in French Fries.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Avoid :
dot products,
sparse matrices (incomplete LU preconditioning),
linear combination of large vectors.
methods with a limited parallelism.
... low intensity methods.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Avoid :
dot products,
sparse matrices (incomplete LU preconditioning),
linear combination of large vectors.
methods with a limited parallelism.
... low intensity methods.
Prefer :
... high intensity methods,
embarrassingly parallel methods.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Non Uniform Memory Access (NUMA)
Les accès « remote »sont très lents !
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça
Non Uniform Memory Access (NUMA)
Les accès « remote »sont très lents !
Remèdes :
1
fixer les threads sur les cœurs.
2
« touch »des données.
Thierry Dumont
Mais pourquoi donc est ce que mon code ne va pas si vite que ça