Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Introduction a la programmation parallele
Oguz Kaya
Polytech Paris-Sud
Orsay, France
Apprentissage 4eme annee
September 3, 2019
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 1 / 40
Objectifs
Introduire les concepts de base de la programmation parallele
Presenter les principaux modeles de programmation
Fournir quelques conseils pour developper des programmesparalleles efficaces
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 2 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 3 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 3 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 3 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 3 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 4 / 40
Programmation sequentielle
Traditionnellement, les logiciels sont bases sur des calculs sequentiels :
Un probleme est decoupe en instructions
Ces instructions sont executees sequentiellement l’une apres l’autre
Elles sont executees par un seul processeur
A un instant donne, une seule instruction est executee
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 5 / 40
Programmation Parallele
Dans le cas le plus simple, la programmation parallele est l’utilisation deplusieurs ressources de calcul pour resoudre un probleme donne :
Un probleme est decoupe en parties qui peuvent etre lanceessimultanementChaque partie est encore decoupee en instructionsLes instructions de chaque partie sont executees en parallele enutilisant plusieurs processeurs
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 6 / 40
La loi d’Amdahl
A quel point le programme s’executera plus rapidement?
Acceleration : S(n) =T (1)T (n)
,
ouT(1) : Le temps d’execution du programme en utilisant unprocesseurT(n) : Le temps d’execution du programme en utilisant nprocesseurs
Efficacite : E(n) =S(n)
nIndique a quel point la parallelisation d’un code donne est efficaceSi on considere un programme avec une fraction sequentielle S et unefraction parallele P, alors
Acceleration =1
Pn + S
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 7 / 40
La Loi d’Amdahl
C’est une loi tres simpliste mais qui a le merite de nous indiquer leslimites de scalabilite de la parallelisation
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 8 / 40
Classification de Flynn
Il y a differentes manieres de classifier les machines paralleles
Une classification assez repandue, utilisee depuis 1966 est laclassification de Flynn
Cette classification distingue les architectures des machinesparalleles suivant les flux d’instructions et de donnees. Chacun nepeut avoir qu’un seul etat : Single (Simple) or Multiple
Quatre classifications possibles d’apres Flynn:
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 9 / 40
Single Instruction, Single Data (SISD)
Une machine sequentielle
Instruction “Single”: une seule instruction est executee par le CPU achaque cycle d’horloge
Donnee “Single” : un seul flux de donnee est utilise comme entree achaque cycle d’horloge
Execution deterministe
Les plus anciens des ordinateurs
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 10 / 40
Single Instruction, Multiple Data (SIMD)
Un exemple de machine parallele
Instruction “Single” : Toutes les unites de calcul executent la memeinstruction a chaque cycle d’horloge
Donnees Multiple : Chaque unite de calcul peut operer sur unedonnee differente
Compatible pour les probleme assez reguliers comme les traitementd’images
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 11 / 40
Multiple Instruction, Single Data (MISD)
Un exemple de machine paralleleInstruction Multiple : Chaque unite de calcul opere sur des donneesindependantes via differents flux d’instructionsDonnee “Single” : Un seul flux de donnees alimente plusieurs unitesde calculQuelques exemples d’utilisation sont :
plusieurs filtres de frequence operant sur un seul signalplusieurs algorithme de cryptographies essayant de dechiffrer un seulmessage code coded message
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 12 / 40
Multiple Instruction, Multiple Data (MIMD)
Un exemple de machine paralleleInstruction Multiple : chaque unite de calcul peut executer un fluxd’instructions differentDonnees Multiple : chaque processeur peut operer sur un flux dedonnees differentL’execution peut etre synchrone or asynchrone, deterministe ornon-deterministeLa majorite des machines paralleles modernes font partie de cettecategoriePlusieurs architectures MIMD incluent aussi des composants SIMD
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 13 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 14 / 40
Memoire partagee : caracteristiques generales
Tous les processeurs peuvent acceder a la memoire comme unespace d’adressage global
Plusieurs processeurs peuvent operer de facon independante maispartagent les memes ressources memoire
Les modifications par un processeur dans une zone memoire estvisible par tous les autres processeurs
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 15 / 40
Memoire paratgee : Uniform Memory Access (UMA)
Presente par les machines SMP ( Symmetric Multiprocessor)
Processeurs identiques
Temps d’acces a la memoire egal pour tous les processeurs
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 16 / 40
Memoire paratgee : Non-Uniform Memory Access(NUMA)
Dans la plus part des cas, physiquement construits en liant deux ouplus SMPsUn SMP peut acceder directement a la memoire d’un autre SMPTous les processeurs n’ont pas un temps d’acces egal pour toutesles memoiresLes acces memoire a la memoire d’un autre SMP sont plus lentsSi la coherence du cache est assuree, on parle de cc-NUMA
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 17 / 40
Memoire paratgee :
1 Avantages :L’espace d’adressage global permet une programmation plus simplede point de vue gestion de la memoireLe partage des donnees entre les threads est rapide et uniformegrace a la proximite de la memoire du CPU
2 Inconvenients :Le manque de scalabilite entre la memoire et les CPUs : ajouter plusde CPUs augmentera l’utilisation du bus partage et pour lessystemes a cache coherent, cela augmentera l’effort de gestion de lacoherence entre le cache et la memoireC’est la responsabilite du programmeur de faire les synchronisationsnecessaires pour assurer des acces “corrects” a la memoire globale
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 18 / 40
Memoire distribuee : caracteristiques generales
Les systemes a memoire distribuee necessitent un reseau pourassurer la connexion entre les processeurs
Chaque processeur a sa propre memoire et son propre espaced’adressage
C’est au programmeur d’indiquer explicitement comment et quandles donnees doivent etre communiquees et quand lessynchronisations entre les precesseurs doivent etre effectuees
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 19 / 40
Memoire distribuee : caracteristiques generales
Le reseau utilise pour le transfert des donnees entre lesprocesseurs est tres varie, il peut etre aussi simple qu’Ethernet
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 20 / 40
Memoire distribuee
1 Avantages:La memoire est scalable avec le nombre de processeursChaque processeur accede a sa memoire rapidement sans niinterference avec les autres processeurs ni de cout additionnel pourmaintenir une coherence globale du cache
2 Inconvenients :Le programmeur est responsable de plusieurs details associes a lacommunication des donnees entre les processeursIl peut etre difficile de distribuer des structures de de donneesconcues sur une base de memoire globale sur cette nouvelleorganisation memoire
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 21 / 40
Memoire Hybride : caracteristiques generales
Les machines les plus performantes au monde sont des machinesqui utilisent les memoires partagees et distribuees
Les composantes a memoire partagee peuvent etre des machines amemoire partagee ou des GPUs ( graphics processing units)
Les processeurs d’un meme neoud de calcul partage le memeespace memoire
necessitent des communications pour echanger les donnees entreles noeuds
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 22 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 23 / 40
Modeles de programmation parallele
Les modeles de programmation parallele existent comme uneabstraction au dessus des architectures paralleles
1 Memoire partagee :Intrinsics instructions SIMD (Intel SSE2, ARM NEON), bas niveau(Plus de details dans les cours a venir)Posix Threads bibliothequeOpenMP base sur des directives compilateur a jouter dans un codesequentiel (Plus de details dans les cours a venir)CUDA (Plus de details dans les cours a venir ??)OpenCL
2 Memoire distribuee :Sockets bibliotheque, bas niveauMPI Message Passing Interface le standard pour les architectures amemoire distribuee, le code parallele est en general tres different ducode sequentiel (Plus de details dans les cours a venir)
Quel modele de programmation utilise ?
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 24 / 40
Modeles de programmation parallele
Les modeles de programmation parallele existent comme uneabstraction au dessus des architectures paralleles
1 Memoire partagee :Intrinsics instructions SIMD (Intel SSE2, ARM NEON), bas niveau(Plus de details dans les cours a venir)Posix Threads bibliothequeOpenMP base sur des directives compilateur a jouter dans un codesequentiel (Plus de details dans les cours a venir)CUDA (Plus de details dans les cours a venir ??)OpenCL
2 Memoire distribuee :Sockets bibliotheque, bas niveauMPI Message Passing Interface le standard pour les architectures amemoire distribuee, le code parallele est en general tres different ducode sequentiel (Plus de details dans les cours a venir)
Quel modele de programmation utilise ?Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 24 / 40
Modele Thread
IEEE POSIX Threads (PThreads)Une API Standard UNIX, existe aussi sous WindowsPlus de 60 fonctions: pthread create, pthread join, pthread exit, . . .
OpenMPUne interface plus haut niveau, basee sur
des directives compilateurdes fonctions bibliothequesun runtime
Une orientation vers les application calcul haute performance (HPC)
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 25 / 40
OpenMP
Modele d’execution fork-joinModele memoire
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 26 / 40
Message Passing Interface
Specification et gestion par le forum MPILa bibliotheque fournit un ensemble de primitives de communication :point a point ou collectiveC/C++ et Fortran
Un modele de programmation bas niveaula distribution des donnees et les communications doivent etre faitesmanuellementLes primitives sont faciles a utiliser mais le developpement desprogrammes paralleles peut etre assez difficile
Les communicationsPoint a point (messages entre deux processeurs)Collective (messages dans des groupes de processeurs)
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 27 / 40
Produit scalaire : Sequentiel
#include <s t d i o . h>#define SIZE 256
int main ( ) {double sum, a [ SIZE ] , b [ SIZE ] ;
// Initializationsum = 0 . ;for ( s i z e t i = 0 ; i < SIZE ; i ++) {
a [ i ] = i ∗ 0 . 5 ;b [ i ] = i ∗ 2 . 0 ;}
// Computationfor ( s i z e t i = 0 ; i < SIZE ; i ++)
sum = sum + a [ i ]∗b [ i ] ;
p r i n t f ("sum = %g\n" , sum ) ;return 0;}
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 28 / 40
Produit scalaire : instructions SSE
#include <immin t r i n . h>#include <iostream>#include <a lgor i thm>#include <numeric>
int main ( ){
s td : : s i z e t const s ize = 4 ∗ 5;s td : : srand ( t ime ( n u l l p t r ) ) ;float ∗ array0 = s t a t i c c a s t< float ∗ >( mm malloc ( s ize ∗ sizeof ( float ) , 16 ) ) ;float ∗ array1 = s t a t i c c a s t< float ∗ >( mm malloc ( s ize ∗ sizeof ( float ) , 16 ) ) ;s td : : generate n ( array0 , s ize , [ ] ( ) { return std : : rand ()%10;} ) ;s td : : generate n ( array1 , s ize , [ ] ( ) { return std : : rand ()%10;} ) ;
auto r0 = mm mul ps ( mm load ps ( &array0 [ 0 ] ) , mm load ps ( &array1 [ 0 ] ) ) ;
for ( s td : : s i z e t i = 0 ; i < s ize ; i +=4 ){
r0 = mm add ps ( r0 , mm mul ps ( mm load ps ( &array0 [ i ] ) , mm load ps ( &array1 [ i ] ) ) ) ;
}
float tmp [ 4 ] a t t r i b u t e ( ( a l igned ( 1 6 ) ) ) ;mm store ps ( tmp , r0 ) ;auto res = std : : accumulate ( tmp , tmp + 4 , 0.0 f ) ;
mm free ( array0 ) ;mm free ( array1 ) ;
return 0;}
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 29 / 40
Produit scalaire : Pthreads
#include <s t d i o . h>#include <pthread . h>#define SIZE 256#define NUM THREADS 4#define CHUNK SIZE /NUM THREADS
int i d [NUM THREADS ] ;double sum, a [ SIZE ] , b [ SIZE ] ;p th read t t i d [NUM THREADS ] ;p thread mutex t mutex sum ;
void∗ dot (void∗ i d ) {s i z e t i ;int m y f i r s t = ∗(int∗) i d ∗ CHUNK;int my las t = (∗ (int∗) i d + 1) ∗ CHUNK;double sum local = 0 . ;
// Computationfor ( i = m y f i r s t ; i < my las t ; i ++)
sum local = sum local + a [ i ]∗b [ i ] ;
p thread mutex lock (&mutex sum ) ;sum = sum + sum local ;p thread mutex unlock (&mutex sum ) ;return NULL;}
int main ( ) {s i z e t i ;
// Initializationsum = 0 . ;for ( i = 0 ; i < SIZE ; i ++) {
a [ i ] = i ∗ 0 . 5 ;b [ i ] = i ∗ 2 . 0 ;}
p t h r e a d m u t e x i n i t (&mutex sum , NULL ) ;
for ( i = 0 ; i < NUM THREADS; i ++) {i d [ i ] = i ;p th read crea te (& t i d [ i ] , NULL, dot ,
(void∗)& i d [ i ] ) ;}
for ( i = 0 ; i < NUM THREADS; i ++)p t h r e a d j o i n ( t i d [ i ] , NULL ) ;
p thread mutex dest roy (&mutex sum ) ;
p r i n t f ("sum = %g\n" , sum ) ;return 0;}
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 30 / 40
Produit scalaire : OpenMP
#include <s t d i o . h>#define SIZE 256
int main ( ) {double sum, a [ SIZE ] , b [ SIZE ] ;
// Initializationsum = 0 . ;for ( s i z e t i = 0 ; i < SIZE ; i ++) {
a [ i ] = i ∗ 0 . 5 ;b [ i ] = i ∗ 2 . 0 ;}
// Computation#pragma omp p a r a l l e l for reduc t ion ( + :sum)for ( s i z e t i = 0 ; i < SIZE ; i ++) {
sum = sum + a [ i ]∗b [ i ] ;}
p r i n t f ("sum = %g\n" , sum ) ;return 0;}
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 31 / 40
Produit scalaire : MPI
#include <s t d i o . h>#include "mpi.h"#define SIZE 256
int main (int argc , char∗ argv [ ] ) {int numprocs , my rank , m y f i r s t , my las t ;double sum, sum local , a [ SIZE ] , b [ SIZE ] ;M P I I n i t (& argc , &argv ) ;MPI Comm size (MPI COMM WORLD, &numprocs ) ;MPI Comm rank (MPI COMM WORLD, &my rank ) ;m y f i r s t = my rank ∗ SIZE / numprocs ;my las t = ( my rank + 1) ∗ SIZE / numprocs ;
// Initializationsum local = 0 . ;for ( s i z e t i = 0 ; i < SIZE ; i ++) {
a [ i ] = i ∗ 0 . 5 ;b [ i ] = i ∗ 2 . 0 ;}
// Computationfor ( s i z e t i = m y f i r s t ; i < my las t ; i ++)
sum local = sum local + a [ i ]∗b [ i ] ;MPI Al l reduce (& sum local , &sum, 1 , MPI DOUBLE, MPI SUM, MPI COMM WORLD) ;
if ( my rank == 0)p r i n t f ("sum = %g\n" , sum ) ;
MPI F ina l i ze ( ) ;return 0;}
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 32 / 40
Modele Hybride
Plusieurs processus MPI, chacun gerant un nombre de threadsCommunication inter-process via envoi de messages (MPI)Communication Intra-process (thread) via la memoire partagee
Bien adapte au architectures hybridesun processus par noeudun thread par coeur
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 33 / 40
Plan
1 Introduction
2 Architecture Memoire des machines paralleles
3 Modeles de programmation parallele
4 Autour du developpement de programmes paralleles
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 34 / 40
Un modele de performance ; le roofline modele
La performance qu’on peut atteindre (Gflop/s) est bornee par
Min{
La performance crete de la machine,La bande passante maximale × l’intensite operationnelle
},
ou l’intensite operationnelle est le nombre d’operation floattanteseffectuee par byte de DRAM transfere
depend de l’algorithme et de l’architecture cible
produit matrice-vecteur dense : Idgemv 6 14
produit matrice-vecteur creux : ISpMV 6 16 , depend du format du
stockage (CSR ici)
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 35 / 40
Un modele de performance ; le roofline modele
La performance qu’on peut atteindre (Gflop/s) est bornee par
Min{
La performance crete de la machine,La bande passante maximale × l’intensite operationnelle
},
ou l’intensite operationnelle est le nombre d’operation floattanteseffectuee par byte de DRAM transfere
depend de l’algorithme et de l’architecture cible
produit matrice-vecteur dense : Idgemv 6 14
produit matrice-vecteur creux : ISpMV 6 16 , depend du format du
stockage (CSR ici)
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 35 / 40
le roofline modele : l’intensite operationnelle
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 36 / 40
Modele de performance pour NVIDIA Tesla K40
8
16
32
64
128
256
512
1024
2048
1/16 1/8 1/4 1/2 1 2 4 8 16 32 64 128
Performan
ce (G
flop/s)
Opera3onal Intensity (Flops/Byte)
Roofline model for K40m
DGEMV_MAGMA (n=100:3000)
DAXPY_MAGMA (n=3000:20000)
DGEMM_MAGMA (n=100:1600)
DGEMV_CUBLAS (n=100:3000)
DGEMM_CUBLAS (n=100:1600)
Max Bandwidth (288 GBytes/s)
Peak Performance (1430GFlops/s)
SpMV_MAGMA_CSR (n=16384:2097152)
SpMV_MAGMA_ELL (n=16384:2097152
SpMV_cuSPARSE_CSR (n=16384:2097152)
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 37 / 40
Ou commencer ? : Optimisation des noyaux
Performance au niveau du coeurReduire les defauts de cache : blocking, tilling, loop ordering, . . .
Vectorisation (unites SSE/AVX )
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 38 / 40
Quoi faire apres ?
Identifier les goulot d’etranglements du programme :savoir les parties qui consomment le plus de temps d’executionles outils d’analyse de performance peuvent aider ici ( profilers . . . )Se concentrer sur la parallelisation des goulot d’etranglements
Identifier les goulot d’etranglements du programme :Est ce qu’il y a des parties tres lentesPourquoi ?
Re-structurer le programme ou utiliser un autre algorithme pourreduire les parties qui sont tres lentes
Utiliser l’existant : logiciels et bibliotheques paralleles optimises(IBM’s ESSL, Intel’s MKL, AMD’s AMCL, LAPACK, . . . )
Developper de nouveaux algorithmes
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 39 / 40
Qu’est ce qui doit etre considere ? : quelques elements
La distribution des donnees : 1D, 2D, block, block cyclic, tiles . . .
La granularite
Les communications
Les synchronisations
Le recouvrement des calculs et des communications
L’equilibrage de charge entre les threads et/ou les processeurs
. . .
Oguz Kaya (Polytech Paris-Sud) Programmation Parallele 40 / 40