La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Athapascan-1 Interface C++ de programmation parallèle Équipe APACHE LMC/ID - IMAG Jean-Guillaume Dumas, Nicolas Maillard Jean-Louis Roch, Thierry Gautier.

Présentations similaires


Présentation au sujet: "Athapascan-1 Interface C++ de programmation parallèle Équipe APACHE LMC/ID - IMAG Jean-Guillaume Dumas, Nicolas Maillard Jean-Louis Roch, Thierry Gautier."— Transcription de la présentation:

1

2 Athapascan-1 Interface C++ de programmation parallèle Équipe APACHE LMC/ID - IMAG Jean-Guillaume Dumas, Nicolas Maillard Jean-Louis Roch, Thierry Gautier Mathias Doreille, François Galilée, Gerson Cavalheiro

3 Caractéristique du modèle de programmation (coté utilisateur du modèle) ¬Granularité explicite –grain de donnée = objet partagé Shared n ; … Shared tab ; –grain de calcul = tâche (appel de procédure) Fork fn( n) ; ­ Parallélisme entre les tâches implicite Ù Indication des actions des tâches sur les objets partagés par typage explicite { lecture r, écriture w, modification r_w, accumulation cw} void fn ( Shared_r a ) { … } ®Sémantique naturelle, de type séquentielle –toute lecture dune donnée voit la dernière écriture dans lexécution séquentielle

4 Programmation en Athapascan-1 Pré-requis : un peu de C++ Beaucoup dAthapascan-1 – Interface : Fork et Shared – un exemple de programme – accumulation, accès différé, ordre – format, compilation, exécution

5 Pré-requis : un peu de C++ –Pointeur int* Référence int & Attribut const –Classe : constructeur (de recopie), destructeur class cplx { private: double re, im ; public: cplx(double x, double y){re = x; im = y; } // Constructeur cplx(const cplx& z) { re = z.re ; im = z.im; } // Cstor recopie double reel() { return re ; } // méthode ~cplx() { … } // Destructeur }; – Flots : opérateurs > ostream& operator<< (ostream& o, const cplx& z) { cout << z.reel() << + i. << z.imag() ; } – Fonction-classe : struct module1 { double operator() ( const double x, double y){return x.reel()+x.imag(); } cplx a; cout << module1()( a ) ;

6 Athapascan-1 : librairie C++ Fork ; exécution « parallèle » de la fonction f struct Hello { void operator()( int i ) { cout << « ( Hello » << i << « ) » ; } }; void main() { …. Hello() ( 0 ) ; for (int i=1 ; i () ( i ) ; // création de tâche Sortie possible : ( Hello 0 ) (Hello 3) ( Hello 1) (Hello (Hello 7 (Hello …

7 Que peut prendre une tâche en paramètre ? Tout type qui se comporte comme un int – constructeur vide : T() { … } – constructeur de recopie : recopie physique – destructeur Opérateurs demballage/déballage (distribué) –a1::ostream& operator<<( a1_ostream& out, const cplx& x) { out << x.re << x.im ; } ; –A1::istream& operator>>( a1_istream& in, cplx& x) { in >> x.re >> x.im ; } ; Passage par valeur ou par référence

8 Passage par référence : shared Objet partagé : Shared x Déclaration avec initialisation : a1::Shared x ( new int(1) ) ; Exemple : a1::Fork () ( x, 3 ) ; a1::Fork () (x ) ; Les 2 tâches accèdent le même objet x : -> il faut contrôler les dépendances

9 Dépendance : typage des accès lecture= R : pas possible de modifier l objet : accès à la valeur de x : x.read() struct print { void operator() ( Shared_r a) { cout << a.read(); } }; écriture= W : pas possible de ;} }; lire l objet : affectation de x : x.write( T* val ) struct facto { void operator() ( Shared_w r, int n) { int x = n; for( int i=n ; i ; x*= --i) ; r.write ( new int( x ) ) ;} }; lecture-écriture= R_W : accès en modification accès en maj de x : x. access () struct incr { void operator() ( Shared_r_w a) { a.access() += 1 ;} }; lecture= R : pas possible de modifier l objet : accès à la valeur de x : x.read() struct print { void operator() ( Shared_r a) { cout << a.read(); } }; écriture= W : pas possible de ;} }; lire l objet : affectation de x : x.write( T* val ) struct facto { void operator() ( Shared_w r, int n) { int x = n; for( int i=n ; i ; x*= --i) ; r.write ( x ) ;} }; lecture-écriture= R_W : accès en modification accès en maj de x : x. access () struct incr { void operator() ( Shared_r_w a) { a.access() += 1 ;} };

10 Sémantique séquentielle Toute lecture voit la dernière écriture selon lordre séquentiel shared A[n][n], B[n][n], C[n][n] ; … // Initialisations A, B et C for (int i=0; i () ( C[i][j], A[i][k], B[k][j] ) ; struct axpy_in { void operator() ( Shared_rw c, Shared_r a, Shared_r b ) { c.access() += a.read() * b.read() ; } };

11 Programmation en Athapascan-1 Beaucoup dAthapascan-1 – Interface : Fork et Shared – un exemple de programme – accumulation, accès différé, ordre – format, compilation, exécution

