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