Professional Documents
Culture Documents
Jalel Chergui Isabelle Dupays Denis Girou Pierre-Franois Lavalle Dimitri Lecas Philippe Wautelet
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
MPI Plan I
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.1 Dnitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Concepts de lchange de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.4 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 Environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 Communications point point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.1 Notions gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Types de donnes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3 Autres possibilits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.4 Exemple : anneau de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4 Communications collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.1 Notions gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.2 Synchronisation globale : MPI_BARRIER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 Diusion gnrale : MPI_BCAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.4 Diusion slective : MPI_SCATTER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.5 Collecte : MPI_GATHER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.6 Collecte gnrale : MPI_ALLGATHER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.7 Collecte : MPI_GATHERV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.8 changes croiss : MPI_ALLTOALL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
MPI Plan II
4.9 Rductions rparties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.10 Complments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5 Copies de mmoire mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.1.1 Rappel : concept de lchange de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.1.2 Concept des copies de mmoire mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.1.3 Approche RMA de MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.2 Notion de fentre mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 5.3 Transfert des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5.4 Achvement du transfert : la synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 5.4.1 Synchronisation de type cible active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.4.2 Synchronisation de type cible passive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 5.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 6 Types de donnes drivs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97 6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 6.2 Types contigus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 6.3 Types avec un pas constant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 6.4 Autres sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.5 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 6.5.1 Type colonne dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 6.5.2 Type ligne dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.5.3 Type bloc dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
MPI Plan IV
8.6.1 Topologies cartsiennes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 8.6.2 Subdiviser une topologie cartsienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
9 MPI-IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1.1 Prsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1.2 Enjeux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 9.1.3 Dnitions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187 9.2 Gestion de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 9.3 Lectures/critures : gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 9.4 Lectures/critures individuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.4.1 Via des dplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.4.2 Via des dplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 9.4.3 Via des dplacements implicites partags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 9.5 Lectures/critures collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 9.5.1 Via des dplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.5.2 Via des dplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 9.5.3 Via des dplacements implicites partags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 9.6 Positionnement explicite des pointeurs dans un chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 9.7 Dnition de vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 9.8 Lectures/critures non bloquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 9.8.1 Via des dplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 9.8.2 Via des dplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
MPI Plan V
9.8.3 Lectures/critures collectives et non bloquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 9.9 Conseils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 11 Annexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 11.1 Communications collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 11.2 Types de donnes drivs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11.2.1 Distribution dun tableau sur plusieurs processus . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11.2.2 Types drivs numriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264 11.3 Optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 11.4 Communicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 11.4.1 Intra et intercommunicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 11.4.2 Graphe de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 11.5 Gestion de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 11.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 11.5.2 Mode matre-ouvriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 11.5.3 Mode client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 11.5.4 Suppression de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 11.5.5 Complments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 11.6 MPI-IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 12 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 12.1 Index des concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 12.2 Index des constantes MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
MPI Plan VI
12.3 Index des sous-programmes MPI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .320
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
8/326
1 Introduction
1 Introduction 1.1 Dnitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Concepts de lchange de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.4 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
9/326
1 Introduction
1.1 Dnitions
1 Introduction
1.1 Dnitions
Le modle de programmation squentiel : le programme est excut par un et un seul processus ; toutes les variables et constantes du programme sont alloues dans la mmoire alloue au processus ; un processus sexcute sur un processeur physique de la machine.
Mmoire Programme P
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
10/326
1 Introduction
1.1 Dnitions
Dans le modle de programmation par change de messages : le programme est crit dans un langage classique (Fortran , C , C++ , etc.) ; chaque processus excute ventuellement des parties direntes dun programme ; toutes les variables du programme sont prives et rsident dans la mmoire locale alloue chaque processus ; une donne est change entre deux ou plusieurs processus via un appel, dans le programme, des sous-programmes particuliers.
Mmoires
Processus Rseau
Programmes
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
11/326
1 Introduction
1.1 Dnitions
Le modle dexcution SPMD : Single Program, M ultiple Data ; le mme programme est excut par tous les processus ; toutes les machines supportent ce modle de programmation et certaines ne supportent que celui-l ; cest un cas particulier du modle plus gnral MPMD (M ultiple Program, M ultiple Data), quil peut dailleurs muler.
Mmoires d0 d1 d2 d3
Processus Rseau
Programme (unique)
12/326
1 Introduction
1 Introduction
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
13/326
1 Introduction
Un message est constitu de paquets de donnes transitant du processus metteur au(x) processus rcepteur(s) En plus des donnes (variables scalaires, tableaux, etc.) transmettre, un message doit contenir les informations suivantes : lidenticateur du processus metteur ; le type de la donne ; sa longueur ; lidenticateur du processus rcepteur.
message emetteur rcepteur type longueur
Mmoires
d1
d2
Processus Rseau
1 message
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
O N d1 NE E
14/326
1 Introduction
Les messages changs sont interprts et grs par un environnement qui peut tre compar la tlphonie, la tlcopie, au courrier postal, la messagerie lectronique, etc. Le message est envoy une adresse dtermine Le processus rcepteur doit pouvoir classer et interprter les messages qui lui ont t adresss Lenvironnement en question est MPI (Message Passing Interface). Une application MPI est un ensemble de processus autonomes excutant chacun leur propre code et communiquant via des appels des sous-programmes de la bibliothque MPI
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
15/326
1 Introduction
1.3 Historique
1 Introduction
1.3 Historique
Version 1.0 : en juin 1994, le forum MPI (Message Passing Interface Forum), avec la participation dune quarantaine dorganisations, abouti la dnition dun ensemble de sous-programmes concernant la bibliothque dchanges de messages MPI Version 1.1 : juin 1995, avec seulement des changements mineurs Version 1.2 : en 1997, avec des changements mineurs pour une meilleure cohrence des dnominations de certains sous-programmes Version 1.3 : septembre 2008, avec des clarications dans MPI 1.2, en fonction des clarications elles-mmes apportes par MPI-2.1 Version 2.0 : apparue en juillet 1997, cette version apportait des complments essentiels volontairement non intgrs dans MPI 1.0 (gestion dynamique de processus, copies mmoire mmoire, entres-sorties parallles, etc.) Version 2.1 : juin 2008, avec seulement des clarications dans MPI 2.0 mais aucun changement Version 2.2 : septembre 2009, avec seulement de petites additions
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
16/326
1 Introduction
1.3 Historique
Version 3.0 changements et ajouts importants par rapport la version 2.2 ; pour un meilleur support des applications actuelles et futures, notamment sur les machines massivement parallles et many cores ; principaux changements actuellement envisags : communications collectives non bloquantes ; rvision de limplmentation des copies mmoire mmoire ; tolrance aux pannes ; Fortran (2003-2008) bindings ; interfaage doutils externes (pour le dbogage et les mesures de performance) ; etc. attendu en 2012 ; voir http://meetings.mpi-forum.org/MPI_3.0_main_page.php https://svn.mpi-forum.org/trac/mpi-forum-web/wiki
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
17/326
1 Introduction
1.4 Bibliographie
1 Introduction
1.4 Bibliographie
Message Passing Interface Forum, MPI : A Message-Passing Interface Standard, Version 2.2, High Performance Computing Center Stuttgart (HLRS), 2009 https://fs.hlrs.de/projects/par/mpi/mpi22/ William Gropp, Ewing Lusk et Anthony Skjellum : Using MPI : Portable Parallel Programming with the Message Passing Interface, second edition, MIT Press, 1999 William Gropp, Ewing Lusk et Rajeev Thakur : Using MPI-2, MIT Press, 1999 Peter S. Pacheco : Parallel Programming with MPI, Morgan Kaufman Ed., 1997 Documentations complmentaires : http://www.mpi-forum.org/docs/ http://www.mpi-forum.org/mpi2_1/index.htm http://www.mcs.anl.gov/research/projects/mpi/learning.html http://www.mpi-forum.org/archives/notes/notes.html
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
18/326
1 Introduction
1.4 Bibliographie
Implmentations MPI open source : elles peuvent tre installes sur un grand nombre darchitectures mais leurs performances sont en gnral en dessous de celles des implmentations constructeurs
1 2
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
19/326
1 Introduction
1.4 Bibliographie
Dbogueurs 1 Totalview http://www.totalviewtech.com/home/ 2 DDT http://www.allinea.com/products/ddt/ Outils de mesure de performances 1 MPE : MPI Parallel Environment http://www.mcs.anl.gov/research/projects/perfvis/download/index.htm 2 Scalasca : Scalable Performance Analysis of Large-Scale Applications http://www.fz-juelich.de/jsc/scalasca/ 3 Vampir http://www.vampir.eu/
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
20/326
1 Introduction
1.4 Bibliographie
Quelques bibliothques scientiques parallles open source : 1 ScaLAPACK : rsolution de problmes dalgbre linaire par des mthodes directes. Les sources sont tlchargeables sur le site http://www.netlib.org/scalapack/ 2 PETSc : rsolution de problmes dalgbre linaire et non-linaire par des mthodes itratives. Les sources sont tlchargeables sur le site http://www.mcs.anl.gov/petsc/petsc-as/ 3 MUMPS : rsolution de grands systmes linaires creux par mthode directe multifrontale parallle. Les sources sont tlchargeables sur le site http://graal.ens-lyon.fr/MUMPS/ 4 FFTW : transformes de Fourier rapides. Les sources sont tlchargeables sur le site http://www.fftw.org
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
21/326
2 Environnement
1 Introduction 2 Environnement 2.1 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
22/326
2 Environnement
2.1 Description
2 Environnement
2.1 Description
Tout unit de programme appelant des sous-programmes MPI doit inclure un chier den-ttes. En Fortran, il faut maintenant utiliser le module mpi introduit dans MPI-2 (dans MPI-1, il sagissait du chier mpif.h), et en C/C++ le chier mpi.h. Le sous-programme MPI_INIT() permet dinitialiser lenvironnement ncessaire :
integer, intent(out) :: code call MPI_INIT (code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
23/326
2 Environnement
2.1 Description
Toutes les oprations eectues par MPI portent sur des communicateurs. Le communicateur par dfaut est MPI_COMM_WORLD qui comprend tous les processus actifs.
0 3
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
24/326
2 Environnement
2.1 Description
tout instant, on peut connatre le nombre de processus grs par un communicateur donn par le sous-programme MPI_COMM_SIZE() :
integer, intent(out) :: nb_procs,code call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code)
De mme, le sous-programme MPI_COMM_RANK() permet dobtenir le rang dun processus (i.e. son numro dinstance, qui est un nombre compris entre 0 et la valeur renvoye par MPI_COMM_SIZE() 1) :
integer, intent(out) :: rang,code call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
25/326
2 Environnement
2.2 Exemple
2 Environnement
2.2 Exemple
1 2 3 4 5 6 7 8 9 10 11 12 13 14
program qui_je_suis use mpi implicit none integer :: nb_procs,rang,code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) print *,Je suis le processus ,rang, parmi ,nb_procs call MPI_FINALIZE (code) end program qui_je_suis > mpiexec -n 7 qui_je_suis Je Je Je Je Je Je Je suis suis suis suis suis suis suis le le le le le le le processus processus processus processus processus processus processus 3 0 4 1 5 2 6 parmi parmi parmi parmi parmi parmi parmi 7 7 7 7 7 7 7
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
26/326
1 Introduction 2 Environnement 3 Communications point point 3.1 Notions gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Types de donnes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3 Autres possibilits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.4 Exemple : anneau de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
27/326
Une communication dite point point a lieu entre deux processus, lun appel processus metteur et lautre processus rcepteur (ou destinataire).
0 3
2 metteur
1000
4 Rcepteur 5 6
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
28/326
Lmetteur et le rcepteur sont identis par leur rang dans le communicateur. Ce que lon appelle lenveloppe dun message est constitue : du rang du processus metteur ; du rang du processus rcepteur ; de ltiquette (tag) du message ; du communicateur qui dni le groupe de processus et le contexte de communication. Les donnes changes sont types (entiers, rels, etc ou types drivs personnels). Il existe dans chaque cas plusieurs modes de transfert, faisant appel des protocoles dirents qui seront vus au chapitre 7
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
29/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program point_a_point use mpi implicit none integer, dimension( MPI_STATUS_SIZE ) :: statut integer, parameter :: etiquette=100 integer :: rang,valeur,code call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) if (rang == 2) then valeur=1000 call MPI_SEND (valeur,1, MPI_INTEGER ,5,etiquette, MPI_COMM_WORLD ,code) elseif (rang == 5) then call MPI_RECV (valeur,1, MPI_INTEGER ,2,etiquette, MPI_COMM_WORLD ,statut,code) print *,Moi, processus 5, jai reu ,valeur, du processus 2. end if call MPI_FINALIZE (code) end program point_a_point > mpiexec -n 7 point_a_point Moi, processus 5 , jai reu 1000 du processus 2
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
30/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
31/326
Type MPI MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE
Type C signed char signed short signed int signed long int unsigned char unsigned short unsigned int unsigned long int float double long double
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
32/326
la rception dun message, le rang du processus et ltiquette peuvent tre des jokers , respectivement MPI_ANY_SOURCE et MPI_ANY_TAG. Une communication avec le processus ctif de rang MPI_PROC_NULL na aucun eet. MPI_STATUS_IGNORE est une constante prdnie qui peut tre utilise la place de la variable prvue pour rcuprer en rception le statut. MPI_SUCCESS est une constante prdnie qui permet de tester le code de retour dun sous-programme MPI. Il existe des variantes syntaxiques, MPI_SENDRECV() et MPI_SENDRECV_REPLACE(), qui enchanent un envoi et une rception (dans le premier cas, la zone de rception doit tre forcment dirente de la zone dmission). On peut crer des structures de donnes plus complexes grce ses propres types drivs (voir le chapitre 6).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
33/326
1000
0
1001
:: rang,valeur,num_proc,code :: etiquette=110
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! On suppose avoir exactement 2 processus num_proc=mod(rang+1,2) call MPI_SENDRECV (rang+1000,1, MPI_INTEGER ,num_proc,etiquette,valeur,1, MPI_INTEGER , & num_proc,etiquette, MPI_COMM_WORLD , MPI_STATUS_IGNORE ,code) ! Test du code de retour du sous-programme MPI_SENDRECV if (code /= MPI_SUCCESS) call MPI_ABORT ( MPI_COMM_WORLD ,2,code) print *,Moi, processus,rang,, jai reu,valeur,du processus,num_proc call MPI_FINALIZE (code) end program sendrecv
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
34/326
> mpiexec -n 2 sendrecv Moi, processus 1 , jai reu 1000 du processus 0 Moi, processus 0 , jai reu 1001 du processus 1
Attention ! Il convient de noter que si le sous-programme MPI_SEND() est implment de faon synchrone (voir le chapitre 7) dans limplmentation de la version de la bibliothque MPI mise en uvre, le code prcdent serait en situation de verrouillage si la place de lordre MPI_SENDRECV() on utilisait un ordre MPI_SEND() suivi dun ordre MPI_RECV(). En eet, chacun des deux processus attendrait un ordre de rception qui ne viendrait jamais, puisque les deux envois resteraient en suspens. Pour des raisons de respect de la norme MPI et de portabilit, il faut donc absolument viter ces cas-l.
call MPI_SEND (rang+1000,1, MPI_INTEGER ,num_proc,etiquette, MPI_COMM_WORLD ,code) call MPI_RECV (valeur,1, MPI_INTEGER ,num_proc,etiquette, MPI_COMM_WORLD ,statut,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
35/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
program joker use mpi implicit none integer, parameter :: integer, dimension(m,m) :: integer :: integer, dimension( MPI_STATUS_SIZE ):: integer :: integer, dimension(:), allocatable ::
call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) A(:,:) = 0
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
36/326
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
if (rang == 0) then ! Initialisation de la matrice A sur le processus 0 A(:,:) = reshape((/ (i,i=1,m*m) /), (/ m,m /)) ! Envoi de 2 lments de la matrice A au processus 1 call MPI_SEND (A(1,1),2, MPI_INTEGER ,1,etiquette1, MPI_COMM_WORLD ,code) ! Envoi de 3 lments de la matrice A au processus 2 call MPI_SEND (A(1,2),3, MPI_INTEGER ,2,etiquette2, MPI_COMM_WORLD ,code) else ! On teste avant la rception si le message est arriv et de qui call MPI_PROBE ( MPI_ANY_SOURCE , MPI_ANY_TAG , MPI_COMM_WORLD ,statut,code) ! On regarde combien il y a dlments recevoir call MPI_GET_ELEMENTS (statut, MPI_INTEGER ,nb_elements,code) ! On alloue le tableau de rception C sur chaque processus if (nb_elements /= 0 ) allocate (C(1:nb_elements)) ! On reoit le message call MPI_RECV (C,nb_elements, MPI_INTEGER ,statut( MPI_SOURCE ),statut( MPI_TAG ), & MPI_COMM_WORLD ,statut,code) print *,Moi processus ,rang ,je reois ,nb_elements,lments du processus , & statut( MPI_SOURCE ), Mon tableau C vaut , C(:) end if call MPI_FINALIZE (code) end program joker
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
37/326
2 3
0 0
1 2 5 6 7
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
38/326
1000
0
1002 1006
1
1003
3
1004 1001 1005
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
39/326
Si tous les processus font un envoi puis une rception, toutes les communications pourront potentiellement dmarrer simultanment et nauront donc pas lieu en anneau (outre le problme dj mentionn de portabilit, au cas o limplmentation du MPI_SEND() est faite de faon synchrone dans la version de la bibliothque MPI mise en uvre) :
... valeur=rang+1000 call MPI_SEND (valeur,1, MPI_INTEGER ,num_proc_suivant,etiquette, MPI_COMM_WORLD ,code) call MPI_RECV (valeur,1, MPI_INTEGER ,num_proc_precedent,etiquette, MPI_COMM_WORLD , & statut,code) ...
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
40/326
Pour que les communications se fassent rellement en anneau, limage dun passage de jeton entre processus, il faut procder diremment et faire en sorte quun processus initie la chane :
1006
1000
6
1005
1
1001
5
1004
2 4
1003
1002
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
41/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
program anneau use mpi implicit none integer, dimension( MPI_STATUS_SIZE ) :: statut integer, parameter :: etiquette=100 integer :: nb_procs,rang,valeur, & num_proc_precedent,num_proc_suivant,code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) num_proc_suivant=mod(rang+1,nb_procs) num_proc_precedent=mod(nb_procs+rang-1,nb_procs) if (rang == 0) then call MPI_SEND (rang+1000,1, MPI_INTEGER ,num_proc_suivant,etiquette, & MPI_COMM_WORLD ,code) call MPI_RECV (valeur,1, MPI_INTEGER ,num_proc_precedent,etiquette, & MPI_COMM_WORLD ,statut,code) else call MPI_RECV (valeur,1, MPI_INTEGER ,num_proc_precedent,etiquette, & MPI_COMM_WORLD ,statut,code) call MPI_SEND (rang+1000,1, MPI_INTEGER ,num_proc_suivant,etiquette, & MPI_COMM_WORLD ,code) end if print *,Moi, proc. ,rang,, jai reu ,valeur, du proc. ,num_proc_precedent call MPI_FINALIZE (code) end program anneau
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
42/326
> mpiexec -n 7 anneau Moi, Moi, Moi, Moi, Moi, Moi, Moi, proc. proc. proc. proc. proc. proc. proc. 1, 2, 3, 4, 5, 6, 0, jai jai jai jai jai jai jai reu reu reu reu reu reu reu 1000 1001 1002 1003 1004 1005 1006 du du du du du du du proc. proc. proc. proc. proc. proc. proc. 0 1 2 3 4 5 6
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
43/326
4 Communications collectives
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 4.1 Notions gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.2 Synchronisation globale : MPI_BARRIER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 Diusion gnrale : MPI_BCAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.4 Diusion slective : MPI_SCATTER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.5 Collecte : MPI_GATHER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.6 Collecte gnrale : MPI_ALLGATHER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.7 Collecte : MPI_GATHERV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.8 changes croiss : MPI_ALLTOALL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.9 Rductions rparties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.10 Complments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
44/326
4 Communications collectives
4 Communications collectives
4.1 Notions gnrales
Les communications collectives permettent de faire en une seule opration une srie de communications point point. Une communication collective concerne toujours tous les processus du communicateur indiqu. Pour chacun des processus, lappel se termine lorsque la participation de celui-ci lopration collective est acheve, au sens des communications point--point (donc quand la zone mmoire concerne peut tre modie). Il est inutile dajouter une synchronisation globale (barrire) aprs une opration collective. La gestion des tiquettes dans ces communications est transparente et la charge du systme. Elles ne sont donc jamais dnies explicitement lors de lappel ces sous-programmes. Cela a entre autres pour avantage que les communications collectives ninterfrent jamais avec les communications point point.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
45/326
4 Communications collectives
Il y a trois types de sous-programmes : celui qui assure les synchronisations globales : MPI_BARRIER(). ceux qui ne font que transfrer des donnes : diusion globale de donnes : MPI_BCAST() ; diusion slective de donnes : MPI_SCATTER() ; collecte de donnes rparties : MPI_GATHER() ; collecte par tous les processus de donnes rparties : MPI_ALLGATHER() ; diusion slective, par tous les processus, de donnes rparties : MPI_ALLTOALL(). ceux qui, en plus de la gestion des communications, eectuent des oprations sur les donnes transfres : oprations de rduction (somme, produit, maximum, minimum, etc.), quelles soient dun type prdni ou dun type personnel : MPI_REDUCE() ; oprations de rduction avec diusion du rsultat (quivalent un MPI_REDUCE() suivi dun MPI_BCAST()) : MPI_ALLREDUCE().
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
46/326
4 Communications collectives
4 Communications collectives
P0 P1 P2 P3
Barrire
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
47/326
4 Communications collectives
4 Communications collectives
4.3 Diusion gnrale : MPI_BCAST()
0
A
A A A
3
P0 P1 P2 A P3 MPI_BCAST() P0 A P1 A P2 A P3 A Figure 12 Diusion gnrale : MPI_BCAST()
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
48/326
4 Communications collectives
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
program bcast use mpi implicit none integer :: rang,valeur,code call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) if (rang == 2) valeur=rang+1000 call MPI_BCAST (valeur,1, MPI_INTEGER ,2, MPI_COMM_WORLD ,code) print *,Moi, processus ,rang,, jai reu ,valeur, du processus 2 call MPI_FINALIZE (code) end program bcast > mpiexec -n 4 bcast Moi, Moi, Moi, Moi, processus processus processus processus 2, 0, 1, 3, jai jai jai jai reu reu reu reu 1002 1002 1002 1002 du du du du processus processus processus processus 2 2 2 2
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
49/326
4 Communications collectives
4 Communications collectives
4.4 Diusion slective : MPI_SCATTER()
0
A1
A0 A2 A3
3
P0 P1 P2 A0 A1 A2 A3 P3 MPI_SCATTER() P0 A0 P1 A1 P2 A2 P3 A3 Figure 13 Diusion slective : MPI_SCATTER()
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
50/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
4 Communications collectives
program scatter use mpi implicit none integer, parameter :: nb_valeurs=8 integer :: nb_procs,rang,longueur_tranche,i,code real, allocatable, dimension(:) :: valeurs,donnees call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) longueur_tranche=nb_valeurs/nb_procs allocate(donnees(longueur_tranche)) if (rang == 2) then allocate(valeurs(nb_valeurs)) valeurs(:)=(/(1000.+i,i=1,nb_valeurs)/) print *,Moi, processus ,rang,envoie mon tableau valeurs : ,& valeurs(1:nb_valeurs) end if call MPI_SCATTER (valeurs,longueur_tranche, MPI_REAL ,donnees,longueur_tranche, & MPI_REAL ,2, MPI_COMM_WORLD ,code) print *,Moi, processus ,rang,, jai reu , donnees(1:longueur_tranche), & du processus 2 call MPI_FINALIZE (code) end program scatter > mpiexec -n 4 scatter Moi, processus 2 envoie mon tableau valeurs : 1001. 1002. 1003. 1004. 1005. 1006. 1007. 1008. Moi, Moi, Moi, Moi, processus processus processus processus 0, 1, 3, 2, jai jai jai jai reu reu reu reu 1001. 1003. 1007. 1005. 1002. 1004. 1008. 1006. du du du du processus processus processus processus 2 2 2 2
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
51/326
4 Communications collectives
4 Communications collectives
4.5 Collecte : MPI_GATHER()
0
A1
A0 A2 A3
3
P0 A0 P1 A1 P2 A2 P3 A3 MPI_GATHER() P0 P1 P2 A0 A1 A2 A3 P3 Figure 14 Collecte : MPI_GATHER()
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
52/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
4 Communications collectives
program gather use mpi implicit none integer, parameter integer real, dimension(nb_valeurs) real, allocatable, dimension(:)
:: :: :: ::
call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) longueur_tranche=nb_valeurs/nb_procs allocate(valeurs(longueur_tranche)) valeurs(:)=(/(1000.+rang*longueur_tranche+i,i=1,longueur_tranche)/) print *,Moi, processus ,rang,envoie mon tableau valeurs : ,& valeurs(1:longueur_tranche) call MPI_GATHER (valeurs,longueur_tranche, MPI_REAL ,donnees,longueur_tranche, & MPI_REAL ,2, MPI_COMM_WORLD ,code) if (rang == 2) print *,Moi, processus 2, jai reu ,donnees(1:nb_valeurs) call MPI_FINALIZE (code) end program gather > mpiexec -n 4 Moi, processus Moi, processus Moi, processus Moi, processus gather 1 envoie 0 envoie 2 envoie 3 envoie mon mon mon mon tableau tableau tableau tableau valeurs valeurs valeurs valeurs : 1003. : 1001. : 1005. : 1007. 1004. 1002. 1006. 1008.
Moi, processus 2 , jai reu 1001. 1002. 1003. 1004. 1005. 1006. 1007. 1008.
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
53/326
4 Communications collectives
4 Communications collectives
4.6 Collecte gnrale : MPI_ALLGATHER()
A0
A0 A1 A1 A0
0
A2 A1 A3 A1 A3
A2 A0 A2
A2 A3
3
P0 A0 P1 A1 P2 A2 P3 A3
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
A3 MPI_ALLGATHER()
P0 A0 A1 A2 A3 P1 A0 A1 A2 A3 P2 A0 A1 A2 A3 P3 A0 A1 A2 A3
54/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
4 Communications collectives
program allgather use mpi implicit none integer, parameter integer real, dimension(nb_valeurs) real, allocatable, dimension(:) call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) longueur_tranche=nb_valeurs/nb_procs allocate(valeurs(longueur_tranche)) valeurs(:)=(/(1000.+rang*longueur_tranche+i,i=1,longueur_tranche)/) call MPI_ALLGATHER (valeurs,longueur_tranche, MPI_REAL ,donnees,longueur_tranche, & MPI_REAL , MPI_COMM_WORLD ,code) print *,Moi, processus ,rang,, jai reu ,donnees(1:nb_valeurs) call MPI_FINALIZE (code) end program allgather > mpiexec -n 4 allgather Moi, Moi, Moi, Moi, processus processus processus processus 1, 3, 2, 0, jai jai jai jai reu reu reu reu 1001. 1001. 1001. 1001. 1002. 1002. 1002. 1002. 1003. 1003. 1003. 1003. 1004. 1004. 1004. 1004. 1005. 1005. 1005. 1005. 1006. 1006. 1006. 1006. 1007. 1007. 1007. 1007. 1008. 1008. 1008. 1008. :: :: :: :: nb_valeurs=8 nb_procs,rang,longueur_tranche,i,code donnees valeurs
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
55/326
4 Communications collectives
4 Communications collectives
4.7 Collecte : MPI_GATHERV()
0
A1
A0 A2 A3
3
P0 P1 P2 P3 A0 A1 A2 A3 MPI_GATHERV() P0 P1 P2 P3 Figure 16 Collecte : MPI_GATHERV()
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
A0 A1 A2 A3
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
56/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
4 Communications collectives
program gatherv use mpi implicit none integer, parameter integer real, dimension(nb_valeurs) real, allocatable, dimension(:) integer, allocatable, dimension(:)
:: :: :: :: ::
call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) longueur_tranche=nb_valeurs/nb_procs reste = mod(nb_valeurs,nb_procs) if (reste > rang) longueur_tranche = longueur_tranche+1 ALLOCATE(valeurs(longueur_tranche)) valeurs(:) = (/(1000.+(rang*(nb_valeurs/nb_procs))+min(rang,reste)+i, & i=1,longueur_tranche)/) PRINT *, Moi, processus , rang,envoie mon tableau valeurs : ,& valeurs(1:longueur_tranche) IF (rang == 2) THEN ALLOCATE(nb_elements_recus(nb_procs),deplacements(nb_procs)) nb_elements_recus(1) = nb_valeurs/nb_procs if (reste > 0) nb_elements_recus(1) = nb_elements_recus(1)+1 deplacements(1) = 0 DO i=2,nb_procs deplacements(i) = deplacements(i-1)+nb_elements_recus(i-1) nb_elements_recus(i) = nb_valeurs/nb_procs if (reste > i-1) nb_elements_recus(i) = nb_elements_recus(i)+1 END DO END IF
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
57/326
4 Communications collectives
CALL MPI_GATHERV (valeurs,longueur_tranche, MPI_REAL ,donnees,nb_elements_recus,& deplacements, MPI_REAL ,2, MPI_COMM_WORLD ,code) IF (rang == 2) PRINT *, Moi, processus 2 je recois, donnees(1:nb_valeurs) CALL MPI_FINALIZE (code) end program gatherv > mpiexec -n 4 gatherv Moi, Moi, Moi, Moi, processus processus processus processus 0 2 3 1 envoie envoie envoie envoie mon mon mon mon tableau tableau tableau tableau valeurs valeurs valeurs valeurs : : : : 1001. 1007. 1009. 1004. 1002. 1003. 1008. 1010. 1005. 1006.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
58/326
4 Communications collectives
4 Communications collectives
4.8 changes croiss : MPI_ALLTOALL()
A0
A1 B1 B0 A3
0
C1 B2 D1 B3 D0
C0 A2 C2
C3 D2 P0 A0 B0 C0 D0 P1 A1 B1 C1 D1 P2 A2 B2 C2 D2 P3 A3 B3 C3 D3
3
P0 A0 A1 A2 A3 P1 B0 B1 B2 B3 P2 C0 C1 C2 C3 P3 D0 D1 D2 D3 D3 MPI_ALLTOALL()
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
59/326
4 Communications collectives
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
program alltoall use mpi implicit none integer, parameter integer real, dimension(nb_valeurs) :: nb_valeurs=8 :: nb_procs,rang,longueur_tranche,i,code :: valeurs,donnees
call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) valeurs(:)=(/(1000.+rang*nb_valeurs+i,i=1,nb_valeurs)/) longueur_tranche=nb_valeurs/nb_procs print *,Moi, processus ,rang,envoie mon tableau valeurs : , & valeurs(1:nb_valeurs) call MPI_ALLTOALL (valeurs,longueur_tranche, MPI_REAL ,donnees,longueur_tranche, & MPI_REAL , MPI_COMM_WORLD ,code) print *,Moi, processus ,rang,, jai reu ,donnees(1:nb_valeurs) call MPI_FINALIZE (code) end program alltoall
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
60/326
4 Communications collectives
> mpiexec -n 4 alltoall Moi, processus 1 envoie mon tableau valeurs : 1009. 1010. 1011. 1012. 1013. 1014. 1015. Moi, processus 0 envoie mon tableau valeurs : 1001. 1002. 1003. 1004. 1005. 1006. 1007. Moi, processus 2 envoie mon tableau valeurs : 1017. 1018. 1019. 1020. 1021. 1022. 1023. Moi, processus 3 envoie mon tableau valeurs : 1025. 1026. 1027. 1028. 1029. 1030. 1031. Moi, Moi, Moi, Moi, processus processus processus processus 0, 2, 1, 3, jai jai jai jai reu reu reu reu 1001. 1005. 1003. 1007. 1002. 1006. 1004. 1008.
1016. 1008. 1024. 1032. 1010. 1014. 1012. 1016. 1017. 1021. 1019. 1023. 1018. 1022. 1020. 1024. 1025. 1029. 1027. 1031. 1026. 1030. 1028. 1032.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
61/326
4 Communications collectives
4 Communications collectives
4.9 Rductions rparties
Une rduction est une opration applique un ensemble dlments pour en obtenir une seule valeur. Des exemples typiques sont la somme des lments dun vecteur SUM(A(:)) ou la recherche de llment de valeur maximum dans un vecteur MAX(V(:)). MPI propose des sous-programmes de haut-niveau pour oprer des rductions sur des donnes rparties sur un ensemble de processus. Le rsultat est obtenu sur un seul processus (MPI_REDUCE()) ou bien sur tous (MPI_ALLREDUCE(), qui est en fait quivalent un MPI_REDUCE() suivi dun MPI_BCAST()). Si plusieurs lments sont concerns par processus, la fonction de rduction est applique chacun dentre eux. Le sous-programme MPI_SCAN() permet en plus deectuer des rductions partielles en considrant, pour chaque processus, les processus prcdents du communicateur et lui-mme. Les sous-programmes MPI_OP_CREATE() et MPI_OP_FREE() permettent de dnir des oprations de rduction personnelles.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
62/326
4 Communications collectives
Table 3 Principales oprations de rduction prdnies (il existe aussi dautres oprations logiques)
Nom MPI_SUM MPI_PROD MPI_MAX MPI_MIN MPI_MAXLOC MPI_MINLOC MPI_LAND MPI_LOR MPI_LXOR
Opration Somme des lments Produit des lments Recherche du maximum Recherche du minimum Recherche de lindice du maximum Recherche de lindice du minimum ET logique OU logique OU exclusif logique
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
63/326
4 Communications collectives
1000+1+2+3+4+5+6 = 1021 1
1
4
2
5
3
6
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
64/326
4 Communications collectives
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program reduce use mpi implicit none integer :: nb_procs,rang,valeur,somme,code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) if (rang == 0) then valeur=1000 else valeur=rang endif call MPI_REDUCE (valeur,somme,1, MPI_INTEGER , MPI_SUM ,0, MPI_COMM_WORLD ,code) if (rang == 0) then print *,Moi, processus 0, jai pour valeur de la somme globale ,somme end if call MPI_FINALIZE (code) end program reduce > mpiexec -n 7 reduce Moi, processus 0 , jai pour valeur de la somme globale 1021
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
65/326
4 Communications collectives
1
7200
7200
2 5
3 7200
3
6 7200
4
7200
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
66/326
4 Communications collectives
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
program allreduce use mpi implicit none integer :: nb_procs,rang,valeur,produit,code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) if (rang == 0) then valeur=10 else valeur=rang endif call MPI_ALLREDUCE (valeur,produit,1, MPI_INTEGER , MPI_PROD , MPI_COMM_WORLD ,code) print *,Moi, processus ,rang,, jai reu la valeur du produit global ,produit call MPI_FINALIZE (code) end program allreduce
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
67/326
4 Communications collectives
> mpiexec -n 7 allreduce Moi, Moi, Moi, Moi, Moi, Moi, Moi, processus processus processus processus processus processus processus 6, 2, 0, 4, 5, 3, 1, jai jai jai jai jai jai jai reu reu reu reu reu reu reu la la la la la la la valeur valeur valeur valeur valeur valeur valeur du du du du du du du produit produit produit produit produit produit produit global global global global global global global 7200 7200 7200 7200 7200 7200 7200
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
68/326
4 Communications collectives
4.10 Complments
4 Communications collectives
4.10 Complments
Les sous-programmes MPI_SCATTERV(), MPI_GATHERV(), MPI_ALLGATHERV() et MPI_ALLTOALLV() tendent MPI_SCATTER(), MPI_GATHER(), MPI_ALLGATHER() et MPI_ALLTOALL() au cas o le nombre dlments diuser ou collecter est dirent suivant les processus. Deux nouveaux sous-programmes ont t ajouts pour tendre les possibilits des sous-programmes collectifs dans quelques cas particuliers : MPI_ALLTOALLW() : version de MPI_ALLTOALLV() o les dplacements sont exprims en octets et non en lments, MPI_EXSCAN() : version exclusive de MPI_SCAN(), qui elle est inclusive.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
69/326
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.1.1 Rappel : concept de lchange de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.1.2 Concept des copies de mmoire mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.1.3 Approche RMA de MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.2 Notion de fentre mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 5.3 Transfert des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5.4 Achvement du transfert : la synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 5.4.1 Synchronisation de type cible active . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.4.2 Synchronisation de type cible passive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 5.5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
70/326
5.1 Introduction
Diverses approches existent pour transfrer des donnes entre deux processus distincts. Parmi les plus utilises, on trouve : les communications point point par change de messages (MPI , etc.) ; les communications par copies de mmoire mmoire (accs direct la mmoire dun processus distant). Appeles RMA pour Remote Memory Access ou OSC pour One Sided Communication, cest lun des apports majeurs de MPI .
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
71/326
5.1 Introduction
Dans le concept de lchange de messages, un metteur (source) va envoyer un message un processus destinataire (cible) qui va faire la dmarche de recevoir ce message. Cela ncessite que lmetteur comme le destinataire prennent part la communication. Ceci peut tre contraignant et dicile mettre en uvre dans certains algorithmes (par exemple lorsquil faut grer un compteur global).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
72/326
5.1 Introduction
Le concept de communication par copies de mmoire mmoire nest pas nouveau, MPI ayant simplement uni les solutions constructeurs dj existantes (telles que shmem (CRAY), lapi (IBM), ...) en proposant ses propres primitives RMA. Via ces sous-programmes, un processus a directement accs (en lecture, criture ou mise jour) la mmoire dun autre processus distant. Dans cette approche, le processus distant na donc pas intervenir dans la procdure de transfert des donnes. Les principaux avantages sont les suivants : des performances amliores lorsque le matriel le permet, une programmation plus simple de certains algorithmes.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
73/326
5.1 Introduction
Lapproche RMA de MPI peut tre divise en trois tapes successives : dnition sur chaque processus dune zone mmoire (fentre mmoire locale) visible et susceptible dtre accde par des processus distants ; dclenchement du transfert des donnes directement de la mmoire dun processus celle dun autre processus. Il faut alors spcier le type, le nombre et la localisation initiale et nale des donnes. achvement des transferts en cours par une tape de synchronisation, les donnes tant alors rellement disponibles pour les calculs.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
74/326
Tous les processus prenant part une opration de copie de mmoire mmoire doivent spcier quelle partie de leur mmoire va tre accessible aux autres processus ; cest la notion de fentre mmoire. Plus prcisment, lopration collective MPI_WIN_CREATE() permet la cration dun objet MPI fentre. Cet objet est compos, pour chaque processus, dune zone mmoire spcique appele fentre mmoire locale. Au niveau de chaque processus, une fentre mmoire locale est caractrise par son adresse de dpart, sa taille en octets (qui peut tre nulle) et la taille de lunit de dplacement lintrieur de cette fentre (en octets). Ces caractristiques peuvent tre direntes sur chacun des processus.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
75/326
Exemple : Objet MPI fentre win1 0 Premire fentre locale Deuxime fentre locale Premire fentre locale 1 Deuxime fentre locale
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
76/326
Une fois les transferts termins, on doit librer la fentre avec le sous-programme MPI_WIN_FREE(). MPI_WIN_GET_ATTR() permet de connatre les caractristiques dune fentre mmoire locale en utilisant les mots cls MPI_WIN_BASE, MPI_WIN_SIZE ou MPI_WIN_DISP_UNIT. Remarque : Le choix de lunit de dplacement associe la fentre mmoire locale est important (indispensable dans un environnement htrogne et facilitant le codage dans tous les cas). Lobtention de la taille dun type MPI prdni se fait en appelant le sous-programme MPI_TYPE_SIZE().
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
77/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
program fenetre use mpi implicit none integer :: code, rang, taille_reel, win, n=4 integer (kind= MPI_ADDRESS_KIND ) :: dim_win, taille, base, unite real(kind=kind(1.d0)), dimension(:), allocatable :: win_local logical :: flag call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD , rang, code) call MPI_TYPE_SIZE ( MPI_DOUBLE_PRECISION ,taille_reel,code) if (rang==0) n=0 allocate(win_local(n)) dim_win = taille_reel*n call MPI_WIN_CREATE (win_local, dim_win, taille_reel, MPI_INFO_NULL , & MPI_COMM_WORLD , win, code) call MPI_WIN_GET_ATTR (win, MPI_WIN_SIZE , taille, flag, code) call MPI_WIN_GET_ATTR (win, MPI_WIN_BASE , base, flag, code) call MPI_WIN_GET_ATTR (win, MPI_WIN_DISP_UNIT , unite, flag, code) call MPI_WIN_FREE (win,code) print *,"processus", rang,"taille, base, unite = ", & taille, base, unite call MPI_FINALIZE (code) end program fenetre > mpiexec -n 3 processus 1 processus 0 processus 2 fenetre taille, base, unite = taille, base, unite = taille, base, unite = 32 17248330400 0 2 8 32 17248330400 8 8
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
78/326
MPI permet un processus de lire (MPI_GET()), dcrire (MPI_PUT()) et de mettre jour (MPI_ACCUMULATE()) des donnes situes dans la fentre mmoire locale dun processus distant. On nomme origine le processus qui fait lappel au sous-programme dinitialisation du transfert et cible le processus qui possde la fentre mmoire locale qui va tre utilise dans la procdure de transfert. Lors de linitialisation du transfert, le processus cible nappelle aucun sous-programme MPI . Toutes les informations ncessaires sont spcies sous forme de paramtres lors de lappel au sous-programme MPI par lorigine.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
79/326
En particulier, on trouve : des paramtres ayant rapport lorigine : le type des lments ; leur nombre ; ladresse mmoire du premier lment. des paramtres ayant rapport la cible : le rang de la cible ainsi que lobjet MPI fentre, ce qui dtermine de faon unique une fentre mmoire locale ; un dplacement dans cette fentre locale ; le nombre et le type des donnes transfrer.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
80/326
1 2 3 4 5 6 7 8
program exemple_put integer :: nb_orig=10, nb_cible=10, cible=1, win, code integer (kind= MPI_ADDRESS_KIND ) :: deplacement=40 integer, dimension(10) :: B ... call MPI_PUT (B,nb_orig, MPI_INTEGER ,cible,deplacement,nb_cible, MPI_INTEGER ,win,code) ... end program exemple_put
Dplacement de 40 units dans la fentre locale 1 0 Premire fentre locale Premire fentre locale
B(1 :10)
Figure 22 Exemple dun MPI_PUT
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
81/326
Remarques : La syntaxe de MPI_GET est identique celle de MPI_PUT, seul le sens de transfert des donnes tant invers. Les sous-programmes de transfert de donnes RMA sont des primitives non bloquantes (choix dlibr de MPI ). Sur le processus cible, les seules donnes accessibles sont celles contenues dans la fentre mmoire locale. MPI_ACCUMULATE() admet parmi ses paramtres une opration qui doit tre soit du type MPI_REPLACE, soit lune des oprations de rduction prdnies : MPI_SUM, MPI_PROD, MPI_MAX, etc. Ce ne peut en aucun cas tre une opration dnie par lutilisateur.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
82/326
Le transfert des donnes dbute aprs lappel lun des sous-programmes non bloquants (MPI_PUT(), ...). Mais quand le transfert est-il termin et les donnes rellement disponibles ? Aprs une synchronisation qui est la charge du programmeur. Ces synchronisations peuvent tre classes en deux types : synchronisation de type cible active (opration collective, tous les processus associs la fentre prenant part la synchronisation) ; synchronisation de type cible passive (seul le processus origine appelle le sous-programme de synchronisation).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
83/326
Se fait en utilisant le sous-programme MPI MPI_WIN_FENCE(). MPI_WIN_FENCE() est une opration collective sur tous les processus associs lobjet MPI fentre. MPI_WIN_FENCE() agit comme une barrire de synchronisation. Elle attend la n de tous les transferts de donnes (RMA ou non) utilisant la fentre mmoire locale et initis depuis le dernier appel MPI_WIN_FENCE(). Cette primitive va permettre de sparer les parties calcul du code (o lon utilise des donnes de la fentre mmoire locale via des load ou des store) des parties de transfert de donnes de type RMA. Un argument assert de la primitive MPI_WIN_FENCE(), de type entier, permet daner son comportement en vue de meilleures performances. Diverses valeurs sont prdnies MPI_MODE_NOSTORE, MPI_MODE_NOPUT, MPI_MODE_NOPRECEDE, MPI_MODE_NOSUCCEED. Une valeur de zro pour cet argument est toujours valide.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
84/326
Remarques : Le fait davoir choisi des sous-programmes RMA dinitialisation du transfert non bloquants et une synchronisation pour lachvement des transferts en cours autorise limplmentation regrouper lors de lexcution divers transferts vers la mme cible en un transfert unique. Leet de la latence est ainsi rduit et les performances amliores. Le caractre collectif de la synchronisation a pour consquence quon na pas rellement aaire ce que lon appelle du One Sided Communication ... En fait tous les processus du communicateur vont devoir prendre part la synchronisation, ce qui perd de son intrt !
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
85/326
Le programme prcdent est-il conforme au bon usage de MPI_WIN_FENCE() ? Tout dpend de la portion de code reprsente par . Si celle-ci nengendre pas de load/store sur la fentre locale (aectation ou utilisation dune variable stocke dans la fentre locale), alors cest bon ; dans le cas contraire, le rsultat est indni.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
86/326
Exemple rcapitulatif
P0
tab
P1
win_loc MPI_PUT
1 2 3 4 1 2 3 4 1 2 3 6 3 2 3 6 3 2 3 8 3 2 3 8
0 0 0 0 0 1 2 0 0 1 2 3 0 1 2 3 1 2 3 4 1 4 6 12
tab
win_loc
l. 37 l. 38,42
tab
win_loc MPI_GET
l. 44 l. 45,49
tab
win_loc
l. 50 l. 51,55
tab
win_loc
l. 57
l. 58,63 l. 65
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
87/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program ex_fence use mpi implicit none integer, parameter :: assert=0 integer :: code, rang, taille_reel, win, i, nb_elements, cible, m=4, n=4 integer (kind= MPI_ADDRESS_KIND ) :: deplacement, dim_win real(kind=kind(1.d0)), dimension(:), allocatable :: win_local, tab call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD , rang, code) call MPI_TYPE_SIZE ( MPI_DOUBLE_PRECISION ,taille_reel,code) if (rang==0) then n=0 allocate(tab(m)) endif allocate(win_local(n)) dim_win = taille_reel*n call MPI_WIN_CREATE (win_local, dim_win, taille_reel, MPI_INFO_NULL , & MPI_COMM_WORLD , win, code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
88/326
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
if (rang==0) then tab(:) = (/ (i, i=1,m) /) else win_local(:) = 0.0 end if call MPI_WIN_FENCE (assert,win,code) if (rang==0) then cible = 1; nb_elements = 2; deplacement = 1 call MPI_PUT (tab, nb_elements, MPI_DOUBLE_PRECISION , cible, deplacement, & nb_elements, MPI_DOUBLE_PRECISION , win, code) end if call MPI_WIN_FENCE (assert,win,code) if (rang==0) then tab(m) = sum(tab(1:m-1)) else win_local(n) = sum(win_local(1:n-1)) endif call MPI_WIN_FENCE (assert,win,code) if (rang==0) then nb_elements = 1; deplacement = m-1 call MPI_GET (tab, nb_elements, MPI_DOUBLE_PRECISION , cible, deplacement, & nb_elements, MPI_DOUBLE_PRECISION , win, code) end if
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
89/326
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
call MPI_WIN_FENCE (assert,win,code) if (rang==0) then tab(m) = sum(tab(1:m-1)) else win_local(:) = win_local(:) + 1 endif call MPI_WIN_FENCE (assert,win,code) if (rang==0) then nb_elements = m-1; deplacement = 1 call MPI_ACCUMULATE (tab(2), nb_elements, MPI_DOUBLE_PRECISION , cible, & deplacement, nb_elements, MPI_DOUBLE_PRECISION , & MPI_SUM , win, code) end if call MPI_WIN_FENCE (assert,win,code) call MPI_WIN_FREE (win,code) if (rang==0) then print *,"processus", rang, "tab=",tab(:) else print *,"processus", rang, "win_local=",win_local(:) endif call MPI_FINALIZE (code) end program ex_fence
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
90/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
91/326
les sous-programmes MPI_ACCUMULATE() admettent le recouvrement lintrieur dune mme fentre mmoire locale, la condition que les types des donnes et lopration de rduction utiliss soient identiques lors de tous ces appels ; les sous-programmes MPI_PUT() et MPI_ACCUMULATE() utiliss conscutivement nadmettent pas le recouvrement lintrieur dune mme fentre mmoire locale ; un load et un appel au sous-programme MPI_GET() peuvent accder concurremment nimporte quelle partie de la fentre locale, pourvu quelle nait pas t mise jour auparavant soit par un store, soit lors de lappel un sous-programme de type MPI_PUT() ou MPI_ACCUMULATE().
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
92/326
Se fait via les appels aux sous-programmes MPI MPI_WIN_LOCK() et MPI_WIN_UNLOCK(). Contrairement la synchronisation par MPI_WIN_FENCE() (qui est une opration collective de type barrire), ici seul le processus origine va participer la synchronisation. De ce fait tous les appels ncessaires au transfert des donnes (initialisation du transfert, synchronisation) ne font intervenir que le processus origine ; cest du vrai One Sided Communication . Les oprations de lock et dunlock ne sappliquent qu une fentre mmoire locale donne (i.e. identie par un numro de processus cible et un objet MPI fentre). La priode qui commence au lock et se termine lunlock est appele une priode daccs la fentre mmoire locale. Ce nest que durant cette priode que le processus origine va avoir accs la fentre mmoire locale du processus cible.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
93/326
Pour lutiliser, il sut pour le processus origine dentourer lappel aux primitives RMA dinitialisation de transfert de donnes par MPI_WIN_LOCK() et MPI_WIN_UNLOCK(). Pour le processus cible, aucun appel de sous-programmes MPI nest faire. Lorsque MPI_WIN_UNLOCK() rend la main, tous les transferts de donnes initis aprs le MPI_WIN_LOCK() sont termins. Le premier argument de MPI_WIN_LOCK() permet de spcier si le fait de faire plusieurs accs simultans via des oprations de RMA sur une mme fentre mmoire locale est autoris (MPI_LOCK_SHARED) ou non (MPI_LOCK_EXCLUSIVE). Une utilisation basique des synchronisations de type cible passive consiste crer des versions bloquantes des RMA (put, get, accumulate) sans que la cible ait besoin de faire appel des sous-programmes MPI .
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
94/326
1 2 3 4 5 6 7 8 9 10 11 12 13
subroutine get_bloquant(orig_addr, orig_count, orig_datatype, target_rank, & target_disp, target_count, target_datatype, win, code) integer, intent(in) :: orig_count, orig_datatype, target_rank, target_count, & target_datatype, win integer, intent(out) :: code integer(kind= MPI_ADDRESS_KIND ), intent(in) :: target_disp real(kind=kind(1.d0)), dimension(:) :: orig_addr call MPI_WIN_LOCK ( MPI_LOCK_SHARED , target_rank, 0, win, code) call MPI_GET (orig_addr, orig_count, orig_datatype, target_rank, target_disp, & target_count, target_datatype, win, code) call MPI_WIN_UNLOCK (target_rank, win, code) end subroutine get_bloquant
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
95/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
96/326
5.5 Conclusions
Les concepts RMA de MPI sont compliqus mettre en uvre sur des applications non triviales. Une connaissance approfondie de la norme est ncessaire pour ne pas tomber dans les nombreux piges. Les performances peuvent tre trs variables dune implmentation lautre. Lintrt du concept RMA de MPI rside essentiellement dans lapproche cible passive. Cest seulement dans ce cas que lutilisation des sous-programmes RMA est rellement indispensable (application ncessitant quun processus accde des donnes appartenant un processus distant sans interruption de ce dernier...).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
97/326
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 6.2 Types contigus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 6.3 Types avec un pas constant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 6.4 Autres sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.5 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 6.5.1 Type colonne dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 6.5.2 Type ligne dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.5.3 Type bloc dune matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6.6 Types homognes pas variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 6.7 Construction de sous-tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 6.8 Types htrognes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.9 Sous-programmes annexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
98/326
6.1 Introduction
Dans les communications, les donnes changes sont types : MPI_INTEGER, MPI_REAL, MPI_COMPLEX, etc On peut crer des structures de donnes plus complexes laide de sous-programmes tels que MPI_TYPE_CONTIGUOUS(), MPI_TYPE_VECTOR(), MPI_TYPE_CREATE_HVECTOR() chaque fois que lon cre un type de donnes, il faut le valider laide du sous-programme MPI_TYPE_COMMIT(). Si on souhaite rutiliser le mme nom pour dnir un autre type driv, on doit au pralable le librer avec le sous-programme MPI_TYPE_FREE()
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
99/326
6.1 Introduction
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
100/326
MPI_TYPE_CONTIGUOUS() cre une structure de donnes partir dun ensemble homogne de type prexistant de donnes contigus en mmoire. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
101/326
MPI_TYPE_VECTOR() cre une structure de donnes partir dun ensemble homogne de type prexistant de donnes distantes dun pas constant en mmoire. Le pas est donn en nombre dlments. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
102/326
MPI_TYPE_CREATE_HVECTOR() cre une structure de donnes partir dun ensemble homogne de type prdni de donnes distantes dun pas constant en mmoire. Le pas est donn en nombre doctets. Cette instruction est utile lorsque le type gnrique nest plus un type de base (MPI_INTEGER, MPI_REAL,...) mais un type plus complexe construit laide des sous-programmes MPI, parce qualors le pas ne peut plus tre exprim en nombre dlments du type gnrique.
integer, intent(in) :: nombre_bloc,longueur_bloc integer(kind= MPI_ADDRESS_KIND ), intent(in) :: pas ! donn en octets integer, intent(in) :: ancien_type integer, intent(out) :: nouveau_type, code call MPI_TYPE_CREATE_HVECTOR (nombre_bloc,longueur_bloc,pas, ancien_type,nouveau_type,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
103/326
Il est ncessaire de valider tout nouveau type de donnes driv laide du sous-programme MPI_TYPE_COMMIT().
integer, intent(inout) :: nouveau_type integer, intent(out) :: code call MPI_TYPE_COMMIT (nouveau_type,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
104/326
6.5 Exemples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
program colonne use mpi implicit none integer, parameter integer, parameter real, dimension(nb_lignes,nb_colonnes) integer, dimension( MPI_STATUS_SIZE ) integer :: :: :: :: :: nb_lignes=5,nb_colonnes=6 etiquette=100 a statut rang,code,type_colonne
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation de la matrice sur chaque processus a(:,:) = real(rang) ! Dfinition du type type_colonne call MPI_TYPE_CONTIGUOUS (nb_lignes, MPI_REAL ,type_colonne,code) ! Validation du type type_colonne call MPI_TYPE_COMMIT (type_colonne,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
105/326
6.5 Exemples
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
! Envoi de la premire colonne if ( rang == 0 ) then call MPI_SEND (a(1,1),1,type_colonne,1,etiquette, MPI_COMM_WORLD ,code) ! Rception dans la dernire colonne elseif ( rang == 1 ) then call MPI_RECV (a(1,nb_colonnes),1,type_colonne,0,etiquette,& MPI_COMM_WORLD ,statut,code) end if ! Libre le type call MPI_TYPE_FREE (type_colonne,code) call MPI_FINALIZE (code) end program colonne
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
106/326
6.5 Exemples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
program ligne use mpi implicit none integer, parameter :: integer, parameter :: real, dimension(nb_lignes,nb_colonnes):: integer, dimension( MPI_STATUS_SIZE ) :: integer :: nb_lignes=5,nb_colonnes=6 etiquette=100 a statut rang,code,type_ligne
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation de la matrice sur chaque processus a(:,:) = real(rang) ! Dfinition du type type_ligne call MPI_TYPE_VECTOR (nb_colonnes,1,nb_lignes, MPI_REAL ,type_ligne,code) ! Validation du type type_ligne call MPI_TYPE_COMMIT (type_ligne,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
107/326
6.5 Exemples
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
! Envoi de la deuxime ligne if ( rang == 0 ) then call MPI_SEND (a(2,1),1,type_ligne,1,etiquette, MPI_COMM_WORLD ,code) ! Rception dans lavant-dernire ligne elseif ( rang == 1 ) then call MPI_RECV (a(nb_lignes-1,1),1,type_ligne,0,etiquette,& MPI_COMM_WORLD ,statut,code) end if ! Libre le type type_ligne call MPI_TYPE_FREE (type_ligne,code) call MPI_FINALIZE (code) end program ligne
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
108/326
6.5 Exemples
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program bloc use mpi implicit none integer, parameter :: integer, parameter :: integer, parameter :: real, dimension(nb_lignes,nb_colonnes):: integer, dimension( MPI_STATUS_SIZE ) :: integer :: nb_lignes=5,nb_colonnes=6 etiquette=100 nb_lignes_bloc=2,nb_colonnes_bloc=3 a statut rang,code,type_bloc
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation de la matrice sur chaque processus a(:,:) = real(rang) ! Cration du type type_bloc call MPI_TYPE_VECTOR (nb_colonnes_bloc,nb_lignes_bloc,nb_lignes,& MPI_REAL ,type_bloc,code) ! Validation du type type_bloc call MPI_TYPE_COMMIT (type_bloc,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
109/326
6.5 Exemples
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
! Envoi dun bloc if ( rang == 0 ) then call MPI_SEND (a(1,1),1,type_bloc,1,etiquette, MPI_COMM_WORLD ,code) ! Rception du bloc elseif ( rang == 1 ) then call MPI_RECV (a(nb_lignes-1,nb_colonnes-2),1,type_bloc,0,etiquette,& MPI_COMM_WORLD ,statut,code) end if ! Libration du type type_bloc call MPI_TYPE_FREE (type_bloc,code) call MPI_FINALIZE (code) end program bloc
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
110/326
MPI_TYPE_INDEXED() permet de crer une structure de donnes compose dune squence de blocs contenant un nombre variable dlments et spars par un pas variable en mmoire. Ce dernier est exprim en lments. MPI_TYPE_CREATE_HINDEXED() a la mme fonctionnalit que MPI_TYPE_INDEXED() sauf que le pas sparant deux blocs de donnes est exprim en octets. Cette instruction est utile lorsque le type gnrique nest pas un type de base MPI (MPI_INTEGER, MPI_REAL, ...) mais un type plus complexe construit avec les sous-programmes MPI vus prcdemment. On ne peut exprimer alors le pas en nombre dlments du type gnrique do le recours MPI_TYPE_CREATE_HINDEXED(). Pour MPI_TYPE_CREATE_HINDEXED(), comme pour MPI_TYPE_CREATE_HVECTOR(), utilisez MPI_TYPE_SIZE() ou MPI_TYPE_GET_EXTENT() pour obtenir de faon portable la taille du pas en nombre doctets.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
111/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
112/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
113/326
Dans lexemple suivant, chacun des deux processus : initialise sa matrice (nombres croissants positifs sur le processus 0 et ngatifs dcroissants sur le processus 1) ; construit son type de donnes (datatype) : matrice triangulaire (suprieure pour le processus 0 et infrieure pour le processus 1) ; envoie sa matrice triangulaire lautre et reoit une matrice triangulaire quil stocke la place de celle quil a envoye via linstruction MPI_SENDRECV_REPLACE() ; libre ses ressources et quitte MPI.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
114/326
Avant
1 2 3 9 17 25 33 41 49 57 1 2 3 4 5 6 7 8 -2 10 -3 -4 10 18 26 34 42 50 58 11 19 27 35 43 51 59 12 20 28 36 44 52 60 13 21 29 37 45 53 61 14 22 30 38 46 54 62 15 23 31 39 47 55 63 16 24 32 40 48 56 64
Aprs
-5 -8 -14 -22 -32 -6 -11 -15 -23 -38 -7 -12 -16 -24 -39
11 19
Processus 0
4 5 6 7 8
12 20 28 -13 -20 -29 -40 13 21 29 37 -21 -30 -47 14 22 30 38 46 -31 -48 15 23 31 39 47 55 -56 16 24 32 40 48 56 64
-1
-1 9
-9 -17 -25 -33 -41 -49 -57 -10 -18 -26 -34 -42 -50 -58
-2 -10 -18 -26 -34 -42 -50 -58 -3 -11 -19 -27 -35 -43 -51 -59
17 34 -19 -27 -35 -43 -51 -59 18 35 44 -28 -36 -44 -52 -60 25 36 45 52 -37 -45 -53 -61 26 41 49 53 58 -46 -54 -62 27 42 50 54 59 61 -55 -63 33 43 51 57 60 62 63 -64
Processus 1
-4 -12 -20 -28 -36 -44 -52 -60 -5 -13 -21 -29 -37 -45 -53 -61 -6 -14 -22 -30 -38 -46 -54 -62 -7 -15 -23 -31 -39 -47 -55 -63 -8 -16 -24 -32 -40 -48 -56 -64
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
115/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
program triangle use mpi implicit none integer,parameter real,dimension(n,n) integer,dimension( MPI_STATUS_SIZE ) integer integer integer,dimension(n) :: :: :: :: :: :: n=8,etiquette=100 a statut i,code rang,type_triangle longueurs_blocs,deplacements
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation de la matrice sur chaque processus a(:,:) = reshape( (/ (sign(i,-rang),i=1,n*n) /), (/n,n/)) ! Cration du type matrice triangulaire sup pour le processus 0 ! et du type matrice triangulaire infrieure pour le processus1 if (rang == 0) then longueurs_blocs(:) = (/ (i-1,i=1,n) /) deplacements(:) = (/ (n*(i-1),i=1,n) /) else longueurs_blocs(:) = (/ (n-i,i=1,n) /) deplacements(:) = (/ (n*(i-1)+i,i=1,n) /) endif call MPI_TYPE_INDEXED (n,longueurs_blocs,deplacements, MPI_REAL ,type_triangle,code) call MPI_TYPE_COMMIT (type_triangle,code) ! Permutation des matrices triangulaires suprieure et infrieure call MPI_SENDRECV_REPLACE (a,1,type_triangle,mod(rang+1,2),etiquette,mod(rang+1,2), & etiquette, MPI_COMM_WORLD ,statut,code) ! Libration du type triangle call MPI_TYPE_FREE (type_triangle,code) call MPI_FINALIZE (code) end program triangle
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
116/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
117/326
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
118/326
AVANT 1 2 3 4 5 6 7 8 9 10 11 12 1 -7 -8 4
Processus 0
Processus 0
-1 -2 -3 -4
-5 -6 -7 -8
-1 -2 -3 -4
-5 -6 2 3
-9 -10 6 7
Processus 1
Processus 1
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
119/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
program subarray use mpi implicit none integer,parameter :: nb_lignes=4,nb_colonnes=3,& etiquette=1000,nb_dims=2 integer :: code,rang,type_sous_tab,i integer,dimension(nb_lignes,nb_colonnes) :: tab integer,dimension(nb_dims) :: profil_tab,profil_sous_tab,coord_debut integer,dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation du tableau tab sur chaque processus tab(:,:) = reshape( (/ (sign(i,-rang),i=1,nb_lignes*nb_colonnes) /) , & (/ nb_lignes,nb_colonnes /) )
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
120/326
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
! Profil du tableau tab partir duquel on va extraire un sous-tableau profil_tab(:) = shape(tab) ! La fonction F95 shape donne le profil du tableau pass en argument. ! ATTENTION, si le tableau concern na pas t allou sur tous les processus, ! il faut mettre explicitement le profil du tableau pour quil soit connu ! sur tous les processus, soit profil_tab(:) = (/ nb_lignes,nb_colonnes) /) ! Profil du sous-tableau profil_sous_tab(:) = (/ 2,2 /) ! Coordonnes de dpart du sous-tableau ! Pour le processus 0 on part de llment tab(2,1) ! Pour le processus 1 on part de llment tab(3,2) coord_debut(:) = (/ rang+1,rang /) ! Cration du type driv type_sous_tab call MPI_TYPE_CREATE_SUBARRAY (nb_dims,profil_tab,profil_sous_tab,coord_debut,& MPI_ORDER_FORTRAN , MPI_INTEGER ,type_sous_tab,code) call MPI_TYPE_COMMIT (type_sous_tab,code) ! Permutation du sous-tableau call MPI_SENDRECV_REPLACE (tab,1,type_sous_tab,mod(rang+1,2),etiquette,& mod(rang+1,2),etiquette, MPI_COMM_WORLD ,statut,code) call MPI_TYPE_FREE (type_sous_tab,code) call MPI_FINALIZE (code) end program subarray
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
121/326
Le sous-programme MPI_TYPE_CREATE_STRUCT() est le constructeur de types le plus gnral. Il a les mmes fonctionnalits que MPI_TYPE_INDEXED() mais permet en plus la rplication de blocs de donnes de types dirents. Les paramtres de MPI_TYPE_CREATE_STRUCT() sont les mmes que ceux de MPI_TYPE_INDEXED() avec en plus : le champ anciens_types est maintenant un vecteur de types de donnes MPI ; compte tenu de lhtrognit des donnes et de leur alignement en mmoire, le calcul du dplacement entre deux lments repose sur la dirence de leurs adresses ; MPI, via MPI_GET_ADDRESS(), fournit un sous-programme portable qui permet de retourner ladresse dune variable.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
122/326
type 2
type 3
:: nouveau_type,code
call MPI_TYPE_CREATE_STRUCT (nb,longueurs_blocs,deplacements, anciens_types,nouveau_type,code) <type>,intent(in) :: variable integer(kind= MPI_ADDRESS_KIND ),intent(out) :: adresse_variable integer,intent(out) :: code call MPI_GET_ADDRESS (variable,adresse_variable,code)
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
123/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
program Interaction_Particules use mpi implicit none integer, parameter integer, dimension( MPI_STATUS_SIZE ) integer integer, dimension(4) integer(kind= MPI_ADDRESS_KIND ), dimension(4) type Particule character(len=5) integer real, dimension(3) logical end type Particule type(Particule), dimension(n) call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Construction du type de donnes types = (/ MPI_CHARACTER , MPI_INTEGER , MPI_REAL , MPI_LOGICAL /) longueurs_blocs = (/5,1,3,1/) :: :: :: :: :: :: :: :: :: n=1000,etiquette=100 statut rang,code,type_particule,i types,longueurs_blocs deplacements,adresses categorie masse coords classe
:: p,temp_p
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
124/326
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
! Calcul des dplacements relatifs ladresse de dpart do i=1,4 deplacements(i)=adresses(i) - adresses(1) end do call MPI_TYPE_CREATE_STRUCT (4,longueurs_blocs,deplacements,types,type_particule, & code) ! Validation du type structur call MPI_TYPE_COMMIT (type_particule,code) ! Initialisation des particules pour chaque processus .... ! Envoi des particules de 0 vers 1 if (rang == 0) then call MPI_SEND (p(1)%categorie,n,type_particule,1,etiquette, MPI_COMM_WORLD ,code) else call MPI_RECV (temp_p(1)%categorie,n,type_particule,0,etiquette, MPI_COMM_WORLD , & statut,code) endif ! Libration du type call MPI_TYPE_FREE (type_particule,code) call MPI_FINALIZE (code) end program Interaction_Particules
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
125/326
Ltendue ainsi que la borne infrieure dun type driv, en tenant compte des ventuels alignements mmoire : MPI_TYPE_GET_EXTENT()
integer, intent(in) :: type_derive integer(kind= MPI_ADDRESS_KIND ),intent(out):: borne_inf_alignee,taille_alignee integer, intent(out) :: code call MPI_TYPE_GET_EXTENT (type_derive,borne_inf_alignee,taille_alignee,code)
On peut modier la borne infrieure dun type driv et son tendue pour crer un nouveau type adapt du prcdent
integer, intent(in) :: ancien_type integer(kind= MPI_ADDRESS_KIND ),intent(in) :: nouvelle_borne_inf,nouvelle_taille integer, intent(out) :: nouveau_type,code call MPI_TYPE_CREATE_RESIZED (ancien_type,nouvelle_borne_inf,nouvelle_taille, nouveau_type,code)
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
126/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
program ma_ligne use mpi implicit none integer, parameter :: nb_lignes=5,nb_colonnes=6, & demi_ligne=nb_colonnes/2,etiquette=1000 integer, dimension(nb_lignes,nb_colonnes) :: a integer :: typeDemiLigne,typeDemiLigne2 integer :: code,taille_integer,rang,i integer(kind= MPI_ADDRESS_KIND ) :: borneInf=0, tailleDeplacement integer, dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation de la matrice A sur chaque processus a(:,:) = reshape( (/ (sign(i,-rang),i=1,nb_lignes*nb_colonnes) /), & (/ nb_lignes,nb_colonnes /) ) ! Construction du type deriv typeDemiLigne call MPI_TYPE_VECTOR (demi_ligne,1,nb_lignes, MPI_INTEGER ,typeDemiLigne,code) ! Connatre la taille du type de base MPI_INTEGER call MPI_TYPE_SIZE ( MPI_INTEGER , taille_integer, code) ! Construction du type deriv typeDemiLigne2 tailleDeplacement = taille_integer call MPI_TYPE_CREATE_RESIZED (typeDemiLigne,borneInf,tailleDeplacement,& typeDemiLigne2,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
127/326
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
! Validation du type typeDemiLigne2 call MPI_TYPE_COMMIT (typeDemiLigne2,code) if (rang == 0) then ! Envoi de la matrice A au processus 1 avec le type typeDemiLigne2 call MPI_SEND (A(1,1), 2, typeDemiLigne2, 1, etiquette, & MPI_COMM_WORLD , code) else ! Rception pour le processus 1 dans la matrice A call MPI_RECV (A(1,nb_colonnes-1), 6, MPI_INTEGER , 0, etiquette,& MPI_COMM_WORLD ,statut, code) print *,Matrice A sur le processus 1 do i=1,nb_lignes print *,A(i,:) end do end if call MPI_FINALIZE (code) end program ma_ligne > mpiexec -n 4 demi_ligne Matrice A sur le processus 1 -1 -6 -11 -16 1 12 -2 -7 -12 -17 6 -27 -3 -8 -13 -18 11 -28 -4 -9 -14 -19 2 -29 -5 -10 -15 -20 7 -30
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
128/326
6.10 Conclusion
Les types drivs MPI sont de puissants mcanismes portables de description de donnes Ils permettent, lorsquils sont associs des instructions comme MPI_SENDRECV(), de simplier lcriture de sous-programmes dchanges interprocessus. Lassociation des types drivs et des topologies (dcrites dans lun des prochains chapitres) fait de MPI loutil idal pour tous les problmes de dcomposition de domaines avec des maillages rguliers ou irrguliers.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
129/326
7 Optimisations
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7.2 Modes denvoi point point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 7.2.1 Rappels terminologiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 7.2.2 Envois synchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7.2.3 Envois bueriss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.2.4 Envois standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 7.2.5 Envois en mode ready . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 7.2.6 Performances des dirents modes denvoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 7.3 Recouvrement calculs-communications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
130/326
7 Optimisations
7.1 Introduction
7 Optimisations
7.1 Introduction
Loptimisation des communications MPI doit tre un souci essentiel lorsque la part de ces dernires par rapport aux calculs devient assez importante. Loptimisation des communications, au-del du choix de lalgorithme le plus ecace possible, peut saccomplir de nombreux niveaux dont, par exemple : choisir le mode de communication le plus adapt ; recouvrir les communications par des calculs.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
131/326
7 Optimisations
7 Optimisations
Mode Envoi standard Envoi synchrone Envoi bueris Envoi en mode ready Rception
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
132/326
7 Optimisations
7 Optimisations
Il est important de bien comprendre la dnition de certains termes au sens MPI. Appel bloquant : un appel est bloquant si lespace mmoire servant la communication peut tre rutilis immdiatement aprs la sortie de lappel. Les donnes qui ont t ou seront envoyes sont celles qui taient dans cet espace au moment de lappel. Sil sagit dune rception, les donnes ont t reues dans cet espace (si le code de retour est MPI_SUCCESS)). Appel non bloquant : un appel non bloquant rend la main trs rapidement, mais nautorise pas la rutilisation immdiate de lespace mmoire utilis dans la communication. Il est ncessaire de sassurer que la communication est bien termine (avec MPI_WAIT par exemple) avant de lutiliser nouveau. Envoi synchrone : un envoi synchrone implique une synchronisation entre les processus concerns. Il ne peut donc y avoir communication que si les deux processus sont prts communiquer. Un envoi ne pourra commencer que lorsque sa rception sera poste. Envoi bueris : un envoi bueris implique la recopie des donnes dans un espace mmoire intermdiaire. Il ny a alors pas de couplage entre les deux processus de la communication. La sortie de ce type denvoi ne signie donc pas que la rception a eu lieu.
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
133/326
7 Optimisations
7 Optimisations
Processus 1
Le protocole de rendez-vous est gnralement celui employ pour les envois en mode synchrone (dpend de limplmentation). Laccus de rception est optionnel.
Temps
ir recevo prt
donnes
accus
pti rce
on
....... .......
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
134/326
7 Optimisations
Avantages Consomment peu de ressources (pas de buer) Rapides si le rcepteur est prt (pas de recopie dans un buer) Garantie de la rception grce la synchronisation Inconvnients Temps dattente si le rcepteur nest pas l/pas prt Risques de deadlocks
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
135/326
7 Optimisations
7 Optimisations
Envois bueriss Un envoi bueris se fait en appellant le sous-programme MPI_BSEND ou MPI_IBSEND. Les buers doivent tre grs manuellement (avec appels MPI_ATTACH et MPI_DETACH). Ils doivent tre allous en tenant compte des surcots mmoire des messages (en ajoutant la constante MPI_BSEND_OVERHEAD pour chaque instance de message).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
136/326
7 Optimisations
Protocole avec buer utilisateur du ct de lmetteur Cette approche est celle gnralement employe pour les appels MPI_BSEND ou MPI_IBSEND. Dans cette approche, le buer se trouve du ct de lmetteur et est gr explicitement par lapplication. Un buer gr par MPI peut exister du ct du rcepteur. De nombreuses variantes sont possibles. Laccus de rception est optionnel.
Processus 0
recop ie
message
Processus 1
Temps
accus
rcepti
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
137/326
7 Optimisations
Protocole eager Le protocole eager est souvent employ pour les envois en mode standard pour les messages de petites tailles. Il peut aussi tre utilis pour les envois avec MPI_BSEND avec des petits messages (dpend de limplmentation) et en court-circuitant le buer utilisateur du ct de lmetteur. Dans cette approche, le buer se trouve du ct du rcepteur. Laccus de rception est optionnel.
Processus 0
message
Processus 1
Temps
accus
pti rce
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
138/326
7 Optimisations
Avantages Pas besoin dattendre le rcepteur (recopie dans un buer) Pas de risque de blocage (deadlocks) Inconvnients Consomment plus de ressources (occupation mmoire par les buers avec risques de saturation) Les buers denvoi utiliss dans les appels MPI_BSEND ou MPI_IBSEND doivent tre grs manuellement (souvent dlicat de choisir une taille adapte) Un peu plus lent que les envois synchrones si le rcepteur est prt Pas de garantie de la bonne rception (dcouplage envoi-rception) Risque de gaspillage despace mmoire si les buers sont trop surdimensionns Lapplication plante si les buers sont trop petits Il y a aussi souvent des buers cachs gr par limplmentation MPI du ct de lexpditeur et/ou du rcepteur (et consommant des ressources mmoires)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
139/326
7 Optimisations
7 Optimisations
Envois standards Un envoi standard se fait en appelant le sous-programme MPI_SEND ou MPI_ISEND. Dans la plupart des implmentations, ce mode passe dun mode bueris un mode synchrone lorsque la taille des messages crot. Avantages Souvent le plus performant (choix du mode le plus adapt par le constructeur) Le plus portable pour les performances Inconvnients Peu de contrle sur le mode rellement utilis (souvent accessible via des variables denvironnement) Risque de deadlock selon le mode rel Comportement pouvant varier selon larchitecture et la taille du problme
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
140/326
7 Optimisations
7 Optimisations
Envois en mode ready Un envoi en mode ready se fait en appellant le sous-programme MPI_RSEND ou MPI_IRSEND. Attention : il est obligatoire de faire ces appels seulement lorsque la rception est dj poste. Leur utilisation est fortement dconseille. Avantages Lgrement plus performant que le mode synchrone car le protocole de synchronisation peut tre simpli Inconvnients Erreurs si le rcepteur nest pas prt lors de lenvoi
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
141/326
7 Optimisations
10
10
Bandwidth (MiB/s)
10
10
10
10
10
10
10
10
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
142/326
7 Optimisations
7 Optimisations
Prsentation Le recouvrement des communications par des calculs est une mthode permettant de raliser des oprations de communications en arrire-plan pendant que le programme continue de sexcuter. Il est ainsi possible, si larchitecture matrielle et logicielle le permet, de masquer tout ou une partie des cots de communications. Le recouvrement calculs-communications peut tre vu comme un niveau supplmentaire de paralllisme. Cette approche sutilise dans MPI par lutilisation de sous-programmes non-bloquants (i.e. MPI_ISEND, MPI_IRECV et MPI_WAIT).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
143/326
7 Optimisations
Recouvrement partiel
Processus 0
requte
Recouvrement total
Processus 0
requte
....... .......
Temps
termin ?
Temps
envo
envo
oui
.......
oui
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
144/326
7 Optimisations
Avantages Possibilit de masquer tout ou une partie des cots des communications (si larchitecture le permet) Pas de risques de deadlock Inconvnients Surcots plus importants (plusieurs appels pour un seul envoi ou rception, gestion des requtes) Complexit plus leve et maintenance plus complique Peu performant sur certaines machines (par exemple avec transfert commenant seulement lappel de MPI_WAIT) Risque de perte de performance sur les noyaux de calcul (par exemple gestion direncie entre la zone proche de la frontire dun domaine et la zone intrieure entranant une moins bonne utilisation des caches mmoires) Limit aux communications point point (a t tendu aux collectives dans MPI 3.0)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
145/326
7 Optimisations
Utilisation Lenvoi dun message se fait en 2 tapes : Initier lenvoi ou la rception par un appel un sous-programme commenant par MPI_ISEND ou MPI_IRECV (ou une de leurs variantes) Attendre la n de la contribution locale par un appel MPI_WAIT (ou une de ses variantes). Les communications sont recouvertes par toutes les oprations qui se droulent entre ces deux tapes. Laccs aux donnes en cours de rception est interdit avant la n de lappel MPI_WAIT (laccs aux donnes en cours denvoi est galement interdit pour les implmentations MPI antrieures la 2.2).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
146/326
7 Optimisations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
integer, dimension(2) :: req do i=1,niter ! Initie les communications call MPI_IRECV (data_ext, sz, MPI_REAL ,dest,tag,comm, & req(1),code) call MPI_ISEND (data_bound,sz, MPI_REAL ,dest,tag,comm, & req(2),code) ! Calcule le domaine interieur (data_ext et data_bound ! non utilises) pendant que les communications ont lieu call calcul_domaine_interieur(data_int) ! Attend la fin des communications call MPI_WAITALL (2,req, MPI_STATUSES_IGNORE ,code) ! Calcule le domaine exterieur call calcul_domaine_exterieur(data_int,data_bound,data_ext) end do
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
147/326
7 Optimisations
Niveau de recouvrement sur direntes machines Machine Blue Gene/P DCMF_INTERRUPT=0 Blue Gene/P DCMF_INTERRUPT=1 Power6 InniBand NEC SX-8 CURIE Niveau 34% 100% 38% 10% 0%
Mesures faites en recouvrant un noyau de calcul et un noyau de communication de mmes dures et en utilisant dirents schmas de communications (intra/extra-nuds, par paires, processus alatoires...). Selon le schma de communication, les rsultats peuvent tre totalement dirents. Un recouvrement de 0% signie que la dure totale dexcution vaut 2x la dure dun noyau de calcul (ou communication). Un recouvrement de 100% signie que la dure totale vaut 1x la dure dun noyau de calcul (ou communication).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
148/326
8 Communicateurs
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 8.2 Communicateur par dfaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 8.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 8.4 Groupes et communicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 8.5 Communicateur issu dun autre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 8.6 Topologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 8.6.1 Topologies cartsiennes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 8.6.2 Subdiviser une topologie cartsienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
149/326
8 Communicateurs
8.1 Introduction
8 Communicateurs
8.1 Introduction
Il sagit de partitionner un ensemble de processus an de crer des sous-ensembles sur lesquels on puisse eectuer des oprations telles que des communications point point, collectives, etc. Chaque sous-ensemble ainsi cr aura son propre espace de communication.
MPI_COMM_WORLD
c2 e4 b1 h 7
a0 g6 f5 d3
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
150/326
8 Communicateurs
8 Communicateurs
Cest lhistoire de la poule et de luf... On ne peut crer un communicateur qu partir dun autre communicateur Fort heureusement, cela a t rsolu en postulant que la poule existait dj. En eet, un communicateur est fourni par dfaut, dont lidenticateur MPI_COMM_WORLD est un entier dni dans les chiers den-tte. Ce communicateur initial MPI_COMM_WORLD est cr pour toute la dure dexcution du programme lappel du sous-programme MPI_INIT() Ce communicateur ne peut tre dtruit que via lappel MPI_FINALIZE() Par dfaut, il xe donc la porte des communications point point et collectives tous les processus de lapplication
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
151/326
8 Communicateurs
8.3 Exemple
8 Communicateurs
8.3 Exemple
Dans lexemple qui suit, nous allons : regrouper dune part les processus de rang pair et dautre part les processus de rang impair ; ne diuser un message collectif quaux processus de rang pair et un autre quaux processus de rang impair.
MPI_COMM_WORLD
a0 e 4 g6 c2
a0 0 3 g6
2 e4 1 c2
h7 f 5 b1 d 3
2 h3 f5 7 b0 d1 1 3 2 h 3 f5 7 b0 d 1 1 3
call MPI_COMM_SPLIT(...)
2 a0 e4 0 3 1 g6 c2
call MPI_BCAST(...)
a0 e 4 g6 c2
h7 f 5 b1 d 3
call MPI_COMM_FREE(...)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
152/326
8 Communicateurs
8.3 Exemple
Que faire pour que le processus 2 diuse ce message au sous-ensemble de processus de rang pair, par exemple ? Boucler sur des send/recv peut tre trs pnalisant surtout si le nombre de processus est lev. De plus un test serait obligatoire dans la boucle pour savoir si le rang du processus auquel le processus 2 doit envoyer le message est pair ou impair. La solution est de crer un communicateur regroupant ces processus de sorte que le processus 2 diuse le message eux seuls
MPI_COMM_WORLD
a0 e4 g6 c2
h7 b1
f5 d3
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
153/326
8 Communicateurs
8 Communicateurs
Un communicateur est constitu : dun groupe, qui est un ensemble ordonn de processus ; dun contexte de communication mis en place lappel du sous-programme de construction du communicateur, qui permet de dlimiter lespace de communication. Les contextes de communication sont grs par MPI (le programmeur na aucune action sur eux : cest un attribut cach ) En pratique, pour construire un communicateur, il existe deux faons de procder : par lintermdiaire dun groupe de processus ; directement partir dun autre communicateur.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
154/326
8 Communicateurs
Dans la bibliothque MPI, divers sous-programmes existent pour construire des communicateurs : MPI_CART_CREATE(), MPI_CART_SUB(), MPI_COMM_CREATE(), MPI_COMM_DUP(), MPI_COMM_SPLIT() Les constructeurs de communicateurs sont des oprateurs collectifs (qui engendrent des communications entre les processus) Les communicateurs que le programmeur cre peuvent tre grs dynamiquement et, de mme quil est possible den crer, il est possible den dtruire en utilisant le sous-programme MPI_COMM_FREE()
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
155/326
8 Communicateurs
8 Communicateurs
Lutilisation directe des groupes prsente dans ce cas divers inconvnients, car elle impose de : nommer diremment les deux communicateurs (par exemple comm_pair et comm_impair) ; passer par les groupes pour construire ces deux communicateurs ; laisser le soin MPI dordonner le rang des processus dans ces deux communicateurs ; faire des tests conditionnels lors de lappel au sous-programme MPI_BCAST() :
if (comm_pair /= MPI_COMM_NULL ) then ... ! Diffusion du message seulement aux processus de rangs pairs call MPI_BCAST (a,m, MPI_REAL ,rang_ds_pair,comm_pair,code) elseif (comm_impair /= MPI_COMM_NULL ) then ... ! Diffusion du message seulement aux processus de rangs impairs call MPI_BCAST (a,m, MPI_REAL ,rang_ds_impair,comm_impair,code) end if
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
156/326
8 Communicateurs
Le sous-programme MPI_COMM_SPLIT() permet de partitionner un communicateur donn en autant de communicateurs que lon veut...
integer, intent(in) :: comm, couleur, clef integer, intent(out) :: nouveau_comm, code call MPI_COMM_SPLIT (comm,couleur,clef,nouveau_comm,code)
a 0 0 2 1
b 1 2 15 1
c 2 3 0 0
d 3 0 0 0
e 4 3 1 1
f 5 0 3 2
g 6 2 11 0
h 7 3 1 2
MPI_COMM_WORLD 2 a1 f5 0
d0 3 g0 6
1 b1
c0 2 h2 7
e1 4
Un processus qui se voit attribuer une couleur gale la valeur MPI_UNDEFINED nappartiendra qu son communicateur initial.
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
157/326
8 Communicateurs
Voyons comment procder pour construire le communicateur qui va subdiviser lespace de communication entre processus de rangs pairs et impairs, via le constructeur MPI_COMM_SPLIT().
MPI_COMM_WORLD
a 0 0 0 1
b 1 1 1 1
c 2 0 -1 0
d 3 1 3 2
e 4 0 4 2
f 5 1 -1 0
g 6 0 6 3
h 7 1 7 3
a1 g3 0 6 c0 e2 2 4
2 d3 f0 5
h3 b1 7 1
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
158/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
8 Communicateurs
program PairsImpairs use mpi implicit none integer, parameter integer integer real, dimension(m) :: :: :: :: m=16 clef,CommPairsImpairs rang_dans_monde,code a
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang_dans_monde,code) ! Initialisation du vecteur A a(:)=0. if(rang_dans_monde == 2) a(:)=2. if(rang_dans_monde == 5) a(:)=5. clef = rang_dans_monde if (rang_dans_monde == 2 .OR. rang_dans_monde == 5 ) then clef=-1 end if ! Cration des communicateurs pair et impair en leur donnant une mme dnomination call MPI_COMM_SPLIT ( MPI_COMM_WORLD ,mod(rang_dans_monde,2),clef,CommPairsImpairs,code) ! Diffusion du message par le processus 0 de chaque communicateur aux processus ! de son groupe call MPI_BCAST (a,m, MPI_REAL ,0,CommPairsImpairs,code) ! Destruction des communicateurs call MPI_COMM_FREE (CommPairsImpairs,code) call MPI_FINALIZE (code) end program PairsImpairs
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
159/326
8 Communicateurs
8.6 Topologies
8 Communicateurs
8.6 Topologies
Dans la plupart des applications, plus particulirement dans les mthodes de dcomposition de domaine o lon fait correspondre le domaine de calcul la grille de processus, il est intressant de pouvoir disposer les processus suivant une topologie rgulire MPI permet de dnir des topologies virtuelles du type cartsien ou graphe Topologies de type cartsien chaque processus est dni dans une grille de processus ; la grille peut tre priodique ou non ; les processus sont identis par leurs coordonnes dans la grille. Topologies de type graphe gnralisation des topologies plus complexes.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
160/326
8 Communicateurs
8.6 Topologies
8 Communicateurs
Une topologie cartsienne est dnie lorsquun ensemble de processus appartenant un communicateur donn comm_ancien appellent le sous-programme MPI_CART_CREATE().
integer, integer, logical, logical, intent(in) dimension(ndims),intent(in) dimension(ndims),intent(in) intent(in) :: :: :: :: comm_ancien, ndims dims periods reorganisation
integer, intent(out)
:: comm_nouveau, code
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
161/326
8 Communicateurs
8.6 Topologies
............................................... dims(1) = 4 dims(2) = 2 periods(1) = .false. periods(2) = .true. reorganisation = .false. call MPI_CART_CREATE ( MPI_COMM_WORLD ,ndims,dims,periods,reorganisation,comm_2D,code)
Si reorganisation = .false. alors le rang des processus dans le nouveau communicateur (comm_2D) est le mme que dans lancien communicateur (MPI_COMM_WORLD). Si reorganisation = .true., limplmentation MPI choisit lordre des processus.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
162/326
8 Communicateurs
8.6 Topologies
1 0 1 0
3 2 3 2
5 4 5 4
7 6 7 6 x
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
163/326
8 Communicateurs
8.6 Topologies
Exemple sur une grille 3D comportant 4 domaines suivant x, 2 suivant y et 2 suivant z, non priodique.
use mpi integer integer, parameter integer, dimension(ndims) logical, dimension(ndims) logical :: :: :: :: :: comm_3D,code ndims = 3 dims periods reorganisation
............................................... dims(1) = 4 dims(2) = 2 dims(3) = 2 periods(:) = .false. reorganisation = .false. call MPI_CART_CREATE ( MPI_COMM_WORLD ,ndims,dims,periods,reorganisation,comm_3D,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
164/326
8 Communicateurs
8.6 Topologies
2 0
6 4
10 8
14 12 z=0 3
3 1
7 5
11 9
15 13 z=1
11
15
10
14 13 12 z=1 z=0
0 y z x
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
165/326
8 Communicateurs
8.6 Topologies
Dans une topologie cartsienne, le sous-programme MPI_DIMS_CREATE() retourne le nombre de processus dans chaque dimension de la grille en fonction du nombre total de processus.
integer, intent(in) :: nb_procs, ndims integer, dimension(ndims),intent(inout) :: dims integer, intent(out) :: code call MPI_DIMS_CREATE (nb_procs,ndims,dims,code)
Remarque : si les valeurs de dims en entre valent toutes 0, cela signie quon laisse MPI le choix du nombre de processus dans chaque direction en fonction du nombre total de processus. dims en entre (0,0) (0,0,0) (0,4,0) (0,3,0) call MPI_DIMS_CREATE (8,2,dims,code) (16,3,dims,code) (16,3,dims,code) (16,3,dims,code) dims en sortie (4,2) (4,2,2) (2,4,2) error
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
166/326
8 Communicateurs
8.6 Topologies
Dans une topologie cartsienne, le sous-programme MPI_CART_RANK() retourne le rang du processus associ aux coordonnes dans la grille.
integer, intent(in) :: comm_nouveau integer, dimension(ndims),intent(in) :: coords integer, intent(out) :: rang, code
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
167/326
8 Communicateurs
8.6 Topologies
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
168/326
8 Communicateurs
8.6 Topologies
Dans une topologie cartsienne, le sous-programme MPI_CART_COORDS() retourne les coordonnes dun processus de rang donn dans la grille.
integer, intent(in) :: comm_nouveau, rang, ndims integer, dimension(ndims),intent(out) :: coords integer, intent(out) :: code call MPI_CART_COORDS (comm_nouveau, rang, ndims, coords, code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
169/326
8 Communicateurs
8.6 Topologies
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
170/326
8 Communicateurs
8.6 Topologies
Dans une topologie cartsienne, un processus appelant le sous-programme MPI_CART_SHIFT() se voit retourner le rang de ses processus voisins dans une direction donne.
integer, intent(in) :: comm_nouveau, direction, pas integer, intent(out) :: rang_precedent,rang_suivant integer, intent(out) :: code call MPI_CART_SHIFT (comm_nouveau, direction, pas, rang_precedent, rang_suivant, code)
Le paramtre direction correspond laxe du dplacement (xyz). Le paramtre pas correspond au pas du dplacement.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
171/326
8 Communicateurs
8.6 Topologies
1 0 1 (0,1) 0 (0,0)
3 2 3 (1,1) 2 (1,0)
5 4 5 (2,1) 4 (2,0)
direction = 0
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
172/326
8 Communicateurs
8.6 Topologies
3 2 0 y z x
11
15
6 4
10 8
14 13 12 z=1 z=0
direction=0 direction=1 direction=2
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
173/326
8 Communicateurs
8.6 Topologies
Exemple de programme :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
program decomposition use mpi implicit none integer integer integer, integer, integer, integer, logical, logical :: :: dimension(4) :: parameter :: parameter :: dimension (ndims) :: dimension (ndims) :: :: rang_ds_topo,nb_procs code,comm_2D voisin N=1,E=2,S=3,W=4 ndims = 2 dims,coords periods reorganisation
call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) ! Connatre le nombre de processus suivant x et y dims(:) = 0 call MPI_DIMS_CREATE (nb_procs,ndims,dims,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
174/326
8 Communicateurs
8.6 Topologies
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
! Cration grille 2D priodique en y periods(1) = .false. periods(2) = .true. reorganisation = .false. call MPI_CART_CREATE ( MPI_COMM_WORLD ,ndims,dims,periods,reorganisation,comm_2D,code) ! Connatre mes coordonnes dans la topologie call MPI_COMM_RANK (comm_2D,rang_ds_topo,code) call MPI_CART_COORDS (comm_2D,rang_ds_topo,ndims,coords,code) ! Initialisation du tableau voisin la valeur MPI_PROC_NULL voisin(:) = MPI_PROC_NULL ! Recherche de mes voisins Ouest et Est call MPI_CART_SHIFT (comm_2D,0,1,voisin(W),voisin(E),code) ! Recherche de mes voisins Sud et Nord call MPI_CART_SHIFT (comm_2D,1,1,voisin(S),voisin(N),code) call MPI_FINALIZE (code) end program decomposition
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
175/326
8 Communicateurs
8.6 Topologies
8 Communicateurs
La question est de savoir comment dgnrer une topologie cartsienne 2D ou 3D de processus en une topologie cartsienne respectivement 1D ou 2D. Pour MPI, dgnrer une topologie cartsienne 2D (ou 3D) revient crer autant de communicateurs quil y a de lignes ou de colonnes (resp. de plans) dans la grille cartsienne initiale. Lintrt majeur est de pouvoir eectuer des oprations collectives restreintes un sous-ensemble de processus appartenant : une mme ligne (ou colonne), si la topologie initiale est 2D ; un mme plan, si la topologie initiale est 3D.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
176/326
8 Communicateurs
8.6 Topologies
2 1 0 0 0 1
2 4 3 1
5 7 6 2
11 1 0 0 0 1
2 4 3 1
5 7 6 2
8 10 9 3
11
V
10 9 3
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
177/326
8 Communicateurs
8.6 Topologies
Il existe deux faons de faire pour dgnrer une topologie : en utilisant le sous-programme gnral MPI_COMM_SPLIT() ; en utilisant le sous-programme MPI_CART_SUB() prvu cet eet.
logical,intent(in),dimension(NDim) :: conserve_dims integer,intent(in) :: CommCart integer,intent(out) :: CommCartD, code call MPI_CART_SUB (CommCart,conserve_dims,CommCartD,code)
2 1 0 0 0 1
11
2 1 0 0 0 1
w=5
10
w=4
3 1
6 2
9 3
w=3
3 1
11
w=5
10
w=4
6 2
9 3
w=3
Figure 44 Reprsentation initiale dun tableau V dans la grille 2D et reprsentation nale aprs la distribution de celui-ci sur la grille 2D dgnre
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
178/326
8 Communicateurs
8.6 Topologies
1 2 3 4 5 6 7 8 9 10 11 12
program CommCartSub use mpi implicit none integer integer,parameter integer,dimension(NDim2D) logical,dimension(NDim2D) logical integer,parameter real, dimension(m) real :: :: :: :: :: :: :: :: Comm2D,Comm1D,rang,code NDim2D=2 Dim2D,Coord2D Periode,conserve_dims Reordonne m=4 V(:)=0. W=0.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
179/326
8 Communicateurs
8.6 Topologies
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
call MPI_INIT (code) ! Cration de la grille 2D initiale Dim2D(1) = 4 Dim2D(2) = 3 Periode(:) = .false. ReOrdonne = .false. call MPI_CART_CREATE ( MPI_COMM_WORLD ,NDim2D,Dim2D,Periode,ReOrdonne,Comm2D,code) call MPI_COMM_RANK (Comm2D,rang,code) call MPI_CART_COORDS (Comm2D,rang,NDim2D,Coord2D,code) ! Initialisation du vecteur V if (Coord2D(1) == 1) V(:)=real(rang) ! Chaque ligne de la grille doit tre une topologie cartsienne 1D conserve_dims(1) = .true. conserve_dims(2) = .false. ! Subdivision de la grille cartsienne 2D call MPI_CART_SUB (Comm2D,conserve_dims,Comm1D,code) ! Les processus de la colonne 2 distribuent le vecteur V aux processus de leur ligne call MPI_SCATTER (V,1, MPI_REAL ,W,1, MPI_REAL ,1,Comm1D,code) print ("Rang : ",I2," ; Coordonnees : (",I1,",",I1,") ; W = ",F2.0), & rang,Coord2D(1),Coord2D(2),W call MPI_FINALIZE (code) end program CommCartSub
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
180/326
8 Communicateurs
8.6 Topologies
> mpiexec Rang : 0 Rang : 1 Rang : 3 Rang : 8 Rang : 4 Rang : 5 Rang : 6 Rang : 10 Rang : 11 Rang : 9 Rang : 2 Rang : 7
-n 12 CommCartSub ; Coordonnees : (0,0) ; Coordonnees : (0,1) ; Coordonnees : (1,0) ; Coordonnees : (2,2) ; Coordonnees : (1,1) ; Coordonnees : (1,2) ; Coordonnees : (2,0) ; Coordonnees : (3,1) ; Coordonnees : (3,2) ; Coordonnees : (3,0) ; Coordonnees : (0,2) ; Coordonnees : (2,1)
; ; ; ; ; ; ; ; ; ; ; ;
W W W W W W W W W W W W
= = = = = = = = = = = =
3. 4. 3. 5. 4. 5. 3. 4. 5. 3. 5. 4.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
181/326
9 MPI-IO
1 Introduction 2 Environnement 3 Communications point point 4 5 6 7 Communications collectives Copies de mmoire mmoire Types de donnes drivs Optimisations
8 Communicateurs 9 MPI-IO 9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1.1 Prsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1.2 Enjeux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 9.1.3 Dnitions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187 9.2 Gestion de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 9.3 Lectures/critures : gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 9.4 Lectures/critures individuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.4.1 Via des dplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.4.2 Via des dplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 9.4.3 Via des dplacements implicites partags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 9.5 Lectures/critures collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 9.5.1 Via des dplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.5.2 Via des dplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 9.5.3 Via des dplacements implicites partags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 9.6 Positionnement explicite des pointeurs dans un chier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 9.7 Dnition de vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 9.8 Lectures/critures non bloquantes . . . . . . . . . . . . . . . . . . . . . . . . .MPI. . . Version. . . . .. . . . . . 2012 . . . . . . . . . 4.1 Avril 235 9.8.1 Via des dplacements explicitesDupays,. . . . Girou, .P.-F. .Lavalle, .D. .Lecas, .P.. Wautelet J. Chergui, I. . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
182/326
9 MPI-IO
9.1 Introduction
9 MPI-IO
Trs logiquement, les applications qui font des calculs volumineux manipulent galement des quantits importantes de donnes externes, et gnrent donc un nombre consquent dentres-sorties. Le traitement ecace de celles-ci inue donc parfois trs fortement sur les performances globales des applications.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
183/326
9 MPI-IO
9.1 Introduction
Loptimisation des entres-sorties de codes parallles se fait par la combinaison : de leur paralllisation, pour viter de crer un goulet dtranglement en raison de leur srialisation ; de techniques mises en uvre explicitement au niveau de la programmation (lectures / critures non-bloquantes) ; doprations spciques prises en charge par le systme dexploitation (regroupement des requtes, gestion des tampons dentres-sorties, etc.). Les buts de MPI-IO, via linterface de haut niveau quil propose, sont dorir simplicit, expressivit et souplesse, tout en autorisant des implmentations performantes prenant en compte les spcicits matrielles et logicielles des dispositifs dentres-sorties des machines cibles. MPI-IO ore une interface calque sur celle utilise pour lchange de messages. La dnition des donnes accdes suivant les processus se fait par lutilisation de types de donnes (de base ou bien drivs). Quant aux notions doprations collectives et de non-bloquantes, elles sont gres de faon similaire ce que propose MPI pour les messages. MPI-IO autorise des accs aussi bien squentiels qualatoires.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
184/326
9 MPI-IO
9.1 Introduction
9 MPI-IO
Cest une interface de haut niveau, o, comme on la dit, certaines techniques doptimisation sont accessibles aux utilisateurs, mais o beaucoup doptimisations essentielles peuvent tre implmentes de faon transparente. Deux exemples importants en sont : le cas daccs nombreux, par un seul processus, de petits blocs discontinus : ceci peut tre trait par un mcanisme de passoire (data sieving), aprs regroupement dun ensemble de requtes, lecture dun grand bloc contigu du disque vers une zone mmoire tampon, puis aectation aux zones mmoire utilisateur des sous-ensembles adquats de donnes ;
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
185/326
9 MPI-IO
9.1 Introduction
Requtes sur de petits blocs non contigus dun chier Lecture dun grand bloc contigu et transfert dans une zone mmoire tampon Copies mmoire des lments requis dans les variables du programme
Figure 45 Mcanisme de passoire dans le cas daccs nombreux, par un seul processus, de petits blocs discontinus
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
186/326
9 MPI-IO
9.1 Introduction
le cas daccs, par un ensemble de processus, des blocs discontinus (cas des tableaux distribus, par exemple) : ceci peut tre trait par des entres-sorties collectives en dcomposant les oprations en deux phases.
Requte proc. 0 Requte proc. 1 Requte proc. 2
Fichier
Domaine du processus 0 Domaine du processus 1 Domaine du processus 2
Lecture
Tampon mm. processus 0
Lecture
Tampon mm. processus 1
Lecture
Tampon mm. processus 2
Communications
Variable du processus 0
Variable du processus 1
Variable du processus 2
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
187/326
9 MPI-IO
9.1 Introduction
9 MPI-IO
chier (le) : un chier MPI est un ensemble ordonn de donnes types. Un chier est ouvert collectivement par tous les processus dun communicateur. Toutes les oprations dentres-sorties collectives ultrieures se feront dans ce cadre. dplacement initial (displacement) : cest une adresse absolue, exprime en octets, par rapport au dbut du chier et partir de laquelle une vue commence. type lmentaire de donnes type_lm (etype) : cest lunit de donne utilise pour calculer les positionnements et pour accder aux donnes. Ce peut tre nimporte quel type de donne MPI, prdni ou bien cr en tant que type driv. motif (letype) : cest un masque qui constitue la base du partitionnement dun chier entre processus (si le chier est vu comme un pavage une dimension, le motif est la tuile lmentaire qui sert au pavage). Cest ou bien un type lmentaire de donnes, ou bien un type driv MPI construit comme une rptition doccurrences dun tel type lmentaire de donnes (les trous parties de chiers non accdes doivent galement tre un multiple du type_lm utilis).
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
188/326
9 MPI-IO
9.1 Introduction
vue (view) : une vue dnit lensemble des donnes visibles (et donc accessibles) dun chier, une fois que celui-ci a t ouvert. Cest un ensemble ordonn de types lmentaires de donnes. position (oset) : cest la position dans le chier, exprime en nombre de type_lm, relativement la vue courante (les trous dnis dans la vue ne sont pas comptabiliss pour calculer les positions). descripteur (le handle) : le descripteur est un objet cach cr louverture et dtruit la fermeture dun chier. Toutes les oprations sur un chier se font en spciant comme rfrence son descripteur. pointeur (le pointer) : ils sont tenus jour automatiquement par MPI et dterminent des positions lintrieur du chier. Il y en a de deux sortes : les pointeurs individuels qui sont propres chaque processus ayant ouvert le chier ; les pointeurs partags qui sont communs tous les processus ayant ouvert le chier. taille du chier (le size) : la taille dun chier MPI est mesure en nombre doctets.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
189/326
9 MPI-IO
9 MPI-IO
Les tches courantes de gestion de chiers sont des oprations collectives faites par tous les processus du communicateur indiqu. Nous ne dcrivons ici que les principaux sous-programmes (ouverture, fermeture, obtention des caractristiques) mais dautres sont disponibles (suppression, pr-allocation, etc.). Les attributs (dcrivant les droits daccs, le mode douverture, la destruction ventuelle la fermeture, etc.) doivent tre prciss par oprations sur des constantes prdnies. Tous les processus du communicateur au sein duquel un chier est ouvert participeront aux oprations collectives ultrieures daccs aux donnes. Louverture dun chier renvoie un descripteur, qui sera ensuite utilis dans toutes les oprations portant sur ce chier. Les informations disponibles via le sous-programme MPI_FILE_SET_INFO() varient dune implmentation lautre.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
190/326
9 MPI-IO
Table 4 Attributs pouvant tre positionns lors de louverture des chiers Attribut MPI_MODE_RDONLY MPI_MODE_RDWR MPI_MODE_WRONLY MPI_MODE_CREATE MPI_MODE_EXCL MPI_MODE_UNIQUE_OPEN MPI_MODE_SEQUENTIAL MPI_MODE_APPEND MPI_MODE_DELETE_ON_CLOSE Signication seulement en lecture en lecture et criture seulement en criture cration du chier sil nexiste pas erreur si le chier existe erreur si le chier est dj ouvert par une autre application accs squentiel pointeurs en n de chier (mode ajout) destruction aprs la fermeture
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
191/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
program open01 use mpi implicit none integer :: descripteur,code call MPI_INIT (code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"fichier.txt", & MPI_MODE_RDWR + MPI_MODE_CREATE , MPI_INFO_NULL ,descripteur,code) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program open01
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
192/326
9 MPI-IO
9 MPI-IO
Les transferts de donnes entre chiers et zones mmoire des processus se font via des appels explicites des sous-programmes de lecture et dcriture. On distingue trois proprits des accs aux chiers : le positionnement, qui peut tre explicite (en spciant par exemple le nombre voulu doctets depuis le dbut du chier) ou implicite, via des pointeurs grs par le systme (ces pointeurs peuvent tre de deux types : soit individuels chaque processus, soit partags par tous les processus) ; la synchronisation, les accs pouvant tre de type bloquants ou non bloquants ; le regroupement, les accs pouvant tre collectifs (cest--dire eectus par tous les processus du communicateur au sein duquel le chier a t ouvert) ou propres seulement un ou plusieurs processus. Il y a de nombreuses variantes disponibles : nous en dcrirons un certain nombre, sans pouvoir tre exhaustif.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
193/326
9 MPI-IO
Positionnement
Synchronisation
collectif
adresses explicites
MPI_FILE_READ_AT_ALL bloquantes MPI_FILE_WRITE_AT_ALL MPI_FILE_READ_AT_ALL_BEGIN MPI_FILE_READ_AT_ALL_END non bloquantes MPI_FILE_IWRITE_AT MPI_FILE_WRITE_AT_ALL_BEGIN MPI_FILE_WRITE_AT_ALL_END suite page suivante
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
194/326
9 MPI-IO
Positionnement
Synchronisation bloquantes
collectif
MPI_FILE_READ_SHARED MPI_FILE_READ_ORDERED MPI_FILE_WRITE_SHARED MPI_FILE_WRITE_ORDERED pointeurs MPI_FILE_IREAD_SHARED MPI_FILE_READ_ORDERED_BEGIN implicites MPI_FILE_READ_ORDERED_END partags non bloquantes MPI_FILE_IWRITE_SHARED MPI_FILE_WRITE_ORDERED_BEGIN MPI_FILE_WRITE_ORDERED_END bloquantes
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
195/326
9 MPI-IO
Il est possible de mlanger les types daccs eectus un mme chier au sein dune application. Les zones mmoire accdes sont dcrites par trois quantits : ladresse initiale de la zone concerne ; le nombre dlments pris en compte ; le type de donnes, qui doit correspondre une suite de copies contigu du type lmentaire de donne (type_lm) de la vue courante.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
196/326
9 MPI-IO
9 MPI-IO
La position est exprime en nombre doccurrences dun type de donnes, lequel doit tre un multiple du type lmentaire de donne de la vue courante. Le chier ne doit pas avoir t ouvert avec lattribut MPI_MODE_SEQUENTIAL.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
197/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
program write_at use mpi implicit none integer, parameter integer integer(kind= MPI_OFFSET_KIND ) integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 i,rang,descripteur,code,nb_octets_entier position_fichier valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) valeurs(:)= (/(i+rang*100,i=1,nb_valeurs)/) print *, "criture processus",rang, ":",valeurs(:) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_WRONLY + MPI_MODE_CREATE , & MPI_INFO_NULL ,descripteur,code) call MPI_TYPE_SIZE ( MPI_INTEGER ,nb_octets_entier,code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_WRITE_AT (descripteur,position_fichier,valeurs,nb_valeurs, MPI_INTEGER , & statut,code) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program write_at
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
198/326
9 MPI-IO
Processus 0
10
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1
101 102 103 104 105 106 107 108 109 110
> mpiexec -n 2 write_at criture processus 0 : criture processus 1 : 1, 101, 2, 102, 3, 103, 4, 104, 5, 105, 6, 106, 7, 107, 8, 108, 9, 109, 10 110
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
199/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
program read_at use mpi implicit none integer, parameter integer integer(kind= MPI_OFFSET_KIND ) integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 rang,descripteur,code,nb_octets_entier position_fichier valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_TYPE_SIZE ( MPI_INTEGER ,nb_octets_entier,code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_READ_AT (descripteur,position_fichier,valeurs,nb_valeurs, MPI_INTEGER , & statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_at
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
200/326
9 MPI-IO
Processus 0
10
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1 101 102 103 104 105 106 107 108 109 110
Figure 48 Exemple dutilisation de MPI_FILE_READ_AT()
> mpiexec -n 2 read_at Lecture processus 0 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Lecture processus 1 : 101, 102, 103, 104, 105, 106, 107, 108, 109, 110
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
201/326
9 MPI-IO
9 MPI-IO
Dans ces cas-ci, un pointeur individuel est gr par le systme, et ceci par chier et par processus. Pour un processus donn, deux accs successifs au mme chier permettent donc daccder automatiquement aux lments conscutifs de celui-ci. Dans tous ces sous-programmes, les pointeurs partags ne sont jamais accds ou modis. Aprs chaque accs, le pointeur est positionn sur le type lmentaire de donne suivant. Le chier ne doit pas avoir t ouvert avec lattribut MPI_MODE_SEQUENTIAL.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
202/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
program read01 use mpi implicit none integer, parameter integer integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang,descripteur,code valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_READ (descripteur,valeurs,6, MPI_INTEGER ,statut,code) call MPI_FILE_READ (descripteur,valeurs(7),4, MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read01
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
203/326
9 MPI-IO
Processus 0 1
9 10
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 1
9 10
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
204/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
program read02 use mpi implicit none integer, parameter integer integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang,descripteur,code valeurs=0 statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) if (rang == 0) then call MPI_FILE_READ (descripteur,valeurs,5, MPI_INTEGER ,statut,code) else call MPI_FILE_READ (descripteur,valeurs,8, MPI_INTEGER ,statut,code) call MPI_FILE_READ (descripteur,valeurs,5, MPI_INTEGER ,statut,code) end if print *, "Lecture processus",rang,":",valeurs(1:8) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read02
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
205/326
9 MPI-IO
1 Processus 0 0
2 0
3 0
4 0
5 0
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 1
> mpiexec -n 2 read02 Lecture processus 0 : Lecture processus 1 : 1, 9, 2, 3, 4, 5, 10, 101, 102, 103, 0, 6, 0, 7, 0 8
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
206/326
9 MPI-IO
9 MPI-IO
Il existe un et un seul pointeur partag par chier, commun tous les processus du communicateur dans lequel le chier a t ouvert. Tous les processus qui font une opration dentre-sortie utilisant le pointeur partag doivent employer pour ce faire la mme vue du chier. Si on utilise les variantes non collectives des sous-programmes, lordre de lecture nest pas dterministe. Si le traitement doit tre dterministe, il faut explicitement grer lordonnancement des processus ou utiliser les variantes collectives. Aprs chaque accs, le pointeur est positionn sur le type lmentaire de donne suivant. Dans tous ces sous-programmes, les pointeurs individuels ne sont jamais accds ou modis.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
207/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
program read_shared01 use mpi implicit none integer integer, parameter integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: rang,descripteur,code nb_valeurs=10 valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_READ_SHARED (descripteur,valeurs,4, MPI_INTEGER ,statut,code) call MPI_FILE_READ_SHARED (descripteur,valeurs(5),6, MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_shared01
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
208/326
9 MPI-IO
101 102 103 104 105 106 107 108 109 110
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 1
9 10
> mpiexec -n 2 read_shared01 Lecture processus Lecture processus 1 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 0 : 101, 102, 103, 104, 105, 106, 107, 108, 109, 110
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
209/326
9 MPI-IO
9 MPI-IO
Tous les processus du communicateur au sein duquel un chier est ouvert participent aux oprations collectives daccs aux donnes. Les oprations collectives sont gnralement plus performantes que les oprations individuelles, parce quelles autorisent davantage de techniques doptimisation mises en uvre automatiquement (comme les accs en deux phases voir le paragraphe 2). Dans les oprations collectives, les accs sont eectus dans lordre des rangs des processus. Le traitement est donc dans ce cas dterministe.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
210/326
9 MPI-IO
9 MPI-IO
9.5 Lectures/critures collectives 9.5.1 Via des dplacements explicites program read_at_all use mpi implicit none integer, parameter integer integer(kind= MPI_OFFSET_KIND ) integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 rang,descripteur,code,nb_octets_entier position_fichier valeurs statut
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_TYPE_SIZE ( MPI_INTEGER ,nb_octets_entier,code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_READ_AT_ALL (descripteur,position_fichier,valeurs,nb_valeurs, & MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_at_all
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
211/326
9 MPI-IO
Processus 0
10
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1 101 102 103 104 105 106 107 108 109 110
Figure 52 Exemple dutilisation de MPI_FILE_READ_AT_ALL()
> mpiexec -n 2 read_at_all Lecture processus 0 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Lecture processus 1 : 101, 102, 103, 104, 105, 106, 107, 108, 109, 110
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
212/326
9 MPI-IO
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program read_all01 use mpi implicit none integer integer, parameter integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: rang,descripteur,code nb_valeurs=10 valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_READ_ALL (descripteur,valeurs,4, MPI_INTEGER ,statut,code) call MPI_FILE_READ_ALL (descripteur,valeurs(5),6, MPI_INTEGER ,statut,code) print *, "Lecture processus ",rang, ":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_all01
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
213/326
9 MPI-IO
Processus 0 1
9 10
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 1
9 10
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
214/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
program read_all02 use mpi implicit none integer, parameter integer integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang,descripteur,indice1,indice2,code valeurs=0 statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) if (rang == 0) then indice1=3 indice2=6 else indice1=5 indice2=9 end if call MPI_FILE_READ_ALL (descripteur,valeurs(indice1),indice2-indice1+1, & MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_all02
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
215/326
9 MPI-IO
Processus 0
1 0
2 0
3 0
4 0
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1
1 0
2 0
3 0
4 0
5 0
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
216/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
program read_all03 use mpi implicit none integer, parameter integer integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang,descripteur,code valeurs=0 statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) if (rang == 0) then call MPI_FILE_READ_ALL (descripteur,valeurs(3),4, MPI_INTEGER ,statut,code) else call MPI_FILE_READ_ALL (descripteur,valeurs(5),5, MPI_INTEGER ,statut,code) end if print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_all03
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
217/326
9 MPI-IO
Processus 0
1 0
2 0
3 0
4 0
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1
1 0
2 0
3 0
4 0
5 0
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
218/326
9 MPI-IO
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program read_ordered use mpi implicit none integer integer, parameter integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: rang,descripteur,code nb_valeurs=10 valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_READ_ORDERED (descripteur,valeurs,4, MPI_INTEGER ,statut,code) call MPI_FILE_READ_ORDERED (descripteur,valeurs(5),6, MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_ordered
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
219/326
9 MPI-IO
Processus 0 1
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 5
> mpiexec -n 2 read_ordered Lecture processus 1 : 5, 6, 7, 8, 105, 106, 107, 108, 109, 110 Lecture processus 0 : 1, 2, 3, 4, 9, 10, 101, 102, 103, 104
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
220/326
9 MPI-IO
Les sous-programmes MPI_FILE_GET_POSITION() et MPI_FILE_GET_POSITION_SHARED() permettent de connatre respectivement la valeur courante des pointeurs individuels et celle du pointeur partag. Il est possible de positionner explicitement les pointeurs individuels laide du sous-programme MPI_FILE_SEEK(), et de mme le pointeur partag avec le sous-programme MPI_FILE_SEEK_SHARED(). Il y a trois modes possibles pour xer la valeur dun pointeur : MPI_SEEK_SET xe une valeur absolue ; MPI_SEEK_CUR xe une valeur relative ; MPI_SEEK_END positionne le pointeur la n du chier, laquelle un dplacement ventuel est ajout.
Avec MPI_SEEK_CUR, on peut spcier une valeur ngative, ce qui permet de revenir en arrire dans le chier.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
221/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
program seek use mpi implicit none integer, parameter integer integer(kind= MPI_OFFSET_KIND ) integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE )
:: :: :: :: ::
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_READ (descripteur,valeurs,3, MPI_INTEGER ,statut,code) call MPI_TYPE_SIZE ( MPI_INTEGER ,nb_octets_entier,code) position_fichier=8*nb_octets_entier call MPI_FILE_SEEK (descripteur,position_fichier, MPI_SEEK_CUR ,code) call MPI_FILE_READ (descripteur,valeurs(4),3, MPI_INTEGER ,statut,code) position_fichier=4*nb_octets_entier call MPI_FILE_SEEK (descripteur,position_fichier, MPI_SEEK_SET ,code) call MPI_FILE_READ (descripteur,valeurs(7),4, MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program seek
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
222/326
Processus 0
3 102103104
3 102103104 5
Fichier
10
101 102 103 104 105 106 107 108 109 110
Processus 1
3 102103104
3 102103104 5
> mpiexec -n 2 seek Lecture processus 1 : 1, 2, 3, 102, 103, 104, 5, 6, 7, 8 Lecture processus 0 : 1, 2, 3, 102, 103, 104, 5, 6, 7, 8
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
223/326
9 MPI-IO
9 MPI-IO
Les vues sont un mcanisme souple et puissant pour dcrire les zones accdes dans les chiers. Les vues sont construites laide de types drivs MPI Chaque processus a sa propre vue (ou ses propres vues) dun chier, dnie par trois variables : un dplacement initial, un type lmentaire de donnes et un motif . Une vue est dnie comme rptition du motif, une fois le positionnement initial eectu. Il est possible de dnir des trous dans une vue, de faon ne pas tenir compte de certaines parties des donnes. Des processus dirents peuvent parfaitement avoir des vues direntes du chier, de faon accder des parties complmentaires de celui-ci. Un processus donn peut dnir et utiliser plusieurs vues direntes du mme chier. Un pointeur partag nest utilisable avec une vue que si tous les processus ont la mme vue.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
224/326
9 MPI-IO
Si le chier est ouvert en criture, les zones dcrites par les types lmentaires et les motifs ne peuvent se recouvrir, mme partiellement. La vue par dfaut consiste en une simple suite doctets (dplacement initial nul, type_lm et motif gaux MPI_BYTE). type_lm motif trous chier dplacement initial donnes accessibles
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
225/326
9 MPI-IO
type_lm motif proc. 0 motif proc. 1 motif proc. 2 chier dplacement initial
Figure 59 Exemple de dnition de motifs dirents selon les processus
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
226/326
9 MPI-IO
MPI_INTEGER
1 2 3 4 5 6 7 8 9 10 11 12 13
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
227/326
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
9 MPI-IO
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) deplacements(1)=1 deplacements(2)=4 longueurs(1)=2 longueurs(2)=1 call call call call MPI_TYPE_INDEXED (2,longueurs,deplacements, MPI_INTEGER ,motif_temp,code) MPI_TYPE_GET_EXTENT (motif_temp,borne_inf,taille,code) MPI_TYPE_CREATE_RESIZED (motif_temp,borne_inf_zero,borne_inf+taille,motif,code) MPI_TYPE_COMMIT (motif,code)
! Ne pas omettre de passer par une variable intermdiaire de reprsentation ! MPI_OFFSET_KIND, pour des raisons de portabilit deplacement_initial=0 call MPI_FILE_SET_VIEW (descripteur,deplacement_initial, MPI_INTEGER ,motif, & "native", MPI_INFO_NULL ,code) call MPI_FILE_READ (descripteur,valeurs,7, MPI_INTEGER ,statut,code) call MPI_FILE_READ (descripteur,valeurs(8),3, MPI_INTEGER ,statut,code) print *,"Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_view01
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
228/326
9 MPI-IO
Processus 0 2
8 10 102
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 2
8 10 102
> mpiexec -n 2 read_view01 Lecture processus 1 : 2, 3, 5, 7, 8, 10, 102, 103, 105, 107 Lecture processus 0 : 2, 3, 5, 7, 8, 10, 102, 103, 105, 107
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
229/326
9 MPI-IO
0 MPI_INTEGER
1 2 3 4 5 6 7 8 9 10
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
230/326
9 MPI-IO
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) if (rang == 0) then coord=1 else coord=3 end if call MPI_TYPE_CREATE_SUBARRAY (1,(/4/),(/2/),(/coord - 1/), & MPI_ORDER_FORTRAN , MPI_INTEGER ,motif,code) call MPI_TYPE_COMMIT (motif,code) deplacement_initial=0 call MPI_FILE_SET_VIEW (descripteur,deplacement_initial, MPI_INTEGER ,motif, & "native", MPI_INFO_NULL ,code) call MPI_FILE_READ (descripteur,valeurs,nb_valeurs, MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_view02
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
231/326
9 MPI-IO
Processus 0
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1
> mpiexec -n 2 read_view02 Lecture processus 1 : 3, 4, 7, 8, 101, 102, 105, 106, 109, 110 Lecture processus 0 : 1, 2, 5, 6, 9, 10, 103, 104, 107, 108
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
232/326
9 MPI-IO
program read_view03 use mpi implicit none integer, parameter integer :: nb_valeurs=10 :: rang,descripteur,code, & motif_1,motif_2,motif_3,nb_octets_entier integer(kind= MPI_OFFSET_KIND ) :: deplacement_initial integer, dimension(nb_valeurs) :: valeurs integer, dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code)
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
233/326
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
9 MPI-IO
call MPI_TYPE_CREATE_SUBARRAY (1,(/4/),(/2/),(/0/), & MPI_ORDER_FORTRAN , MPI_INTEGER ,motif_1,code) call MPI_TYPE_COMMIT (motif_1,code) call MPI_TYPE_CREATE_SUBARRAY (1,(/4/),(/2/),(/2/), & MPI_ORDER_FORTRAN , MPI_INTEGER ,motif_2,code) call MPI_TYPE_COMMIT (motif_2,code) call MPI_TYPE_CREATE_SUBARRAY (1,(/4/),(/1/),(/3/), & MPI_ORDER_FORTRAN , MPI_INTEGER ,motif_3,code) call MPI_TYPE_COMMIT (motif_3,code) deplacement_initial=0 call MPI_FILE_SET_VIEW (descripteur,deplacement_initial, MPI_INTEGER ,motif_1, & "native", MPI_INFO_NULL ,code) call MPI_FILE_READ (descripteur,valeurs,4, MPI_INTEGER ,statut,code) call MPI_FILE_SET_VIEW (descripteur,deplacement_initial, MPI_INTEGER ,motif_2, & "native", MPI_INFO_NULL ,code) call MPI_FILE_READ (descripteur,valeurs(5),3, MPI_INTEGER ,statut,code) call MPI_TYPE_SIZE ( MPI_INTEGER ,nb_octets_entier,code) deplacement_initial=2*nb_octets_entier call MPI_FILE_SET_VIEW (descripteur,deplacement_initial, MPI_INTEGER ,motif_3, & "native", MPI_INFO_NULL ,code) call MPI_FILE_READ (descripteur,valeurs(8),3, MPI_INTEGER ,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_view03
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
234/326
9 MPI-IO
Processus 0 1 2 5 6
1 2 5 6 3 4 7
1 2 5 6 3 4 7 6 10104
Fichier
9 10 101 102 103 104 105 106 107 108 109 110
Processus 1 1 2 5 6
1 2 5 6 3 4 7
1 2 5 6 3 4 7 6 10104
> mpiexec -n 2 read_view03 Lecture processus 1 : 1, 2, 5, 6, 3, 4, 7, 6, 10, 104 Lecture processus 0 : 1, 2, 5, 6, 3, 4, 7, 6, 10, 104
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
235/326
9 MPI-IO
9 MPI-IO
Les entres-sorties non bloquantes sont implmentes suivant le modle utilis pour les communications non bloquantes. Un accs non-bloquant doit donner lieu ultrieurement un test explicite de compltude ou une mise en attente (via MPI_TEST(), MPI_WAIT(), etc.), de faon similaire la gestion des messages non bloquants. Lintrt est de faire un recouvrement entre les calculs et les entres-sorties.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
236/326
9 MPI-IO
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14
program iread_at use mpi implicit none integer, parameter integer :: nb_valeurs=10 :: i,nb_iterations=0,rang,nb_octets_entier, & descripteur,requete,code integer(kind= MPI_OFFSET_KIND ) :: position_fichier integer, dimension(nb_valeurs) :: valeurs integer, dimension( MPI_STATUS_SIZE ) :: statut logical :: termine call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
237/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_TYPE_SIZE ( MPI_INTEGER ,nb_octets_entier,code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_IREAD_AT (descripteur,position_fichier,valeurs,nb_valeurs, & MPI_INTEGER ,requete,code) do while (nb_iterations < 5000) nb_iterations=nb_iterations+1 ! Calculs recouvrant le temps demand par lopration de lecture ... call MPI_TEST (requete,termine,statut,code) if (termine) exit end do print *,"Aprs",nb_iterations,"iterations, lecture processus",rang,":",valeurs call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program iread_at
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
238/326
9 MPI-IO
Processus 0
10
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1 101 102 103 104 105 106 107 108 109 110
Figure 66 Exemple dutilisation de MPI_FILE_IREAD_AT()
> mpiexec -n 2 iread_at Aprs 1 iterations, lecture processus 0 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Aprs 1 iterations, lecture processus 1 : 101, 102, 103, 104, 105, 106, 107, 108, 109, 110
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
239/326
9 MPI-IO
9 MPI-IO
9.8 Lectures/critures non bloquantes 9.8.2 Via des dplacements implicites individuels
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
program iread use mpi implicit none integer, parameter integer integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang,descripteur,requete,code valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_IREAD (descripteur,valeurs,nb_valeurs, MPI_INTEGER ,requete,code) ! Calcul recouvrant le temps demand par lopration de lecture ... call MPI_WAIT (requete,statut,code) print *, "Lecture processus",rang,":",valeurs(:) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program iread
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
240/326
9 MPI-IO
Processus 0
10
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1
10
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
241/326
9 MPI-IO
Il est possible deectuer des oprations qui soient la fois collectives et non bloquantes, via une forme particulire dopration collective non bloquante. Celle-ci ncessite un appel deux sous-programmes distincts, lun pour dclencher lopration et lautre pour la terminer. On ne peut modier la zone mmoire concerne entre les deux phases de lopration. Nanmoins, il est possible pendant ce temps de faire des oprations non collectives sur le chier. Il ne peut y avoir quune seule telle opration en cours la fois par processus.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
242/326
9 MPI-IO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
program read_ordered_begin_end use mpi implicit none integer integer, parameter integer, dimension(nb_valeurs) integer, dimension( MPI_STATUS_SIZE ) :: :: :: :: rang,descripteur,code nb_valeurs=10 valeurs statut
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"donnees.dat", MPI_MODE_RDONLY , MPI_INFO_NULL , & descripteur,code) call MPI_FILE_READ_ORDERED_BEGIN (descripteur,valeurs,4, MPI_INTEGER ,code) print *, "Processus numro :",rang call MPI_FILE_READ_ORDERED_END (descripteur,valeurs,statut,code) print *, "Lecture processus",rang,":",valeurs(1:4) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program read_ordered_begin_end
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
243/326
9 MPI-IO
Processus 0
Fichier
10 101 102 103 104 105 106 107 108 109 110
Processus 1
> mpiexec -n 2 read_ordered_begin_end Processus numro : 0 Lecture processus 0 : 1, 2, 3, 4 Processus numro : 1 Lecture processus 1 : 5, 6, 7, 8
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
244/326
9 MPI-IO
9.9 Conseils
9 MPI-IO
9.9 Conseils
Comme on a pu le voir, MPI-IO ore un ensemble trs riche de fonctionnalits, en mme temps quune interface de haut niveau. Celle-ci, tout en restant portable, permet la fois de masquer aux utilisateurs des oprations complexes et dimplmenter de faon transparente des optimisations particulires aux machines cibles. Certains choix semblent clairement conseiller : lorsque les oprations font intervenir tous les processus, ou un ensemble dentre eux qui peuvent tre dnis dans un communicateur particulier, il faut gnralement privilgier la forme collective des oprations ; lutilisation des sous-programmes positionnement explicite dans les chiers ne sont employer que dans des cas particuliers, lutilisation implicite de pointeurs individuels ou partags orant une interface de plus haut niveau ; exactement comme pour le traitement des messages lorsque ceux-ci reprsentent une part importante de lapplication, le non-bloquant est une voie privilgie doptimisation mettre en uvre par les programmeurs, mais ceci ne doit tre implment quaprs quon se soit assur du comportement correct de lapplication en mode bloquant.
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
245/326
10 Conclusion
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
246/326
10 Conclusion
10 Conclusion
Utiliser les communications point--point bloquantes, ceci avant de passer aux communications non-bloquantes. Il faudra alors essayer de faire du recouvrement calcul/communications. Utiliser les fonctions dentres-sorties bloquantes, ceci avant de passer aux entres-sorties non-bloquantes. De mme, il faudra alors faire du recouvrement calcul/entres-sorties. crire les communications comme si les envois taient synchrones (MPI_SSEND()). viter les barrires de synchronisation (MPI_BARRIER()), surtout sur les fonctions collectives qui sont bloquantes. La programmation mixte MPI/OpenMP peut apporter des gains dextensibilit, mais pour que cette approche fonctionne bien, il est videmment ncessaire davoir de bonnes performances OpenMP lintrieur de chaque processus MPI. Un cours est dispens lIDRIS (https://cours.idris.fr/).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
247/326
11 Annexes
1 Introduction 2 Environnement 3 Communications point point 4 5 6 7 Communications collectives Copies de mmoire mmoire Types de donnes drivs Optimisations
8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 11.1 Communications collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 11.2 Types de donnes drivs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11.2.1 Distribution dun tableau sur plusieurs processus . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11.2.2 Types drivs numriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .264 11.3 Optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 11.4 Communicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 11.4.1 Intra et intercommunicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 11.4.2 Graphe de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 11.5 Gestion de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 11.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 11.5.2 Mode matre-ouvriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 11.5.3 Mode client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 11.5.4 Suppression de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 11.5.5 Complments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 11.6 MPI-IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .MPI. . . Version. . . . .. . . . . . 2012 . . . . . . . . . 4.1 Avril 313
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
248/326
11 Annexes
11 Annexes
Il sagit ici de programmes concernant direntes fonctionnalits de MPI qui sont : moins frquentes dutilisation (cration de sa propre opration de rduction, type drivs spciques, topologie de type graphe, communications persistantes) ; qui ne sont pas disponibles sur lensemble des machines (gestion dynamique de processus, mode client serveur).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
249/326
11 Annexes
11 Annexes
Dans cet exemple, on se propose de crer sa propre opration de rduction, produit de vecteurs de nombres complexes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
program ma_reduction use mpi implicit none integer :: rang,code,i, mon_operation integer, parameter :: n=4 complex, dimension(n) :: a,resultat external mon_produit call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation du vecteur A sur chaque processus a(:) = (/ (cmplx(rang+i,rang+i+1),i=1,n) /) ! Cration de lopration commutative mon_operation call MPI_OP_CREATE (mon_produit,.true., mon_operation ,code) ! Collecte sur le processus 0 du produit global call MPI_REDUCE (a,resultat,n, MPI_COMPLEX , mon_operation ,0, MPI_COMM_WORLD ,code) ! Affichage du rsultat if (rang == 0) then print *,Valeur du produit,resultat end if call MPI_FINALIZE (code) end program ma_reduction
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
250/326
11 Annexes
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
! Dfinition du produit terme terme de deux vecteurs de nombres complexes integer function mon_produit(vecteur1,vecteur2,longueur,type_donnee) result(inutilise) implicit none complex,dimension(longueur) :: vecteur1,vecteur2 integer :: longueur,type_donnee,i do i=1,longueur vecteur2(i) = cmplx(real(vecteur1(i))*real(vecteur2(i)) - & aimag(vecteur1(i))*aimag(vecteur2(i)), & real(vecteur1(i))*aimag(vecteur2(i)) + & aimag(vecteur1(i))*real(vecteur2(i))) end do inutilise=0 end function mon_produit
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
251/326
11 Annexes
11 Annexes
11.2 Types de donnes drivs 11.2.1 Distribution dun tableau sur plusieurs processus
Le sous-programme MPI_TYPE_CREATE_DARRAY() permet de gnrer un tableau sur un ensemble de processus suivant une distribution par blocs ou cyclique.
integer,intent(in) :: nb_procs,rang,nb_dims integer,dimension(nb_dims),intent(in) :: profil_tab,mode_distribution integer,dimension(nb_dims),intent(in) :: profil_sous_tab,distribution_procs integer,intent(in) :: ordre,ancien_type integer,intent(out) :: nouveau_type,code call MPI_TYPE_CREATE_DARRAY (nb_procs,rang,nb_dims,profil_tab,mode_distribution, profil_sous_tab,distribution_procs,ordre,ancien_type, nouveau_type,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
252/326
11 Annexes
nb_dims : rang du tableau nb_procs : nombre total de processus rang : rang de chaque processus prol_tab : prol du tableau distribuer mode_distribution : mode de distribution dans chaque dimension du tableau, soit : 1 MPI_DISTRIBUTE_BLOCK indique une distribution par blocs 2 MPI_DISTRIBUTE_CYCLIC indique une distribution cyclique 3 MPI_DISTRIBUTE_NONE indique quil ny a pas de distribution prol_sous_tab : prol dun bloc distribution_procs : nombre de processus dans chaque dimension
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
253/326
11 Annexes
Quelques remarques : lordre des processus est le mme que pour les topologies ; pour que lappel au sous-programme soit correct, on doit avoir nb_dims nb_procs = i=1 distribution_procs(i) ; lorsquune dimension i est distribue par blocs, via le paramtre MPI_DISTRIBUTE_BLOCK, la rgle suivante doit tre respecte profil_sous_tab(i) * distribution_procs(i) profil_tab(i) ; lorsquune dimension i nest pas distribue, via le paramtre MPI_DISTRIBUTE_NONE, le nombre de processus choisi dans cette dimension doit valoir 1 (distribution_procs(i) = 1) et le prol du bloc dans cette dimension (profil_sous_tab(i)) est ignor.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
254/326
11 Annexes
1 11 1 11 0 00 0 00 1 11 1 11 0 00 0 00 11 00 1 11 1 11 0 00 0 00 11 00
1 11 0 00 1 11 0 00 1 11 0 00 1 11 0 00 1 11 0 00
11 00 11 00 11 00
11 00
Processus 0 Processus 1
11 11 00 00 Processus 2 11 11 00 00 11 00 11 00 11 00 Processus3 11 11 00 00 11 00 11 00
Figure 69 Dnition du type driv sur chaque processus pour une distribution par blocs
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
255/326
11 Annexes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
program darray_bloc use mpi implicit none integer,parameter :: nb_lignes=4,nb_colonnes=6, & nb_dims=2,etiquette1=1000,etiquette2=1001 integer :: nb_procs,code,rang,i,type_bloc integer,dimension(nb_lignes,nb_colonnes) :: tab integer,dimension(nb_dims) :: profil_tab,mode_distribution, & profil_sous_tab,distribution_procs integer,dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation du tableau tab sur chaque processus tab(:,:)=reshape((/(i*(rang+1),i=1,nb_lignes*nb_colonnes)/),(/nb_lignes,nb_colonnes/)) ! Profil du tableau tab profil_tab(:) = shape(tab) ! Mode de distribution mode_distribution(:) = (/ MPI_DISTRIBUTE_BLOCK , MPI_DISTRIBUTE_BLOCK /) ! Profil dun bloc profil_sous_tab(:) = (/ 2,3 /)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
256/326
11 Annexes
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
! Nombre de processus dans chaque dimension distribution_procs(:) = (/ 2,2 /) ! Cration du type driv type_bloc call MPI_TYPE_CREATE_DARRAY (nb_procs,rang,nb_dims,profil_tab,mode_distribution, & profil_sous_tab, distribution_procs, MPI_ORDER_FORTRAN , & MPI_INTEGER ,type_bloc,code) call MPI_TYPE_COMMIT (type_bloc,code) select case(rang) case(0) ! Le processus 0 envoie son tableau tab au processus 1 call MPI_SEND (tab,1,type_bloc,1,etiquette1, MPI_COMM_WORLD ,code) case(1) ! Le processus 1 reoit son tableau tab du processeur 0 call MPI_RECV (tab,1,type_bloc,0,etiquette1, MPI_COMM_WORLD ,statut,code) case(2) ! Le processus 2 envoie son tableau tab au processus 3 call MPI_SEND (tab,1,type_bloc,3,etiquette2, MPI_COMM_WORLD ,code) case(3) ! Le processus 3 reoit son tableau tab du processeur 2 call MPI_RECV (tab,1,type_bloc,2,etiquette2, MPI_COMM_WORLD ,statut,code) end select ! Affichage du tableau tab sur chaque processus ....................................... call MPI_TYPE_FREE (type_bloc,code) call MPI_FINALIZE (code) end program darray_bloc
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
257/326
11 Annexes
> mpiexec -n 4 darray_bloc Tableau tab obtenu sur le 1, 5, 9, 13, 17, 2, 6, 10, 14, 18, 3, 7, 11, 15, 19, 4, 8, 12, 16, 20, Tableau tab obtenu sur le 3, 15, 27, 39, 51, 6, 18, 30, 42, 54, 9, 21, 33, 45, 57, 12, 24, 36, 48, 60, processus 0 21 22 23 24 processus 2 63 66 69 72 Tableau tab obtenu sur le 2, 10, 18, 1, 5, 4, 12, 20, 2, 6, 6, 14, 22, 30, 38, 8, 16, 24, 32, 40, Tableau tab obtenu sur le 4, 20, 36, 52, 68, 8, 24, 40, 56, 72, 12, 28, 44, 9, 21, 16, 32, 48, 12, 24, processus 1 9 10 46 48 processus 3 84 88 33 36
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
258/326
11 Annexes
1 11 0 00 1 11 0 00 1 11 0 00 1 11 0 00
1 0 1 0 1 0 1 0 1 0
1 0 1 0 1 0
11 1 00 0 11 1 00 0 11 1 00 0 11 1 00 0
1 0 1 0
11 00 11 00 11 00 1 0 1 0 1 0 11 00 11 00
11 00 11 00
11 11 00 00 11 11 11 11 00 00 00 00 11 11 11 11 00 00 00 00
Figure 70 Dnition du type driv sur chaque processus pour une distribution cyclique
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
259/326
11 Annexes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
program darray_cyclique use mpi implicit none integer,parameter :: nb_lignes=4,nb_colonnes=6, & nb_dims=2,etiquette1=1000,etiquette2=1001 integer :: nb_procs,code,rang,i,type_cyclique integer,dimension(nb_lignes,nb_colonnes) :: tab integer,dimension(nb_dims) :: profil_tab,mode_distribution, & profil_sous_tab,distribution_procs integer,dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_procs,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) ! Initialisation du tableau tab sur chaque processus tab(:,:)=reshape((/(i*(rang+1),i=1,nb_lignes*nb_colonnes)/),(/nb_lignes,nb_colonnes/)) ! Profil du tableau tab profil_tab(:) = shape(tab) ! Mode de distribution mode_distribution(:) = (/ MPI_DISTRIBUTE_CYCLIC , MPI_DISTRIBUTE_CYCLIC /) ! Profil dun bloc profil_sous_tab(:) = (/ 1,2 /)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
260/326
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
11 Annexes
! Nombre de processus dans chaque dimension distribution_procs(:) = (/ 2,2 /) ! Cration du type driv type_cyclique call MPI_TYPE_CREATE_DARRAY (nb_procs,rang,nb_dims,profil_tab,mode_distribution, & profil_sous_tab, distribution_procs, MPI_ORDER_FORTRAN , & MPI_INTEGER ,type_cyclique,code) call MPI_TYPE_COMMIT (type_cyclique,code) select case(rang) case(0) ! Le processus 0 envoie son tableau tab au processus 2 call MPI_SEND (tab,1,type_cyclique,2,etiquette1, MPI_COMM_WORLD ,code) case(2) ! Le processus 2 reoit son tableau tab du processus 0 call MPI_RECV (tab,1,type_cyclique,0,etiquette1, MPI_COMM_WORLD ,statut,code) case(1) ! Le processus 1 envoie son tableau tab au processus 3 call MPI_SEND (tab,1,type_cyclique,3,etiquette2, MPI_COMM_WORLD ,code) case(3) ! Le processus 3 reoit son tableau tab du processus 1 call MPI_RECV (tab,1,type_cyclique,1,etiquette2, MPI_COMM_WORLD ,statut,code) end select ! Affichage du tableau tab sur chaque processus ....................................... call MPI_TYPE_FREE (type_cyclique,code) call MPI_FINALIZE (code) end program darray_cyclique
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
261/326
11 Annexes
> mpiexec -n 4 darray_cyclique Tableau tab obtenu sur le 1, 5, 9, 13, 17, 2, 6, 10, 14, 18, 3, 7, 11, 15, 19, 4, 8, 12, 16, 20, Tableau tab obtenu sur le 3, 15, 27, 39, 51, 1, 5, 30, 42, 17, 9, 21, 33, 45, 57, 3, 7, 36, 48, 19, processus 0 21 22 23 24 processus 2 63 21 69 23 Tableau tab obtenu sur le 2, 10, 18, 26, 34, 4, 12, 20, 28, 36, 6, 14, 22, 30, 38, 8, 16, 24, 32, 40, Tableau tab obtenu sur le 4, 20, 36, 52, 68, 8, 24, 18, 26, 72, 12, 28, 44, 60, 76, 16, 32, 22, 30, 80, processus 1 42 44 46 48 processus 3 84 88 92 96
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
262/326
11 Annexes
Autres exemples
nb_procs = 4, distribution_procs(:) = (/ 2,2 /) profil_tab(:) = (/ 4,3 /), profil_sous_tab(:) = (/ 2,2 /) mode_distribution(:)=(/MPI_DISTRIBUTE_BLOCK,MPI_DISTRIBUTE_BLOCK/)
11 11 00 00 11 11 00 00 11 11 00 00 11 11 00 00
1 0 1 0 1 0 1 0 1 0 1 0
1 0
1 0 1 0 1 0 1 0 111 000 111 000 111 000
1 0 1 11 11 0 00 00 1 11 11 0 00 00 11 00 1 0 1 11 0 00 1 0 1 11 0 00 1 0 1 11 0 00
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
263/326
11 Annexes
1 11 1100 1 0 00 00 11 0
1 11 11 0 00 00 1 11 11 0 00 00 1 0 1 0 1 0 1 0 1 0 1 0 11 00 11 11 11 11 00 00 00 00 11 11 11 11 00 00 00 00
11 00
11 00 11 00 11 00 11 00 11 00
1 0 1 0 1 0 Figure
1 11 1 1 1 0 00 0 0 0
11 11 00 00 1 0 11 11 00 00 1 0 11 11 00 00 1 0 72 Dnition du
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
264/326
11 Annexes
11 Annexes
Le langage Fortran 95 introduit deux fonctions intrinsques selected_int_kind() et selected_real_kind() qui permettent de dnir la prcision et/ou ltendue dun nombre entier, rel ou complexe MPI devait donc assurer la portabilit de ces types de donnes en dnissant essentiellement les sous-programmes suivants : MPI_TYPE_CREATE_F90_INTEGER(), MPI_TYPE_CREATE_F90_REAL() et MPI_TYPE_CREATE_F90_COMPLEX() Ces sous-programmes renvoient des types drivs MPI
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
265/326
11 Annexes
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
266/326
11 Annexes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
program precision use mpi implicit none integer, parameter integer ! Le sous-type k reprsentera integer, parameter complex( kind=k ), dimension(n)
:: n=101, preci=12 :: rang, mon_complex, code une prcision dau moins 12 chiffres significatifs :: k=selected_real_kind(preci) :: donnee
call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD , rang, code) ! Construction du type MPI mon_complex associ la prcision demande call MPI_TYPE_CREATE_F90_COMPLEX (preci, MPI_UNDEFINED , mon_complex , code) if (rang == 0) donnee(:) = cmplx(rang, rang, kind=k ) ! Utilisation du type mon_complex call MPI_BCAST (donnee, n, mon_complex, 0, MPI_COMM_WORLD , code) call MPI_FINALIZE (code) end program precision
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
267/326
11 Annexes
Remarques
En ralit, les types gnrs par ces sous-programmes sont prdnis par MPI Par consquent, ils ne peuvent pas tre librs avec MPI_TYPE_FREE() De plus, il nest pas ncessaire de les valider avec MPI_TYPE_COMMIT()
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
268/326
11 Annexes
11.3 Optimisations
11 Annexes
11.3 Optimisations
Dans un programme, il arrive parfois que lon soit contraint de boucler un certain nombre de fois sur un envoi et une rception de message o la valeur des donnes manipules change mais pas leurs adresses en mmoire ni leurs nombres ni leurs types. En outre, lappel un sous-programme de communication chaque itration peut tre trs pnalisant la longue do lintrt des communications persistantes. Elles consistent : crer un schma persistant de communication une fois pour toutes ( lextrieur de la boucle) ; activer rellement la requte denvoi ou de rception dans la boucle ; librer, si ncessaire, la requte en n de boucle. envoi standard envoi synchroneous envoi buered rception standard
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
269/326
11 Annexes
11.3 Optimisations
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
if (rang == 0) then do k = 1, 1000 call MPI_ISSEND (c,m*m, MPI_REAL ,1,etiquette, MPI_COMM_WORLD ,requete0,code) call sgetrf(na, na, a, na, pivota, code) call MPI_WAIT (requete0,statut,code) c(1:nb,1:nb) = matmul(a(1:nb,1:nb),b) end do elseif (rang == 1) then do k = 1, 1000 call sgetrf(na, na, a, na, pivota, code) call MPI_IRECV (c,m*m, MPI_REAL ,0,etiquette, MPI_COMM_WORLD ,requete1,code) call sgetrf(nb, nb, b, nb, pivotb, code) call MPI_WAIT (requete1,statut,code) a(:,:) = transpose(c(1:na,1:na)) + a(:,:) end do end if > mpiexec -n 2 AOptimiser Temps : 235 secondes
Lutilisation dun schma persistant de communication permet de cacher la latence et de rduire les surcots induits par chaque appel aux sous-programmes de communication dans la boucle. Le gain peut tre important lorsque ce mode de communication est rellement implment.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
270/326
11 Annexes
11.3 Optimisations
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
if (rang == 0) then call MPI_SSEND_INIT (c,m*m, MPI_REAL ,1,etiquette, MPI_COMM_WORLD ,requete0,code) do k = 1, 1000 call MPI_START (requete0,code) call sgetrf(na, na, a, na, pivota, code) call MPI_WAIT (requete0,statut,code) c(1:nb,1:nb) = matmul(a(1:nb,1:nb),b) end do elseif (rang == 1) then call MPI_RECV_INIT (c,m*m, MPI_REAL ,0,etiquette, MPI_COMM_WORLD ,requete1,code) do k = 1, 1000 call sgetrf(na, na, a, na, pivota, code) call MPI_START (requete1,code) call sgetrf(nb, nb, b, nb, pivotb, code) call MPI_WAIT (requete1,statut,code) a(:,:) = transpose(c(1:na,1:na)) + a(:,:) end do end if > mpiexec -n 2 AOptimiser Temps : 235 secondes
Ici, limplmentation MPI et/ou linfrastructure matrielle de la machine ne permettent malheureusement pas une utilisation ecace du mode persistant.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
271/326
11 Annexes
11.3 Optimisations
Remarques : Une communication active par MPI_START() sur une requte cre par lun des sous-programmes MPI_xxxx_INIT() est quivalente une communication non bloquante MPI_Ixxxx(). Pour rednir un nouveau schma persistant avec la mme requte, il faut auparavant librer celle associe lancien schma en appelant le sous-programme MPI_REQUEST_FREE(requete,code). Ce sous-programme ne librera la requte requete quune fois que la communication associe sera rellement termine.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
272/326
11 Annexes
11.4 Communicateurs
11 Annexes
Les communicateurs que nous avons construits jusqu prsent sont des intracommunicateurs car ils ne permettent pas que des processus appartenant des communicateurs distincts puissent communiquer entre eux. Des processus appartenant des intracommunicateurs distincts ne peuvent communiquer que sil existe un lien de communication entre ces intracommunicateurs. Un intercommunicateur est un communicateur qui permet ltablissement de ce lien de communication. Le sous-programme MPI MPI_INTERCOMM_CREATE() permet de construire des intercommunicateurs. Le couplage des modles ocan/atmosphre illustre bien lutilit des intra et intercommunicateurs...
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
273/326
11 Annexes
11.4 Communicateurs
11 Annexes
a0 0 d1 3 2 g6
InterComm OceanAtmos...
b0 1 1 e4
2 h7
c0 2
InterComm VisuAtmos...
f1 5
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
274/326
11 Annexes
11.4 Communicateurs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
program OceanAtmosphere use mpi implicit none integer,parameter :: tag1=1111, tag2=2222 integer :: RangMonde, NombreIntraComm, couleur, code, & IntraComm, CommOceanAtmosphere, CommVisuAtmosphere call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,RangMonde,code) ! Construction des 3 IntraCommunicateurs NombreIntraComm = 3 couleur = mod(RangMonde,NombreIntraComm) ! = 0,1,2 call MPI_COMM_SPLIT ( MPI_COMM_WORLD ,couleur,RangMonde,IntraComm,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
275/326
11 Annexes
11.4 Communicateurs
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
! Construction des deux InterCommunicateurs et et appel des sous-programmes de calcul select case(couleur) case(0) ! InterCommunicateur OceanAtmosphere pour que le groupe 0 communique ! avec le groupe 1 call MPI_INTERCOMM_CREATE (IntraComm,0, MPI_COMM_WORLD ,1,tag1,CommOceanAtmosphere, & code) call ocean(IntraComm,CommOceanAtmosphere) case(1) ! InterCommunicateur OceanAtmosphere pour que le groupe 1 communique ! avec le groupe 0 call MPI_INTERCOMM_CREATE (IntraComm,0, MPI_COMM_WORLD ,0,tag1,CommOceanAtmosphere, & code) ! InterCommunicateur CommVisuAtmosphere pour que le groupe 1 communique ! avec le groupe 2 call MPI_INTERCOMM_CREATE (IntraComm,0, MPI_COMM_WORLD ,2,tag2,CommVisuAtmosphere,code) call atmosphere(IntraComm,CommOceanAtmosphere,CommVisuAtmosphere) case(2) ! InterCommunicateur CommVisuAtmosphere pour que le groupe 2 communique ! avec le groupe 1 call MPI_INTERCOMM_CREATE (IntraComm,0, MPI_COMM_WORLD ,1,tag2,CommVisuAtmosphere,code) call visualisation(IntraComm,CommVisuAtmosphere) end select end program OceanAtmosphere
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
276/326
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
11 Annexes
11.4 Communicateurs
subroutine ocean(IntraComm,CommOceanAtmosphere) use mpi implicit none integer,parameter real,dimension(n) integer integer,dimension( MPI_STATUS_SIZE ) integer,intrinsic :: :: :: :: :: n=1024,tag1=3333 a,b,c rang,code,germe(1),IntraComm,CommOceanAtmosphere statut irtc
! Les processus 0, 3, 6 ddis au modle ocanographique effectuent un calcul germe(1)=irtc() call random_seed(put=germe) call random_number(a) call random_number(b) call random_number(c) a(:) = b(:) * c(:) ! Les processus impliqus dans le modle ocan effectuent une opration collective call MPI_ALLREDUCE (a,c,n, MPI_REAL , MPI_SUM ,IntraComm,code) ! Rang du processus dans IntraComm call MPI_COMM_RANK (IntraComm,rang,code) ! change de messages avec les processus associs au modle atmosphrique call MPI_SENDRECV_REPLACE (c,n, MPI_REAL ,rang,tag1,rang,tag1, & CommOceanAtmosphere,statut,code) ! Le modle ocanographique tient compte des valeurs atmosphriques a(:) = b(:) * c(:) end subroutine ocean
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
277/326
11 Annexes
11.4 Communicateurs
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
subroutine atmosphere(IntraComm,CommOceanAtmosphere,CommVisuAtmosphere) use mpi implicit none integer,parameter real,dimension(n) integer :: n=1024,tag1=3333,tag2=4444 :: a,b,c :: rang,code,germe(1),IntraComm, & CommOceanAtmosphere,CommVisuAtmosphere integer,dimension( MPI_STATUS_SIZE ) :: statut integer,intrinsic :: irtc
! Les processus 1, 4, 7 ddis au modle atmosphrique effectuent un calcul germe(1)=irtc() call random_seed(put=germe) call random_number(a) call random_number(b) call random_number(c) a(:) = b(:) + c(:)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
278/326
11 Annexes
11.4 Communicateurs
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
! Les processus ddis au modle atmosphre effectuent une opration collective call MPI_ALLREDUCE (a,c,n, MPI_REAL , MPI_MAX ,IntraComm,code) ! Rang du processus dans IntraComm call MPI_COMM_RANK (IntraComm,rang,code) ! change de messages avec les processus ddis au modle ocanographique call MPI_SENDRECV_REPLACE (c,n, MPI_REAL ,rang,tag1,rang,tag1, & CommOceanAtmosphere,statut,code) ! Le modle atmosphre tient compte des valeurs ocanographiques a(:) = b(:) * c(:) ! Envoi des rsultats aux processus ddis la visualisation if (rang == 0 .or. rang == 1) then call MPI_SSEND (a,n, MPI_REAL ,rang,tag2,CommVisuAtmosphere,code) end if end subroutine atmosphere
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
279/326
11 Annexes
11.4 Communicateurs
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
subroutine visualisation(IntraComm,CommVisuAtmosphere) use mpi implicit none integer,parameter real,dimension(n) integer integer,dimension( MPI_STATUS_SIZE ) :: :: :: :: n=1024,tag2=4444 a,b,c rang,code,IntraComm,CommVisuAtmosphere statut
! Les processus 2 et 5 sont chargs de la visualisation call MPI_COMM_RANK (IntraComm,rang,code) ! Rception des valeurs du champ tracer call MPI_RECV (a,n, MPI_REAL ,rang,tag2,CommVisuAtmosphere,statut,code) print*,Moi, processus ,rang, je trace mon champ A : ,a(:) end subroutine visualisation
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
280/326
11 Annexes
11.4 Communicateurs
11 Annexes
Il arrive cependant que dans certaines applications (gomtries complexes), la dcomposition de domaine ne soit plus une grille rgulire mais un graphe dans lequel un sous-domaine peut avoir un ou plusieurs voisins quelconques. Le sous-programme MPI_DIST_GRAPH_CREATE() permet alors de dnir une topologie de type graphe.
1 2 3 4 5 6 7 8 9
:: :: :: ::
integer, intent(out)
:: comm_nouveau, code
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
281/326
11 Annexes
11.4 Communicateurs
Les tableaux dentiers poids et liste_voisins permettent de dnir le poids attribu et la liste des voisins ceci pour chacun des nuds.
3 0 1 5 2 4
Numro de processus 0 1 2 3 4 5
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
282/326
11 Annexes
11.4 Communicateurs
Deux autres fonctions sont utiles pour connatre : le nombre de voisins pour un processus donn :
integer, integer, integer, integer, intent(in) intent(in) intent(out) intent(out) :: :: :: :: comm_nouveau rang nb_voisins code
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
283/326
11 Annexes
11.4 Communicateurs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
program graphe use mpi implicit none integer integer, integer, integer, integer, real :: rang,rang_monde,code,nb_processus,comm_graphe,& n, nb_voisins,i,iteration=0 etiquette=100 liste_voisins,poids voisins,sources,degres statut propagation, & ! Propagation du feu ! depuis les voisins feu=0., & ! Valeur du feu bois=1., & ! Rien na encore brl arret=1. ! Tout a brl si arret <= 0.01
call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD ,nb_processus,code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang_monde,code) allocate(sources(0:nb_processus-1),degres(0:nb_processus-1)) if (rang_monde==0) then n=nb_processus else n=0 end if
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
284/326
11 Annexes
11.4 Communicateurs
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
do i=0,nb_processus-1 sources(i)=i end do degres(:)= (/ 1,4,3,3,3,2 /) liste_voisins(:)= (/ 1,0,5,2,3,1,3,4,1,2,4,3,2,5,1,4 /) poids(:) = 1 call MPI_DIST_GRAPH_CREATE ( MPI_COMM_WORLD ,n,sources,degres,liste_voisins,poids, & MPI_INFO_NULL ,.false.,comm_graphe,code) call MPI_COMM_RANK (comm_graphe,rang,code) if (rang == 2) feu=1. ! Le feu se dclare arbitrairement sur la parcelle 2
call MPI_GRAPH_NEIGHBORS_COUNT (comm_graphe,rang,nb_voisins,code) allocate(voisins(nb_voisins)) ! Allocation du tableau voisins call MPI_GRAPH_NEIGHBORS (comm_graphe,rang,nb_voisins,voisins,code)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
285/326
11 Annexes
11.4 Communicateurs
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
do i=1,nb_voisins ! On propage le feu aux voisins call MPI_SENDRECV (minval((/1.,feu/)),1, MPI_REAL ,voisins(i),etiquette, & propagation, 1, MPI_REAL ,voisins(i),etiquette, & comm_graphe,statut,code) ! Le feu se dveloppe en local sous linfluence des voisins feu=1.2*feu + 0.2*propagation*bois bois=bois/(1.+feu) ! On calcule ce qui reste de bois sur la parcelle end do call MPI_ALLREDUCE (bois,arret,1, MPI_REAL , MPI_SUM ,comm_graphe,code) iteration=iteration+1 print ("Itration ",i2," parcelle ",i2," bois=",f5.3),iteration,rang,bois call MPI_BARRIER (comm_graphe,code) if (rang == 0) print ("--") end do deallocate(voisins) call MPI_FINALIZE (code) end program graphe
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
286/326
11 Annexes
11.4 Communicateurs
> mpiexec -n 6 graphe Iteration 1 parcelle 0 bois=1.000 Iteration 1 parcelle 3 bois=0.602 Iteration 1 parcelle 5 bois=0.953 Iteration 1 parcelle 4 bois=0.589 Iteration 1 parcelle 1 bois=0.672 Iteration 1 parcelle 2 bois=0.068 -................................... Iteration 10 parcelle 0 bois=0.008 Iteration 10 parcelle 1 bois=0.000 Iteration 10 parcelle 3 bois=0.000 Iteration 10 parcelle 5 bois=0.000 Iteration 10 parcelle 2 bois=0.000 Iteration 10 parcelle 4 bois=0.000 --
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
287/326
11 Annexes
11.4 Communicateurs
2 1 3 4 1
2 3 4 1
2 3 4
(a) Itration 0
(b) Itration 1
(c) Itration 2
2 1 3 4 1
2 3 4 1
2 3 4
(d) Itration 3
(e) Itration 4
(f) Itration 10
Figure 75 Dnition dune topologie quelconque via un graphe Exemple de la propagation dun feu de fort
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
288/326
11 Annexes
11 Annexes
La gestion dynamique des processus a t lun des apports majeurs de MPI-2 Cest la possibilit de crer (et dans certaines conditions de supprimer) des processus durant lexcution de lapplication Le dmarrage dune application reste dpendant de lenvironnement dexcution qui sera dni par le constructeur
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
289/326
11 Annexes
Lactivation dun ou plusieurs processus peut se faire selon deux modes bien distincts : Le mode matre-ouvriers : lun au moins des processus dune application active un ou plusieurs autres processus. Les processus ouvriers ainsi activs dynamiquement excutent un code soit identique (modle SPMD) soit dirent (modle MPMD) du processus matre qui les a gnr. Le mode client-serveur : un ou plusieurs processus dune application serveur (lance au pralable) sont en attente de connexion dun ou plusieurs processus dune application cliente (lance plus tard). Une fois la connexion eectue, un lien de communication est tabli entre les processus des deux applications.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
290/326
11 Annexes
11 Annexes
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
291/326
11 Annexes
MPI_COMM_WORLD (maitre)
a0 c a0 c a
0 2 2
b1
inter_comm
MPI_COMM_WORLD (ouvriers)
CALL MPI_INIT(code)
MPI_COMM_WORLD (maitre)
b1
e1 d
0
f2 g
5 3
CALL MPI_COMM_SPAWN(...)
intra_comm
b1 c2
e4 d
3
CALL MPI_INTERCOMM_MERGE(...)
g6
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
292/326
11 Annexes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
program maitre use mpi implicit none integer :: nb_procs_maitres,nb_procs_ouvriers=4,nb_procs,rang,code integer :: inter_comm,intra_comm,rang_maitre=1 logical :: drapeau=.false. call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD , nb_procs_maitres , code) ! Activation des processus ouvriers call MPI_COMM_SPAWN ("ouvriers", MPI_ARGV_NULL , nb_procs_ouvriers, MPI_INFO_NULL , & rang_maitre, MPI_COMM_WORLD , inter_comm , MPI_ERRCODES_IGNORE ,code) ! Fusion des communicateurs associs inter_comm. Dans intra_comm, les rangs ! des processus seront ordonns selon la valeur de largument drapeau call MPI_INTERCOMM_MERGE (inter_comm, drapeau, intra_comm , code) call MPI_COMM_SIZE (intra_comm, nb_procs , code) call MPI_COMM_RANK (intra_comm, rang , code) print *,"maitre de rang ", rang, "; intra_comm de taille ",nb_procs, & "; mon MPI_COMM_WORLD de taille ", nb_procs_maitres call MPI_FINALIZE (code) end program maitre
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
293/326
11 Annexes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
program ouvriers use mpi implicit none integer :: nb_procs_ouvriers, nb_procs, rang, code integer :: inter_comm, intra_comm logical :: drapeau=.true. call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD , nb_procs_ouvriers , code) ! Ai-je un processus matre ? call MPI_COMM_GET_PARENT ( inter_comm , code) if (inter_comm == MPI_COMM_NULL ) then print *,Pas de processus matre call MPI_FINALIZE (code) stop end if ! Fusion des communicateurs associs inter_comm. Dans intra_comm, les rangs ! des processus seront ordonns selon la valeur de largument drapeau call MPI_INTERCOMM_MERGE (inter_comm, drapeau, intra_comm , code) call MPI_COMM_SIZE (intra_comm, nb_procs , code) call MPI_COMM_RANK (intra_comm, rang , code) print *,"ouvrier de rang ", rang, "; intra_comm de taille ",nb_procs, & "; mon MPI_COMM_WORLD de taille : ", nb_procs_ouvriers call MPI_FINALIZE (code) end program ouvriers
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
294/326
11 Annexes
> mpiexec -n 3 -max_np 7 maitre maitre de rang 0 ; intra_comm maitre de rang 2 ; intra_comm ouvrier de rang 5 ; intra_comm ouvrier de rang 4 ; intra_comm ouvrier de rang 6 ; intra_comm maitre de rang 1 ; intra_comm ouvrier de rang 3 ; intra_comm
de de de de de de de
7 7 7 7 7 7 7
; ; ; ; ; ; ;
de de de de de de de
3 3 4 4 4 3 4
Noter que, dans ce cas, la fusion des communicateurs ne modie pas le rang des processus associs au programme matre.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
295/326
11 Annexes
Signication de MPI_COMM_SELF
MPI_COMM_SELF est un communicateur prdni par MPI. lappel de MPI_COMM_SPAWN(), ce communicateur inclut un et un seul processus. Ce processus est celui qui active les processus ouvriers. MPI_COMM_SELF nincluera donc que le processus matre.
... ! Activation des processus ouvriers rang_maitre=1 nb_procs_ouvriers=4 call MPI_COMM_SPAWN ("ouvriers", MPI_ARGV_NULL , nb_procs_ouvriers, MPI_INFO_NULL , & rang_maitre, MPI_COMM_SELF , inter_comm , MPI_ERRCODES_IGNORE ,code) ...
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
296/326
11 Annexes
MPI_COMM_WORLD (maitre)
a0 c2
b1
inter_comm
MPI_COMM_WORLD (ouvriers)
CALL MPI_INIT(code)
MPI_COMM_WORLD (maitre)
b1 0 c2
e1 d0
MPI_COMM_SELF
f2 g
3
CALL MPI_COMM_SPAWN(...)
intra_comm
b0
e2
d1 f
3
g4
CALL MPI_INTERCOMM_MERGE(...)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
297/326
11 Annexes
Signication de MPI_INFO_NULL
Ce paramtre est aussi utilis dans dautres contextes, notamment dans les entres/sorties parallles avec MPI-IO que lon verra dans le chapitre 9 Sil est spci lappel du sous-programme MPI_COMM_SPAWN() (ou bien MPI_COMM_SPAWN_MULTIPLE() que lon introduira par la suite), il indique le mode de recherche par dfaut des programmes ouvriers . Les constructeurs peuvent toutefois dnir dautres valeurs plus spciques leur environnement. Le mode de recherche par dfaut voudra dire gnralement que les programmes ouvriers se trouvent sur la machine locale et dans le mme rpertoire que le programme matre Pour modier ces valeurs par dfaut, il faut utiliser les sous-programmes MPI_INFO_CREATE(), MPI_INFO_SET() et MPI_INFO_FREE()
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
298/326
11 Annexes
integer :: rang_maitre=1, nb_procs_ouvriers=4, info_spawn ... ! Redfinition du mode de recherche des programmes ouvriers call MPI_INFO_CREATE ( info_spawn , code) call MPI_INFO_SET ( info_spawn , "host", "aleph.idris.fr", code) call MPI_INFO_SET ( info_spawn , "wdir", "/workdir/idris/rech/rgrp001", code) ! Activation des processus ouvriers call MPI_COMM_SPAWN ("ouvriers", MPI_ARGV_NULL , nb_procs_ouvriers, info_spawn , & rang_maitre, MPI_COMM_SELF , inter_comm, MPI_ERRCODES_IGNORE ,code) ! Libration du paramtre info_spawn call MPI_INFO_FREE ( info_spawn , code) ...
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
299/326
11 Annexes
Signication de MPI_UNIVERSE_SIZE
MPI_UNIVERSE_SIZE est une clef MPI dont on peut connatre la valeur grce au sous-programme MPI_COMM_GET_ATTR(). Si la version de MPI utilise limplmente, il est associ au nombre total de processus quun utilisateur peut activer.
... ! Nombre de processus maximum que lon peut activer call MPI_COMM_GET_ATTR ( MPI_COMM_WORLD , MPI_UNIVERSE_SIZE , nb_procs_total , logique ,code) if (logique) then ! Ici nb_procs_ouvriers vaudra 7-3=4 nb_procs_ouvriers = nb_procs_total - nb_procs_maitres else print *,"MPI_UNIVERSE_SIZE nest pas support" nb_procs_ouvriers = 4 end if ! Activation des processus ouvriers rang_maitre=1 call MPI_COMM_SPAWN ("ouvriers", MPI_ARGV_NULL , nb_procs_ouvriers, MPI_INFO_NULL , & rang_maitre, MPI_COMM_WORLD , inter_comm , MPI_ERRCODES_IGNORE ,code) ...
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
300/326
11 Annexes
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
301/326
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
11 Annexes
program maitre use mpi implicit none integer :: inter_comm,intra_comm, rang_maitre=1,code logical :: drapeau=.false. ! On souhaite activer 4 programmes ouvriers integer, parameter :: nb_prog_ouvriers=4 character(len=12), dimension(nb_prog_ouvriers) :: ouvriers integer, dimension(nb_prog_ouvriers) :: nb_procs_ouvriers=(/3,2,1,2/),infos ! Un code derreur par programme et par processus activ integer, dimension(8) :: codes_erreurs ! 8=3+2+1+2 call MPI_INIT (code) ouvriers(:) = (/"ouvriers1", "ouvriers2", "ouvriers3", "ouvriers4"/) infos(:) = MPI_INFO_NULL codes_erreurs(:) = MPI_ERRCODES_IGNORE ! Activation de plusieurs programmes ouvriers call MPI_COMM_SPAWN_MULTIPLE (nb_prog_ouvriers,ouvriers, MPI_ARGVS_NULL , & nb_procs_ouvriers,infos,rang_maitre, MPI_COMM_WORLD , & inter_comm ,codes_erreurs,code) ! Fusion des communicateurs associs inter_comm. Dans intra_comm, les rangs ! des processus seront ordonns selon la valeur de largument drapeau call MPI_INTERCOMM_MERGE (inter_comm, drapeau, intra_comm , code) ! Inclure ici le code correspondant aux calculs faire par les processus matres ... call MPI_FINALIZE (code) end program maitre
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
302/326
11 Annexes
MPI_COMM_WORLD (maitre)
a0 c2
b1
MPI_COMM_WORLD (Ouvriers)
CALL MPI_INIT(code)
ouvriers1
e1 d 0 f 2
MPI_COMM_WORLD (maitre)
ouvriers2
g3 h4 b1 c
2
i5 j 6 k7
inter_comm intra_comm
ouvriers4
a0 b 1 c2 e4
f5 d
3
g6 h7
i8 j
9
k10
CALL MPI_INTERCOMM_MERGE(...)
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
303/326
11 Annexes
Remarques
MPI_COMM_SPAWN() et MPI_COMM_SPAWN_MULTIPLE() sont des sous-programmes collectifs qui doivent tre appels par lensemble des processus du communicateur incluant le processus matre Attention lordre des processus dans le nouvel intracommunicateur issu de la fusion des deux communicateurs associs lintercommunicateur renvoy par MPI_COMM_SPAWN() ou MPI_COMM_SPAWN_MULTIPLE() Contrairement ce que lon aurait obtenu si MPI_COMM_SPAWN() avait t utilis pour activer plusieurs programmes, MPI_COMM_SPAWN_MULTIPLE() inclut tous les processus de tous les programmes ouvriers dans le mme communicateur MPI_COMM_WORLD Tous les arguments de MPI_COMM_SPAWN_MULTIPLE() ont la mme signication que ceux de MPI_COMM_SPAWN() Dans MPI_COMM_SPAWN_MULTIPLE(), certains arguments sont toutefois transforms en tableaux du fait de la multiplicit des programmes ouvriers activer Avec MPI_COMM_SPAWN_MULTIPLE(), les variables MPI_INFO_NULL, MPI_COMM_SELF et MPI_UNIVERSE_SIZE conservent les mmes caractristiques que celles que lon a vues avec MPI_COMM_SPAWN()
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
304/326
11 Annexes
11 Annexes
Deux programmes indpendants peuvent tablir entre eux un lien de communication alors que leurs processus ne partagent aucun communicateur. Cette situation peut se produire : lorsque deux parties dune application dmarrent indpendamment lune de lautre et veulent, un moment de leur vie, changer des informations ; lorsquune application parallle serveur accepte des connexions de plusieurs applications parallles clientes ; lorsquun outil de visualisation veut sattacher un processus en cours dexcution pour extraire certaines informations. Lenvironnement (machines, systmes dexploitation, etc.) dans lequel sexcute lapplication serveur peut tre dirent de celui des applications clientes.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
305/326
11 Annexes
Machine A
MPI_COMM_WORLD (serveur)
Machine B
MPI_COMM_WORLD (client)
linstant t
Machine A
MPI_COMM_WORLD (serveur)
Machine B
MPI_COMM_WORLD (client)
linstant t + t
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
306/326
11 Annexes
Processus serveur
Pour accepter un lien de communication avec le processus client, le processus serveur passe par trois tapes : ouverture dun port de communication : MPI_OPEN_PORT() ; publication dun nom arbitraire de connexion : MPI_PUBLISH_NAME() ; acceptation de la connexion : MPI_COMM_ACCEPT() Pour fermer ce lien de communication, de mme : fermeture de la connexion avec le processus client : MPI_COMM_DISCONNECT() ; retrait du nom de connexion : MPI_UNPUBLISH_NAME() ; fermeture du port de communication : MPI_CLOSE_PORT().
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
307/326
11 Annexes
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
308/326
11 Annexes
Processus client
Le client doit tout dabord se connecter au port de communication du serveur, ce qui se ralise en deux tapes : recherche du port de communication associ au nom publi par le serveur : MPI_LOOKUP_NAME() ; connexion avec le serveur : MPI_COMM_CONNECT(). Ensuite, pour interrompre la connexion avec le serveur, le client devra obligatoirement appeler le sous-programme MPI_COMM_DISCONNECT().
... integer :: rang_client=1, inter_comm, code character(len= MPI_MAX_PORT_NAME ) :: nom_de_port ... if ( rang == rang_client ) & call MPI_LOOKUP_NAME ("nom_de_connexion", MPI_INFO_NULL , nom_de_port , code) call MPI_COMM_CONNECT (nom_de_port, MPI_INFO_NULL , rang_client, MPI_COMM_WORLD , & inter_comm, code) ! Inclure ici le code du client ... call MPI_COMM_DISCONNECT (inter_comm, code) ...
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
309/326
11 Annexes
Remarques
MPI_COMM_CONNECT(), MPI_COMM_ACCEPT() et MPI_COMM_DISCONNECT() sont des sous-programmes collectifs (donc bloquants), bien quun seul processus participe la connexion de part et dautre MPI_CLOSE_PORT() libre le port de communication (le serveur devient injoignable) alors que MPI_COMM_DISCONNECT() ne fait que rompre le lien de communication entre deux intracommunicateurs pour quventuellement un autre lien puisse stablir sur le mme port MPI_COMM_SELF peut tre utilis la place de MPI_COMM_WORLD dans les appels aux sous-programmes MPI_COMM_ACCEPT() et MPI_COMM_CONNECT(). Dans ce cas, la connexion stablit entre deux intracommunicateurs ne contenant chacun que le processus appelant lun ou lautre sous-programme. Sans le mcanisme des sous-programmes MPI_PUBLISH_NAME() et MPI_LOOKUP_NAME(), on aurait t amen prciser explicitement au processus client par un moyen quelconque (sur lentre standard ou par lintermdiaire dun chier), le nom du port de communication renvoy par le processus serveur
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
310/326
11 Annexes
11 Annexes
Sil est possible de crer des processus, on devrait pouvoir les supprimer Or, il nexiste pas de sous-programme MPI spcique pour supprimer un processus gnr en cours dexcution En revanche, il est toujours possible de diriger (ex. par change de messages) lexcution de ce processus vers une terminaison normale Un processus MPI se termine normalement lappel du sous-programme MPI_FINALIZE() et la n de lexcution du programme principal Il existe trois contraintes : le nouveau communicateur MPI_COMM_WORLD gnr ne doit contenir que le processus dont on veut se dbarrasser ; il ne doit exister aucun lien de communication (intercommunicateur) entre le communicateur MPI_COMM_WORLD contenant le processus pre (ou serveur) et celui contenant le processus ls (ou client) supprimer ; tout intracommunicateur contenant le processus dtruire doit tre invalid avant la terminaison du processus ls (ou client).
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
311/326
11 Annexes
Il faut galement noter que il nest pas possible de se dbarrasser dun seul processus ouvrier si son communicateur MPI_COMM_WORLD inclut dautres processus ; dans ce cas, la terminaison ne seectue proprement que si tous les processus de MPI_COMM_WORLD appellent le sous-programme MPI_FINALIZE() et atteignent normalement la n de lexcution.
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
312/326
11 Annexes
11 Annexes
Dans certains cas, comme celui de MPI_UNIVERSE_SIZE, les implmentations ont des clefs spciques dont la valeur peut tre connue grce au sous-programme :
integer, intent(in) :: comm, clef integer(kind= MPI_ADDRESS_KIND ), intent(out) :: valeur logical, intent(out) :: logique integer, intent(out) :: code call MPI_COMM_GET_ATTR (comm, clef, valeur, logique, code)
On peut cependant modier la valeur associe une clef dnie au pralable, en utilisant le sous-programme :
integer, intent(inout) :: integer, intent(in) :: integer(kind= MPI_ADDRESS_KIND ), intent(in) :: integer, intent(out) :: comm clef valeur code
Plus gnralement, on peut dnir un couple (clef, valeur) spcique son application par lintermdiaire des sous-programmes MPI_COMM_CREATE_KEYVAL() et MPI_COMM_SET_ATTR()
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
313/326
11 Annexes
11.6 MPI-IO
11 Annexes
11.6 MPI-IO
program open02 use mpi implicit none integer :: rang,descripteur,attribut,longueur,code character(len=80) :: libelle logical :: defini call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ,rang,code) call MPI_FILE_OPEN ( MPI_COMM_WORLD ,"fichier.txt", MPI_MODE_RDWR + MPI_MODE_CREATE , & MPI_INFO_NULL ,descripteur,code) call MPI_FILE_GET_INFO (descripteur,attribut,code) call MPI_INFO_GET_VALUELEN (attribut,"cb_nodes",longueur,defini,code) if (defini) then call MPI_INFO_GET (attribut,"cb_nodes",longueur,libelle,defini,code) if (rang==0) print *,"Fichier fichier.txt sur ",libelle(1:longueur)," processus" end if call MPI_INFO_FREE (attribut,code) call MPI_FILE_CLOSE (descripteur,code) call MPI_FINALIZE (code) end program open02 > mpiexec -n 2 open02 Fichier fichier.txt sur 2 processus
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
314/326
12 Index
1 Introduction 2 Environnement 3 Communications point point 4 Communications collectives 5 Copies de mmoire mmoire 6 Types de donnes drivs 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index 12.1 Index des concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 12.2 Index des constantes MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 12.3 Index des sous-programmes MPI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .320
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
315/326
12 Index
barrire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 bloquantes (communications) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28, 34, 39 non-bloquantes (communications) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 collectives (communications) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 communicateur . . . . . . . . . . . . . . . . . . . . . . . . . . 14, 23, 24, 28, 44, 149, 150, 152, 154157, 160, 175 intercommunicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 intracommunicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14, 131, 149, 150, 154, 268, 271, 272 contexte de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28, 154 envoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 tiquette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28, 44 groupe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61, 154, 155 intercommunicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 intracommunicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10, 1214, 152 MPMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
316/326
12 Index
performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 persistantes (communications) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268, 271 portabilit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110, 128 processeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 processus . . 1014, 23, 24, 27, 28, 32, 39, 40, 44, 61, 68, 128, 149, 152, 154156, 159, 160, 165, 166, 168, 170, 272 rang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24, 28, 32, 155, 156, 166, 168, 170 rception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268, 271 SPMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 topologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14, 128, 159, 160, 165, 166, 168, 170, 175, 177 types derivs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
317/326
12 Index
mpi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 mpi.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 MPI_ADDRESS_KIND . . . . . . . . . . . . . . . 77, 80, 87, 94, 102, 112, 122, 123, 125, 126, 226, 312 MPI_ANY_SOURCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32, 36 MPI_ANY_TAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32, 36 MPI_ARGV_NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292, 295, 298, 299 MPI_ARGVS_NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 MPI_BSEND_OVERHEAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 MPI_BYTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 MPI_CHARACTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 MPI_COMM_NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155, 293 MPI_COMM_SELF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295, 296, 298, 303, 309 MPI_COMM_WORLD 2325, 29, 3336, 39, 41, 46, 48, 50, 52, 54, 56, 57, 59, 64, 66, 77, 87, 104109, 115, 119, 120, 123, 124, 126, 127, 150, 158, 161, 163, 173, 174, 179, 191, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 232, 236, 237, 239, 242, 249, 255, 256, 259, 260, 266, 269, 270, 274, 275, 283, 284, 292294, 299, 301, 303, 307311, 313 MPI_COMPLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98, 249 MPI_DISTRIBUTE_BLOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252255, 262 MPI_DISTRIBUTE_CYCLIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252, 258, 259, 263 MPI_DISTRIBUTE_NONE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252, 253, 263 MPI_DOUBLE_PRECISION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77, 8789 MPI_ERRCODES_IGNORE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292, 295, 298, 299, 301 MPI_INFO_NULL . . . 77, 87, 191, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 232, 233, 237, 239, 242, 284, 292, 295, 299, 301, 303, 307, 308, 313
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
318/326
12 Index
MPI_INTEGER . . 29, 33, 34, 36, 39, 41, 48, 64, 66, 80, 98, 102, 110, 120, 123, 126, 127, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 233, 237, 239, 242, 256, 260 MPI_LOCK_EXCLUSIVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 MPI_LOCK_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93, 94 MPI_LOGICAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 MPI_MAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81, 278 MPI_MAX_PORT_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307, 308 MPI_MODE_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191, 197, 313 MPI_MODE_NOPRECEDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 MPI_MODE_NOPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 MPI_MODE_NOSTORE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 MPI_MODE_NOSUCCEED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 MPI_MODE_RDONLY . 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 232, 237, 239, 242 MPI_MODE_RDWR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191, 313 MPI_MODE_SEQUENTIAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196, 201 MPI_MODE_WRONLY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 MPI_OFFSET_KIND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197, 199, 210, 221, 226, 229, 232, 236 MPI_ORDER_C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .117 MPI_ORDER_FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117, 120, 230, 233, 256, 260 MPI_PROC_NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32, 174 MPI_PROD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66, 81 MPI_REAL . 50, 52, 54, 57, 59, 98, 100102, 104, 106, 108, 110, 115, 123, 146, 155, 158, 179, 269, 270, 276, 278, 279, 285
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
319/326
12 Index
MPI_REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 MPI_SEEK_CUR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220, 221 MPI_SEEK_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 MPI_SEEK_SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220, 221 MPI_SOURCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 MPI_STATUS_IGNORE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32, 33 MPI_STATUS_SIZE . . 29, 35, 41, 104, 106, 108, 115, 119, 123, 126, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 226, 229, 232, 236, 239, 242, 255, 259, 276, 277, 279, 283 MPI_STATUSES_IGNORE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 MPI_SUCCESS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32, 132 MPI_SUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64, 81, 89, 276, 285 MPI_TAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 MPI_UNDEFINED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156, 266 MPI_UNIVERSE_SIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299, 303, 312 MPI_WIN_BASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76, 77 MPI_WIN_DISP_UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76, 77 MPI_WIN_SIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76, 77 mpif.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
320/326
12 Index
MPI_ABORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 MPI_ACCUMULATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78, 81, 85, 8991 MPI_ALLGATHER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 54, 68 MPI_ALLGATHERV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 MPI_ALLOC_MEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 MPI_ALLREDUCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 61, 66, 276, 278, 285 MPI_ALLTOALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 59, 68 MPI_ALLTOALLV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 MPI_ALLTOALLW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 MPI_ATTACH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 MPI_BARRIER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 46, 285 MPI_BCAST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 48, 61, 155, 158, 266 MPI_BSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 135138 MPI_CART_COORDS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168, 169, 174, 179 MPI_CART_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .154, 160, 161, 163, 174, 179 MPI_CART_RANK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166, 167 MPI_CART_SHIFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170172, 174 MPI_CART_SUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154, 177, 179 MPI_CLOSE_PORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306, 307, 309 MPI_COMM_ACCEPT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306, 307, 309 MPI_COMM_CONNECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308, 309 MPI_COMM_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 MPI_COMM_CREATE_KEYVAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 MPI_COMM_DISCONNECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306309 MPI_COMM_DUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 MPI_COMM_FREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154, 158
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
321/326
12 Index
MPI_COMM_GET_ATTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299, 312 MPI_COMM_GET_PARENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 MPI_COMM_RANK . . 24, 25, 29, 33, 35, 41, 48, 50, 52, 54, 56, 59, 64, 66, 77, 87, 104, 106, 108, 115, 119, 123, 126, 158, 174, 179, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 232, 236, 239, 242, 249, 255, 259, 266, 274, 276, 278, 279, 283, 284, 292, 293, 313 MPI_COMM_SET_ATTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 MPI_COMM_SIZE . . . . 24, 25, 35, 41, 50, 52, 54, 56, 59, 64, 66, 173, 255, 259, 283, 292, 293 MPI_COMM_SPAWN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290292, 295, 297300, 303 MPI_COMM_SPAWN_MULTIPLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297, 300303 MPI_COMM_SPLIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154, 156158, 177, 274 MPI_DETACH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 MPI_DIMS_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165, 173 MPI_DIST_GRAPH_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280, 284 MPI_EXSCAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 MPI_FILE_CLOSE 191, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 233, 237, 239, 242, 313 MPI_FILE_GET_INFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 MPI_FILE_GET_POSITION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 MPI_FILE_GET_POSITION_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 MPI_FILE_IREAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 239 MPI_FILE_IREAD_AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193, 237 MPI_FILE_IREAD_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_IWRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_IWRITE_AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
322/326
12 Index
MPI_FILE_IWRITE_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_OPEN . 191, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 232, 237, 239, 242, 313 MPI_FILE_READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 202, 204, 221, 227, 230, 233 MPI_FILE_READ_ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 212, 214, 216 MPI_FILE_READ_ALL_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_READ_ALL_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_READ_AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193, 199 MPI_FILE_READ_AT_ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193, 210 MPI_FILE_READ_AT_ALL_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 MPI_FILE_READ_AT_ALL_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 MPI_FILE_READ_ORDERED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 218 MPI_FILE_READ_ORDERED_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 242 MPI_FILE_READ_ORDERED_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 242 MPI_FILE_READ_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194, 207 MPI_FILE_SEEK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220, 221 MPI_FILE_SEEK_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 MPI_FILE_SET_INFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 MPI_FILE_SET_VIEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227, 230, 233 MPI_FILE_WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ALL_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ALL_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193, 197 MPI_FILE_WRITE_AT_ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
323/326
12 Index
MPI_FILE_WRITE_AT_ALL_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 MPI_FILE_WRITE_AT_ALL_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 MPI_FILE_WRITE_ORDERED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ORDERED_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ORDERED_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_SHARED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FINALIZE . . . 22, 25, 29, 33, 36, 41, 48, 50, 52, 54, 57, 59, 64, 66, 77, 89, 105, 107, 109, 115, 120, 124, 127, 150, 158, 174, 179, 191, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 233, 237, 239, 242, 249, 256, 260, 266, 285, 292, 293, 301, 310, 311, 313 MPI_GATHER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 52, 68 MPI_GATHERV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57, 68 MPI_GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78, 81, 88, 91, 94 MPI_GET_ADDRESS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121, 122, 124 MPI_GET_ELEMENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 MPI_GRAPH_NEIGHBORS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .282, 284 MPI_GRAPH_NEIGHBORS_COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282, 284 MPI_IBSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 135, 136, 138 MPI_INFO_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .297, 298 MPI_INFO_FREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297, 298, 313 MPI_INFO_GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 MPI_INFO_GET_VALUELEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 MPI_INFO_SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297, 298
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
324/326
12 Index
MPI_INIT 22, 25, 29, 33, 35, 41, 48, 50, 52, 54, 56, 59, 64, 66, 77, 87, 104, 106, 108, 115, 119, 123, 126, 150, 158, 173, 179, 191, 197, 199, 202, 204, 207, 210, 212, 214, 216, 218, 221, 227, 230, 232, 236, 239, 242, 249, 255, 259, 266, 274, 283, 292, 293, 301, 313 MPI_INTERCOMM_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272, 275 MPI_INTERCOMM_MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290, 292, 293, 301 MPI_IRECV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 142, 145, 146, 269 MPI_IRSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 140 MPI_ISEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 139, 142, 145, 146 MPI_ISSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 133, 269 MPI_LOOKUP_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308, 309 MPI_OP_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61, 249 MPI_OP_FREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 MPI_OPEN_PORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306, 307 MPI_PROBE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 MPI_PUBLISH_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306, 307, 309 MPI_PUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78, 8082, 85, 88, 90, 91 MPI_RECV . . . . . . . . . . . . . . . . . . . 29, 34, 36, 39, 41, 105, 107, 109, 124, 127, 131, 256, 260, 279 MPI_RECV_INIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 MPI_REDUCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45, 61, 64, 249 MPI_REQUEST_FREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 MPI_RSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 140 MPI_SCAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61, 68 MPI_SCATTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45, 50, 68, 179 MPI_SCATTERV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 MPI_SEND . . . . . . . . . . . . . . . . . . . 29, 34, 36, 39, 41, 105, 107, 109, 124, 127, 131, 139, 256, 260
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
325/326
12 Index
MPI_SENDRECV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3234, 128, 285 MPI_SENDRECV_REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32, 113, 115, 120, 276, 278 MPI_SSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131, 133, 278 MPI_SSEND_INIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 MPI_START . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270, 271 MPI_TEST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235, 237 MPI_TYPE_COMMIT . . 98, 103, 104, 106, 108, 115, 120, 124, 127, 227, 230, 233, 256, 260, 267 MPI_TYPE_CONTIGUOUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98, 100, 104 MPI_TYPE_CREATE_DARRAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251, 256, 260 MPI_TYPE_CREATE_F90_COMPLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264, 266 MPI_TYPE_CREATE_F90_INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 MPI_TYPE_CREATE_F90_REAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 MPI_TYPE_CREATE_HINDEXED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110, 112 MPI_TYPE_CREATE_HVECTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98, 102, 110 MPI_TYPE_CREATE_RESIZED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125, 126, 227 MPI_TYPE_CREATE_STRUCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121, 122, 124 MPI_TYPE_CREATE_SUBARRAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116, 120, 230, 233 MPI_TYPE_FREE . . . . . . . . . . . . . . . . . . . . . 98, 103, 105, 107, 109, 115, 120, 124, 256, 260, 267 MPI_TYPE_GET_EXTENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110, 125, 227 MPI_TYPE_INDEXED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110, 111, 115, 121, 227 MPI_TYPE_SIZE . . . . . . . . . . . . . . . . . . . . 76, 77, 87, 110, 125, 126, 197, 199, 210, 221, 233, 237 MPI_TYPE_VECTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98, 101, 106, 108, 126 MPI_UNPUBLISH_NAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306, 307 MPI_WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .132, 142, 144, 145, 235, 239, 269, 270
INSTITUT DU DVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet
326/326
12 Index
MPI_WAITALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 MPI_WIN_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74, 77, 87 MPI_WIN_FENCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83, 85, 8890, 92 MPI_WIN_FREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76, 77, 89 MPI_WIN_GET_ATTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76, 77 MPI_WIN_LOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9295 MPI_WIN_UNLOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9295
MPI Version 4.1 Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavalle, D. Lecas, P. Wautelet