12 struct fib { void operator()( int n, Shared_w r ) { if( n<2 ) r.write(new int(n)); else { Shared x, y; Fork () ( n-1, x ); Fork () ( n-2, y ); Fork () ( x, y, r ); } Ex : Fibonacci récursif F(0) F(1) F(2) F(3) F(0)F(1) F(2) F(4) struct sum { void operator() ( Shared_r a, Shared_r b, Shared_w c ) { c.write( new int( a.read() + b.read() ) ; } F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2)

13 Analyse dynamique du flot de données fib(3) F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) r fib(3) sum r/xr/y fib(2) fib(1) Terminé Prêt Attente Exécution Shared x, y; Fork ()( n-1, x ); Fork ()( n-2, y ); Fork ()( x, y, r );

14 Analyse dynamique du flot de données fib(3) F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) fib(2) fib(1) sum r/xr/y r fib(1) 1 fib(2) sum r/xr/y fib(1) fib(0) Terminé Prêt Attente Exécution

15 1 sum r/xr/y fib(1) fib(0) sum r/x r fib(1) fib(0) 1 0 sum Analyse dynamique du flot de données fib(3) Terminé Prêt Attente Exécution F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) sum fib(3) = 2 gestion du graphe contrôle de la sémantique [Chap. 3, Prop. 4]

16 Programmation en Athapascan-1 Beaucoup dAthapascan-1 – Interface : Fork et Shared – un exemple de programme – accumulation, accès différé, ordre – format, compilation, exécution

17 Ecriture concurrente - Accumulation CW : Concurrent write : Possibilité daccumuler en concurrence à partir dune valeur initiale Typage accès : Shared_cw x Accumulation : x. cumul( val ) ; struct fn_cumul { void operator() ( T& res, const T& s) { res += s ; // accumulation de s sur res Accumulations avec même fonction :concurrentes -> ordre quelconque (commutatif + associatif)

18 Accumulation: exemple shared A[n][n], B[n][n], C[n][n] ; … // Initialisations A, B et C for (int i=0; i () ( C[i][j], A[i][k], B[k][j] ) ; struct add void operator() ( T& res, const T& s) { res += s ; } struct axpy_in { void operator() ( Shared_cw c, Shared_r a, Shared_r b ) { c.cumul( a.read()*b.read()) ; } };

19 Shared : déclaration et passage Déclaration : Shared x ( val_init ) ; Passage en paramètre : typage du droit daccès –droit daccès avec accès autorisé : _r _w _r_w _cw –droit daccès avec accès différé : _rp _wp _rp_wp _cwp la tâche ne peut que transmettre le droit daccès (via Fork) mais ne peut pas accéder la valeur

20 Restrictions Pas deffets de bord sur des objets partagés : Shared variables globales : a1_global_tsp … x … ; Fork () ( x ) ; Autorisé ssi le droit possédé par lappelant sur x est supérieur à celui requis par F (lappelé) Ordre partiel : Shared > tout évidemment Shared_rp_wp > Shared_rp = Shared_r Shared_rp_wp > Shared_wp > Shared_w > Shared_cw[p] Shared_rp_wp > Shared_r_w = Attention : _r_w maj de la valeur possible, mais pas de Fork !

21 Justification des restrictions Détection du parallélisme + éviter les copies Restrictions sémantique naturelle sans perte de parallélisme Conséquence : ces 2 programmes Athapascan-1 sont équivalents struct { void operator () ( ) { stmts_1 ; Fork ()( ) ; stmts_2 ; Fork ()( ) ; stmts_3 ; } struct { void operator () ( ) { deque d ; stmts_1 ; push(d, ) ; stmts_2 ; push(d, ) ; stmts_3 ; Fork ()( pop(d) ); }

22 Programmation en Athapascan-1 Beaucoup dAthapascan-1 – Interface : Fork et Shared – un exemple de programme – accumulation, accès différé, ordre – format, initialisation, compilation, exécution

23 Initialisation/Terminaison int main( int argc, char** argv) { …. a1_system::init( argc, argv ) ; …. // tous les processus lourds exécutent a1_system::init_commit() ; // synchronisation …. if (a1_system::self_node() == 0) { …. // le « corps » du main : Fork, … } a1_system::terminate(); // attente fin des tâches return 0 ; }

24 Compilation / Exécution Environnement : source ~maillard/ATHAPASCAN/sparc_DIST_INSTALL/bin/a1_setup.csh ou …/ix86_SMP_INSTALL/… etc Makefile : gmake clean; gmake fibo include $(A1_MAKEFILE) # CXXFLAGS += -DSEQUENTIAL Exécution : séquentiel : fibo 12 SMP : fibo 12 -a1_pool 4 distribué : a0run fibo 12 -a0n 3 -a1_pool 4:2:5 -a1_stat -a1_trace_file fich Annotation ordonnancement, visualisation : cf doc

25 Communications (MPI,…) Threads (POSIX, Marcel, …) Athapascan-0 Projet APACHE et environnement de programmation parallèle ATHAPASCAN Programmation efficace et portable des machines parallèles Applications cibles : applications régulières ou irrégulières Machines cibles : SMP, architecture distribuée, grape de SMP Visualisation Interface applicative Portabilité matérielle Athapascan-1 Applications Thème de la thèse : définition de linterface applicative validation pour la programmation en calcul scientifique


Télécharger ppt "Athapascan-1 Interface C++ de programmation parallèle Équipe APACHE LMC/ID - IMAG Jean-Guillaume Dumas, Nicolas Maillard Jean-Louis Roch, Thierry Gautier."

Présentations similaires


Annonces Google