Message Passing Interface (MPI

)

Jalel Chergui Isabelle Dupays Denis Girou Pierre-François Lavallée Dimitri Lecas Philippe Wautelet

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

MPI – Plan I
1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.1 Définitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Concepts de l’échange 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 générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 Types de données de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3 Autres possibilités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.4 Exemple : anneau de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4 Communications collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.1 Notions générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.2 Synchronisation globale : MPI_BARRIER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.3 Diffusion générale : MPI_BCAST() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.4 Diffusion sélective : MPI_SCATTER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.5 Collecte : MPI_GATHER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.6 Collecte générale : MPI_ALLGATHER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.7 Collecte : MPI_GATHERV() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.8 Échanges croisés : MPI_ALLTOALL() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

MPI – Plan II
4.9 Réductions réparties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.10 Compléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5 Copies de mémoire à mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 5.1.1 Rappel : concept de l’échange de messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.1.2 Concept des copies de mémoire à mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.1.3 Approche RMA de MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 5.2 Notion de fenêtre mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 5.3 Transfert des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5.4 Achèvement 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 données dérivés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .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 d’une matrice ». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104 6.5.2 Type « ligne d’une matrice » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 6.5.3 Type « bloc d’une matrice » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

MPI – Plan III
6.6 Types homogènes à pas variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 6.7 Construction de sous-tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 6.8 Types hétérogènes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.9 Sous-programmes annexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7 Optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7.2 Modes d’envoi point à point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 7.2.1 Rappels terminologiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 7.2.2 Envois synchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7.2.3 Envois bufferisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 7.2.4 Envois standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 7.2.5 Envois en mode ready . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 7.2.6 Performances des différents modes d’envoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 7.3 Recouvrement calculs-communications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 8 Communicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 8.2 Communicateur par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 8.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 8.4 Groupes et communicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 8.5 Communicateur issu d’un autre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 8.6 Topologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

MPI – Plan IV
8.6.1 Topologies cartésiennes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 8.6.2 Subdiviser une topologie cartésienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

9 MPI-IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1.2 Enjeux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 9.1.3 Définitions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187 9.2 Gestion de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 9.3 Lectures/écritures : généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 9.4 Lectures/écritures individuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.4.1 Via des déplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.4.2 Via des déplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 9.4.3 Via des déplacements implicites partagés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 9.5 Lectures/écritures collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 9.5.1 Via des déplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.5.2 Via des déplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 9.5.3 Via des déplacements implicites partagés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 9.6 Positionnement explicite des pointeurs dans un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 9.7 Définition de vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 9.8 Lectures/écritures non bloquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 9.8.1 Via des déplacements explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 9.8.2 Via des déplacements implicites individuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, 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 données dérivés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11.2.1 Distribution d’un tableau sur plusieurs processus . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11.2.2 Types dérivés numériques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .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 maître-ouvriers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 11.5.3 Mode client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 11.5.4 Suppression de processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 11.5.5 Compléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 11.6 MPI-IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 12 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 12.1 Index des concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 12.2 Index des constantes MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

. . Girou. Chergui. . . . .MPI – Plan VI 12. . . Wautelet . . . . . . . . . . . Lavallée. . . . . . .3 Index des sous-programmes MPI. . .320 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . P. Lecas. .-F. . . D. . . . . . . .1 – Avril 2012 J. . D. . . . Dupays. . P. . I. . . . . .

. . . . . . . . . . . . . . . . . . . 12 1. . . . . . . . . .-F. 15 1. . . . . . . . . . . . . I. . . . . P.3 Historique . . . Lavallée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lecas. . . . . . . .4 Bibliographie . . . . . .2 Concepts de l’échange de messages . . . 9 1. . . . . . . . . 17 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . . . . . . . Dupays. . . . . . . . . . . . P. . . . . . . . .1 – Avril 2012 J. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8/326 1 – Introduction 1 Introduction 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Définitions . . . . . . . D. . . . . . . . . . Wautelet . . . . . . . . . . . . . . D. . . . . . . . . . . . . . . Girou. . . . . Chergui.

☞ un processus s’exécute sur un processeur physique de la machine.9/326 1 – Introduction 1. P. Lavallée.1 – Définitions 1 – Introduction 1. Mémoire Programme P Figure 1 – Modèle de programmation séquentiel INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Définitions ➊ Le modèle de programmation séquentiel : ☞ le programme est exécuté par un et un seul processus . Chergui. Lecas. Dupays. P. D. Girou.-F. I. ☞ toutes les variables et constantes du programme sont allouées dans la mémoire allouée au processus .1 – Avril 2012 J. Wautelet . D.

C.10/326 1 – Introduction 1. Dupays. etc. ☞ toutes les variables du programme sont privées et résident dans la mémoire locale allouée à chaque processus . P. Lecas. dans le programme.) . I. Mémoires Processus Réseau 0 1 2 3 Programmes Figure 2 – Modèle de programmation par échange de messages INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. C++. P. Lavallée.1 – Avril 2012 J. Chergui. ☞ chaque processus exécute éventuellement des parties différentes d’un programme .1 – Définitions ➋ Dans le modèle de programmation par échange de messages : ☞ le programme est écrit dans un langage classique (Fortran. D. D.-F. à des sous-programmes particuliers. ☞ une donnée est échangée entre deux ou plusieurs processus via un appel. Wautelet .

Chergui. Lecas. Multiple Data MPI – Version 4.11/326 1 – Introduction 1.1 – Définitions ➌ Le modèle d’exécution SPMD : ☞ Single Program. D. Dupays. ☞ toutes les machines supportent ce modèle de programmation et certaines ne supportent que celui-là . Multiple Data). P. Girou. I. qu’il peut d’ailleurs émuler. Multiple Data . ☞ le même programme est exécuté par tous les processus . Wautelet INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE .-F. P. Lavallée. D. ☞ c’est un cas particulier du modèle plus général MPMD (Multiple Program. Mémoires d0 d1 d2 d3 Processus Réseau 0 1 2 3 Programme (unique) Figure 3 – Single Program.1 – Avril 2012 J.

P.12/326 1 – Introduction 1. celui-ci doit ensuite le recevoir 0 source J’envoie source 1 cible Je reçois dans cible Figure 4 – Échange d’un message INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. Girou.-F. P. Lecas. I.1 – Avril 2012 J. D. Lavallée.2 – Concepts de l’échange de messages ☞ Si un message est envoyé à un processus.2 – Concepts de l’échange de messages 1 – Introduction 1. D. Wautelet . Dupays.

Girou. tableaux. Dupays. l’identificateur du processus récepteur. D. P. Lavallée. sa longueur .2 – Concepts de l’échange de messages ☞ Un message est constitué de paquets de données transitant du processus émetteur au(x) processus récepteur(s) ☞ En plus des données (variables scalaires.-F. le type de la donnée . D. I. message emetteur récepteur type longueur Mémoires d1 d2 Processus Réseau 1 message 2 Figure 5 – Constitution d’un message INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. un message doit contenir les informations suivantes : ➳ ➳ ➳ ➳ l’identificateur du processus émetteur . Lecas.13/326 1 – Introduction 1.1 – Avril 2012 J.) à transmettre. Chergui. Wautelet D O N d1 NE E . P. etc.

etc.-F. Wautelet . ☞ Le message est envoyé à une adresse déterminée ☞ Le processus récepteur doit pouvoir classer et interpréter les messages qui lui ont été adressés ☞ L’environnement en question est MPI (Message Passing Interface). à la télécopie.2 – Concepts de l’échange de messages ☞ Les messages échangés sont interprétés et gérés par un environnement qui peut être comparé à la téléphonie. D. I. P. Dupays. au courrier postal. Lavallée. P. à la messagerie électronique. Lecas. Chergui.14/326 1 – Introduction 1. Une application MPI est un ensemble de processus autonomes exécutant chacun leur propre code et communiquant via des appels à des sous-programmes de la bibliothèque MPI INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. Girou. D.

3 – Historique 1 – Introduction 1. abouti à la définition d’un ensemble de sous-programmes concernant la bibliothèque d’échanges de messages MPI ☞ Version 1.1 : juin 2008.2 : septembre 2009.3 – Historique ☞ Version 1. Girou.15/326 1 – Introduction 1. avec des changements mineurs pour une meilleure cohérence des dénominations de certains sous-programmes ☞ Version 1.1 ☞ Version 2. D.1 : juin 1995. en fonction des clarifications elles-mêmes apportées par MPI-2. avec seulement des clarifications dans MPI 2. Chergui.0 : en juin 1994. cette version apportait des compléments essentiels volontairement non intégrés dans MPI 1. avec seulement des changements mineurs ☞ Version 1.0 : apparue en juillet 1997. Lavallée.-F.3 : septembre 2008. P. copies mémoire à mémoire.2 : en 1997. D. Lecas. P. Wautelet . Dupays. avec seulement de « petites » additions INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.0 mais aucun changement ☞ Version 2. avec des clarifications dans MPI 1. avec la participation d’une quarantaine d’organisations. I. entrées-sorties parallèles.1 – Avril 2012 J.2. le forum MPI (Message Passing Interface Forum). etc.) ☞ Version 2.0 (gestion dynamique de processus.

mpi-forum.php https://svn. P. ➠ tolérance aux pannes . Girou. notamment sur les machines massivement parallèles et many cores .2 .mpi-forum.org/trac/mpi-forum-web/wiki INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. P. ➠ Fortran (2003-2008) bindings . Dupays. ➳ principaux changements actuellement envisagés : ➠ communications collectives non bloquantes . Lecas.-F. ➳ voir http://meetings. ➳ attendu en 2012 . D. Wautelet . ➠ révision de l’implémentation des copies mémoire à mémoire . D.3 – Historique ☞ Version 3.16/326 1 – Introduction 1. ➳ pour un meilleur support des applications actuelles et futures.1 – Avril 2012 J.0_main_page. ➠ interfaçage d’outils externes (pour le débogage et les mesures de performance) . I. Lavallée. ➠ etc.0 ➳ changements et ajouts importants par rapport à la version 2.org/MPI_3.

html http://www. 1999 ☞ Peter S. second edition. Dupays. Girou.17/326 1 – Introduction 1.html INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Pacheco : Parallel Programming with MPI. 1997 ☞ Documentations complémentaires : http://www. MIT Press. Lecas. Version 2.htm http://www.hlrs..2. Wautelet . Morgan Kaufman Ed. Lavallée. Ewing Lusk et Rajeev Thakur : Using MPI-2. I.mcs.anl. 2009 https://fs.1 – Avril 2012 J.org/archives/notes/notes.org/mpi2_1/index. 1999 ☞ William Gropp.org/docs/ http://www.4 – Bibliographie 1 – Introduction 1. Chergui. P. D.gov/research/projects/mpi/learning. High Performance Computing Center Stuttgart (HLRS). MIT Press.-F.mpi-forum.4 – Bibliographie ☞ Message Passing Interface Forum.mpi-forum. MPI : A Message-Passing Interface Standard.mpi-forum. Ewing Lusk et Anthony Skjellum : Using MPI : Portable Parallel Programming with the Message Passing Interface.de/projects/par/mpi/mpi22/ ☞ William Gropp. P.

1 – Avril 2012 J. P.org/ INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. D. Lecas. Girou. I.-F. D.open-mpi. Chergui.18/326 1 – Introduction 1. P.4 – Bibliographie ☞ Implémentations MPI open source : elles peuvent être installées sur un grand nombre d’architectures mais leurs performances sont en général en dessous de celles des implémentations constructeurs 1 2 MPICH2 : http://www. Lavallée. Wautelet .anl.mcs.gov/research/projects/mpich2/ Open MPI : http://www.

Girou.allinea. Wautelet .com/home/ 2 DDT http://www.eu/ INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.fz-juelich. I. P.anl.mcs.htm 2 Scalasca : Scalable Performance Analysis of Large-Scale Applications http://www. D. Chergui.gov/research/projects/perfvis/download/index. Lavallée.-F. Dupays.19/326 1 – Introduction 1. P. Lecas.4 – Bibliographie ☞ Débogueurs 1 Totalview http://www.vampir. D.totalviewtech.1 – Avril 2012 J.de/jsc/scalasca/ 3 Vampir http://www.com/products/ddt/ ☞ Outils de mesure de performances 1 MPE : MPI Parallel Environment http://www.

Les sources sont téléchargeables sur le site http://graal. Chergui.4 – Bibliographie ☞ Quelques bibliothèques scientifiques parallèles open source : 1 ScaLAPACK : résolution de problèmes d’algèbre linéaire par des méthodes directes. Wautelet . Les sources sont téléchargeables sur le site http://www.fr/MUMPS/ 4 FFTW : transformées de Fourier rapides.20/326 1 – Introduction 1.-F. Les sources sont téléchargeables sur le site http://www. P.netlib. P. Lavallée.org/scalapack/ 2 PETSc : résolution de problèmes d’algèbre linéaire et non-linéaire par des méthodes itératives. D. I.1 – Avril 2012 J. Les sources sont téléchargeables sur le site http://www.mcs. Dupays.fftw.org INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. D.gov/petsc/petsc-as/ 3 MUMPS : résolution de grands systèmes linéaires creux par méthode directe multifrontale parallèle. Lecas.anl.ens-lyon.

-F. . 25 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index MPI – Version 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Girou. . . .21/326 2 – Environnement 1 Introduction 2 Environnement 2. . . . . . . .1 – Avril 2012 J. . . . . . . . . . . . . . . . Lecas. . . . . . . . . Dupays. . . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . Lavallée. . . . I. . . . . . . . . . . P. . . . . . . . . . . Wautelet INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE . . .1 Description . . . D. . . . . . . Chergui. . . . . . . . P. . . . . . . . . . . 22 2. .2 Exemple . . . .

et en C/C++ le fichier mpi. il s’agissait du fichier mpif. P. Chergui.22/326 2 – Environnement 2.1 – Avril 2012 J. Dupays. intent(out) :: code call MPI_INIT (code) ☞ Réciproquement. intent(out) :: code call MPI_FINALIZE (code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Description ☞ Tout unité de programme appelant des sous-programmes MPI doit inclure un fichier d’en-têtes. il faut maintenant utiliser le module mpi introduit dans MPI-2 (dans MPI-1. Lavallée. P. I.h). D.1 – Description 2 – Environnement 2. D. Girou. ☞ Le sous-programme MPI_INIT() permet d’initialiser l’environnement nécessaire : integer.h. Lecas.-F. Wautelet . En Fortran. le sous-programme MPI_FINALIZE() désactive cet environnement : integer.

-F. Wautelet . 0 3 1 2 4 5 6 Figure 6 – Communicateur MPI_COMM_WORLD INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. Lavallée. Le communicateur par défaut est MPI_COMM_WORLD qui comprend tous les processus actifs. D. Lecas. Girou. I. P. D.1 – Description ☞ Toutes les opérations effectuées par MPI portent sur des communicateurs.1 – Avril 2012 J. Chergui.23/326 2 – Environnement 2. P.

D. I.1 – Description ☞ À tout instant. Girou. intent(out) :: rang. Chergui. qui est un nombre compris entre 0 et la valeur renvoyée par MPI_COMM_SIZE() – 1) : integer. Wautelet .rang.code call MPI_COMM_RANK ( MPI_COMM_WORLD . son numéro d’instance. Lecas.1 – Avril 2012 J. Lavallée.e.code call MPI_COMM_SIZE ( MPI_COMM_WORLD . P. on peut connaître le nombre de processus gérés par un communicateur donné par le sous-programme MPI_COMM_SIZE() : integer.-F.code) ☞ De même. Dupays. D.24/326 2 – Environnement 2. le sous-programme MPI_COMM_RANK() permet d’obtenir le rang d’un processus (i.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. intent(out) :: nb_procs.nb_procs. P.

I.code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD .2 – Exemple 2 – Environnement 2.’ parmi ’. P.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 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Lecas. D.rang. Lavallée.-F.rang.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.’Je suis le processus ’. P.25/326 2 – Environnement 2. Wautelet .rang.1 – Avril 2012 J. Dupays.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .nb_procs. Chergui. Girou.code) print *.

. . Girou.2 Types de données de base . . . . . . . . . . . . . . . . . . .3 Autres possibilités . . . . . . . . . . . . . . .1 Notions générales . . . . . Dupays. . . . . . . . . . . 38 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . Wautelet . . . . . . . . . . . . . . 32 3. . . . . . . . . . . . . . . . . . . .26/326 3 – Communications point à point 1 Introduction 2 Environnement 3 Communications point à point 3. . . . . 27 3. . . . . .1 – Avril 2012 J. . . . . I. . . 30 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Exemple : anneau de communication . . . D. . . . . . . . . . . . P. . . . . P. Chergui. . . . . . . . . . . . . . . . . .-F. . . . . . . . . . . Lecas. . . . . . . . . . . . D. . . . . . . . . . . . . . Lavallée. . . . . . . . . . .

1 – Notions générales 3 – Communications point à point 3. P. Girou.-F. Lecas. I. Lavallée. P. Dupays. D.1 – Notions générales ☞ Une communication dite point à point a lieu entre deux processus. 0 3 1 2 Émetteur 1000 4 Récepteur 5 6 Figure 7 – Communication point à point INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. l’un appelé processus émetteur et l’autre processus récepteur (ou destinataire).1 – Avril 2012 J. D. Wautelet .27/326 3 – Communications point à point 3.

P. etc ou types dérivés personnels). Girou. ☞ Les données échangées sont typées (entiers. Wautelet . faisant appel à des protocoles différents qui seront vus au chapitre 7 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. ☞ Il existe dans chaque cas plusieurs modes de transfert.-F.1 – Notions générales ☞ L’émetteur et le récepteur sont identifiés par leur rang dans le communicateur. P. réels.28/326 3 – Communications point à point 3. D. I. ☞ Ce que l’on appelle l’enveloppe d’un message est constituée : ① du rang du processus émetteur . ④ du communicateur qui défini le groupe de processus et le contexte de communication. D.1 – Avril 2012 J. Dupays. Lecas. Chergui. Lavallée. ② du rang du processus récepteur . ③ de l’étiquette (tag) du message .

MPI_INTEGER .code) if (rang == 2) then valeur=1000 call MPI_SEND (valeur.’Moi.-F. processus 5 . j’’ai reçu ’.1.statut. Chergui.code) elseif (rang == 5) then call MPI_RECV (valeur.code) print *.1 – Avril 2012 J.valeur. D.code call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .etiquette. Wautelet .’ end if call MPI_FINALIZE (code) end program point_a_point > mpiexec -n 7 point_a_point Moi. Lecas. MPI_INTEGER . P.1.rang. parameter :: etiquette=100 integer :: rang.1 – Notions générales 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. MPI_COMM_WORLD .5. I.etiquette. Dupays. P. MPI_COMM_WORLD . Girou.valeur. processus 5. dimension( MPI_STATUS_SIZE ) :: statut integer. D.’ du processus 2.2.29/326 3 – Communications point à point 3. j’ai reçu 1000 du processus 2 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée.

D.1 – Avril 2012 J.2 – Types de données de base 3 – Communications point à point 3. Lecas. Wautelet . Chergui. I. P.30/326 3 – Communications point à point 3. P.-F.2 – Types de données de base Table 1 – Principaux types de données de base (Fortran) Type MPI MPI_INTEGER MPI_REAL MPI_DOUBLE_PRECISION MPI_COMPLEX MPI_LOGICAL MPI_CHARACTER Type Fortran INTEGER REAL DOUBLE PRECISION COMPLEX LOGICAL CHARACTER INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. Lavallée. D. Dupays.

Lecas.31/326 3 – Communications point à point 3. Lavallée. P. D.2 – Types de données de base Table 2 – Principaux types de données de base (C) 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 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. Wautelet . Chergui.-F. D. I. Dupays.1 – Avril 2012 J. P.

P.1 – Avril 2012 J. D. la zone de réception doit être forcément différente de la zone d’émission). Wautelet .-F. ☞ MPI_STATUS_IGNORE est une constante prédéfinie qui peut être utilisée à la place de la variable prévue pour récupérer en réception le statut. ☞ MPI_SUCCESS est une constante prédéfinie qui permet de tester le code de retour d’un sous-programme MPI. ☞ Une communication avec le processus « fictif » de rang MPI_PROC_NULL n’a aucun effet. Dupays. Girou. MPI_SENDRECV() et MPI_SENDRECV_REPLACE().3 – Autres possibilités ☞ À la réception d’un message. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D.3 – Autres possibilités 3 – Communications point à point 3. P. le rang du processus et l’étiquette peuvent être des « jokers ». Lavallée. ☞ Il existe des variantes syntaxiques. I. Lecas. ☞ On peut créer des structures de données plus complexes grâce à ses propres types dérivés (voir le chapitre 6). qui enchaînent un envoi et une réception (dans le premier cas.32/326 3 – Communications point à point 3. Chergui. respectivement MPI_ANY_SOURCE et MPI_ANY_TAG.

valeur.valeur. P.rang. D.1. j’’ai reçu’. D.code) ! On suppose avoir exactement 2 processus num_proc=mod(rang+1.1.-F.’.etiquette. Lavallée. & num_proc. MPI_INTEGER .num_proc. MPI_STATUS_IGNORE .code) print *. Chergui. processus’.valeur.rang.num_proc call MPI_FINALIZE (code) end program sendrecv INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.’du processus’.code :: etiquette=110 call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .parameter :: rang.2) call MPI_SENDRECV (rang+1000. Dupays. Girou.3 – Autres possibilités 1000 0 1001 1 Figure 8 – Communication sendrecv entre les processus 0 et 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 program sendrecv use mpi implicit none integer integer. P.’Moi.num_proc. MPI_COMM_WORLD .33/326 3 – Communications point à point 3.etiquette. MPI_INTEGER .code) ! Test du code de retour du sous-programme MPI_SENDRECV if (code /= MPI_SUCCESS) call MPI_ABORT ( MPI_COMM_WORLD . Lecas. I.1 – Avril 2012 J.2. Wautelet .

il faut donc absolument éviter ces cas-là. call MPI_SEND (rang+1000. Lavallée. Lecas. MPI_COMM_WORLD . En effet. MPI_INTEGER . Girou. P.-F. chacun des deux processus attendrait un ordre de réception qui ne viendrait jamais. I. Dupays.1. j’ai reçu 1000 du processus 0 Moi. Wautelet . D. Chergui. MPI_COMM_WORLD .etiquette.etiquette. Pour des raisons de respect de la norme MPI et de portabilité.34/326 3 – Communications point à point 3.code) call MPI_RECV (valeur.1 – Avril 2012 J. D. P.statut. puisque les deux envois resteraient en suspens.3 – Autres possibilités > mpiexec -n 2 sendrecv Moi. le code précédent serait en situation de verrouillage si à la place de l’ordre MPI_SENDRECV() on utilisait un ordre MPI_SEND() suivi d’un ordre MPI_RECV().num_proc. processus 1 . processus 0 .num_proc. j’ai reçu 1001 du processus 1 Attention ! Il convient de noter que si le sous-programme MPI_SEND() est implémenté de façon synchrone (voir le chapitre 7) dans l’implémentation de la version de la bibliothèque MPI mise en œuvre.1.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_INTEGER .

Lecas. Chergui. Lavallée. I.etiquette2=22 A nb_procs. D. Girou. dimension( MPI_STATUS_SIZE ):: integer :: integer.:) = 0 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.code statut nb_elements.nb_procs.etiquette1=11.rang.-F. P.rang. Dupays. dimension(:).3 – Autres possibilités 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 program joker use mpi implicit none integer. allocatable :: m=4.35/326 3 – Communications point à point 3.code) A(:.m) :: integer :: integer. parameter :: integer. Wautelet . D.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .i C call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD .1 – Avril 2012 J. P. dimension(m.

Girou.etiquette2.-F.2). MPI_COMM_WORLD . Lavallée.nb_elements.rang .1. P.code) ! On regarde combien il y a d’éléments à recevoir call MPI_GET_ELEMENTS (statut. Chergui.nb_elements.code) ! Envoi de 3 éléments de la matrice A au processus 2 call MPI_SEND (A(1. ’Mon tableau C vaut ’.’éléments du processus ’. (/ m.1 – Avril 2012 J. MPI_COMM_WORLD .i=1.nb_elements. P. & MPI_COMM_WORLD .3 – Autres possibilités 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(:. C(:) end if call MPI_FINALIZE (code) end program joker INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2.2.1). MPI_INTEGER .statut.’Moi processus ’. MPI_INTEGER .code) else ! On teste avant la réception si le message est arrivé et de qui call MPI_PROBE ( MPI_ANY_SOURCE .code) ! On alloue le tableau de réception C sur chaque processus if (nb_elements /= 0 ) allocate (C(1:nb_elements)) ! On reçoit le message call MPI_RECV (C.:) = reshape((/ (i. MPI_INTEGER . & statut( MPI_SOURCE ).etiquette1.m*m) /).3.statut( MPI_TAG ). D. Wautelet .code) print *.statut. Dupays.m /)) ! Envoi de 2 éléments de la matrice A au processus 1 call MPI_SEND (A(1. D. Lecas. MPI_INTEGER . MPI_ANY_TAG . I.36/326 3 – Communications point à point 3. MPI_COMM_WORLD .’je reçois ’.statut( MPI_SOURCE ).

D. P. Lecas.1 – Avril 2012 J. Girou. Wautelet .3 – Autres possibilités > mpiexec -n 3 sendrecv1 Moi processus 1 je reçois Moi processus 2 je reçois 2 3 éléments du processus éléments du processus 0 0 Mon tableau C vaut Mon tableau C vaut 1 2 5 6 7 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Chergui. Dupays. I. D.37/326 3 – Communications point à point 3. Lavallée.-F.

4 – Exemple : anneau de communication 1000 0 1002 1006 1 1003 2 3 1004 1001 1005 4 5 6 Figure 9 – Anneau de communication INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. P. I. Dupays.38/326 3 – Communications point à point 3. Chergui.-F. Lecas. D.4 – Exemple : anneau de communication 3 – Communications point à point 3. P. Wautelet . Girou. D. Lavallée.

code) call MPI_RECV (valeur.etiquette.39/326 3 – Communications point à point 3. P..4 – Exemple : anneau de communication Si tous les processus font un envoi puis une réception..code) .1 – Avril 2012 J. toutes les communications pourront potentiellement démarrer simultanément et n’auront donc pas lieu en anneau (outre le problème déjà mentionné de portabilité. D.-F. Dupays. MPI_COMM_WORLD .. MPI_INTEGER . INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4..num_proc_precedent. I.1.num_proc_suivant. MPI_COMM_WORLD .1. Lavallée. & statut. D. Chergui. Lecas. MPI_INTEGER .etiquette. Wautelet . Girou. valeur=rang+1000 call MPI_SEND (valeur. au cas où l’implémentation du MPI_SEND() est faite de façon synchrone dans la version de la bibliothèque MPI mise en œuvre) : . P.

Lavallée. il faut procéder différemment et faire en sorte qu’un processus initie la chaîne : 1006 0 1000 6 1005 1 1001 5 1004 2 4 1003 3 1002 Figure 10 – Anneau de communication INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas.40/326 3 – Communications point à point 3. D.1 – Avril 2012 J. P. Girou. à l’image d’un passage de jeton entre processus.4 – Exemple : anneau de communication Pour que les communications se fassent réellement en anneau. Chergui.-F. D. Wautelet . Dupays. I. P.

statut.41/326 3 – Communications point à point 3. D.statut. P.nb_procs) num_proc_precedent=mod(nb_procs+rang-1. j’’ai reçu ’.rang.code) call MPI_SEND (rang+1000. & MPI_COMM_WORLD .1.etiquette.rang. Lecas.’.num_proc_suivant.’ du proc. P.num_proc_suivant. Dupays. Wautelet .-F. parameter :: etiquette=100 integer :: nb_procs.code) num_proc_suivant=mod(rang+1. Lavallée. & MPI_COMM_WORLD . D. ’.code) call MPI_RECV (valeur.num_proc_precedent call MPI_FINALIZE (code) end program anneau INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_INTEGER .nb_procs.1 – Avril 2012 J. Girou.rang. & MPI_COMM_WORLD .1. MPI_INTEGER . I.code) else call MPI_RECV (valeur.’Moi.num_proc_precedent. dimension( MPI_STATUS_SIZE ) :: statut integer.4 – Exemple : anneau de communication 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.num_proc_suivant.nb_procs) if (rang == 0) then call MPI_SEND (rang+1000.code) call MPI_COMM_RANK ( MPI_COMM_WORLD . ’.1.num_proc_precedent. & num_proc_precedent. MPI_INTEGER .code) end if print *.1. & MPI_COMM_WORLD . proc.etiquette.valeur. MPI_INTEGER .etiquette.etiquette.valeur.code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . Chergui.

proc. proc. Moi. 0. Moi. proc. D. proc. 2. proc. proc. P. Moi.42/326 3 – Communications point à point 3. proc. j’ai j’ai j’ai j’ai j’ai j’ai j’ai reçu reçu reçu reçu reçu reçu reçu 1000 1001 1002 1003 1004 1005 1006 du du du du du du du proc. P. Dupays. I. proc. Chergui. proc. 0 1 2 3 4 5 6 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 3. Lecas. 5. Lavallée. 4. proc. proc. 1.4 – Exemple : anneau de communication > mpiexec -n 7 anneau Moi. Moi. Moi. 6.-F.1 – Avril 2012 J. Moi. proc. Girou. D. proc. Wautelet .

. P. . . . . . . . . . . . . . . . . . . . . .1 Notions générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4. . . . . . P. . . . . . . 55 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4. . . . . . . . . . Dupays. . . .43/326 4 – Communications collectives 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.5 Collecte : MPI_GATHER() . . . . . . . . . . . . . . . . 47 4. . . . . . . . . 61 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Collecte générale : MPI_ALLGATHER() . . I. . . Wautelet . . . . . . . . . . . . Lecas. . . . 53 4. .-F. .1 – Avril 2012 J. . . .4 Diffusion sélective : MPI_SCATTER() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Échanges croisés : MPI_ALLTOALL() . . . . . . . . . . . . . . . . . . . . . . . . 58 4. . . . . . . . . . . . .10 Compléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Synchronisation globale : MPI_BARRIER() . . . . . . . . . .7 Collecte : MPI_GATHERV() . . 49 4. . . . . . .3 Diffusion générale : MPI_BCAST() . . Girou. . Chergui. . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Réductions réparties . . . . . . . . . . . . D.

au sens des communications point-à-point (donc quand la zone mémoire concernée peut être modifiée). Chergui. Dupays. Cela a entre autres pour avantage que les communications collectives n’interfèrent jamais avec les communications point à point. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. ☞ La gestion des étiquettes dans ces communications est transparente et à la charge du système. D. Lecas. ☞ Pour chacun des processus.-F. P. Elles ne sont donc jamais définies explicitement lors de l’appel à ces sous-programmes. ☞ Il est inutile d’ajouter une synchronisation globale (barrière) après une opération collective. Girou. l’appel se termine lorsque la participation de celui-ci à l’opération collective est achevée.1 – Notions générales 4 – Communications collectives 4.1 – Notions générales ☞ Les communications collectives permettent de faire en une seule opération une série de communications point à point. ☞ Une communication collective concerne toujours tous les processus du communicateur indiqué.44/326 4 – Communications collectives 4.1 – Avril 2012 J. P. D. Lavallée. Wautelet .

Dupays. D. I. D. en plus de la gestion des communications. Lavallée.1 – Avril 2012 J. qu’elles soient d’un type prédéfini ou d’un type personnel : MPI_REDUCE() . Wautelet .1 – Notions générales ☞ Il y a trois types de sous-programmes : ❶ celui qui assure les synchronisations globales : MPI_BARRIER(). effectuent des opérations sur les données transférées : ❏ opérations de réduction (somme. Girou. maximum. Chergui. ❏ collecte de données réparties : MPI_GATHER() . Lecas. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.). ❏ diffusion sélective. P. de données réparties : MPI_ALLTOALL(). ❏ collecte par tous les processus de données réparties : MPI_ALLGATHER() . ❏ diffusion sélective de données : MPI_SCATTER() . ❏ opérations de réduction avec diffusion du résultat (équivalent à un MPI_REDUCE() suivi d’un MPI_BCAST()) : MPI_ALLREDUCE(). ❷ ceux qui ne font que transférer des données : ❏ diffusion globale de données : MPI_BCAST() . minimum.-F. P. produit. etc. par tous les processus.45/326 4 – Communications collectives 4. ❸ ceux qui.

P. P. Lavallée. Dupays.2 – Synchronisation globale : MPI_BARRIER() 4 – Communications collectives P0 P1 P2 P3 4. intent(out) :: code call MPI_BARRIER ( MPI_COMM_WORLD .46/326 4 – Communications collectives 4. Girou. D.1 – Avril 2012 J. I. Lecas.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 – Synchronisation globale : MPI_BARRIER() P0 P1 P2 P3 P0 P1 P2 P3 Barrière Figure 11 – Synchronisation globale : MPI_BARRIER() integer.-F. Wautelet . D. Chergui.

Girou.1 – Avril 2012 J. D. Lavallée. Wautelet .3 – Diffusion générale : MPI_BCAST() 0 A A A A 1 2 3 P0 P1 P2 A P3 MPI_BCAST() P0 A P1 A P2 A P3 A Figure 12 – Diffusion générale : MPI_BCAST() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas.47/326 4 – Communications collectives 4.3 – Diffusion générale : MPI_BCAST() 4 – Communications collectives 4. Chergui.-F. I. P. P. D. Dupays.

Lecas. P. Dupays. j’’ai reçu ’.’Moi. processus ’. 1.rang. I. 0.code) if (rang == 2) valeur=rang+1000 call MPI_BCAST (valeur. Moi. D. 3. Wautelet .’. Moi.code call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .valeur. D. Girou. Lavallée. processus processus processus processus 2.48/326 4 – Communications collectives 4. Moi.1.3 – Diffusion générale : MPI_BCAST() 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.code) print *.2.’ du processus 2’ call MPI_FINALIZE (code) end program bcast > mpiexec -n 4 bcast Moi.valeur. Chergui.1 – Avril 2012 J. j’ai j’ai j’ai j’ai reçu reçu reçu reçu 1002 1002 1002 1002 du du du du processus processus processus processus 2 2 2 2 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. MPI_INTEGER . MPI_COMM_WORLD .rang.-F.

4 – Diffusion sélective : MPI_SCATTER() 4 – Communications collectives 4. P. I. Wautelet . D. Lavallée. Dupays.1 – Avril 2012 J.4 – Diffusion sélective : MPI_SCATTER() 0 A1 A0 A2 A3 1 2 3 P0 P1 P2 A0 A1 A2 A3 P3 MPI_SCATTER() P0 A0 P1 A1 P2 A2 P3 A3 Figure 13 – Diffusion sélective : MPI_SCATTER() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou.49/326 4 – Communications collectives 4. P. D. Chergui. Lecas.-F.

i. 1002.longueur_tranche. D. processus processus processus processus 0. j’ai j’ai j’ai j’ai reçu reçu reçu reçu 1001. Moi.rang. Wautelet . MPI_COMM_WORLD . parameter :: nb_valeurs=8 integer :: nb_procs. donnees(1:longueur_tranche).& valeurs(1:nb_valeurs) end if call MPI_SCATTER (valeurs. Girou.nb_procs. j’’ai reçu ’. MPI_REAL . P. & ’ du processus 2’ call MPI_FINALIZE (code) end program scatter > mpiexec -n 4 scatter Moi. 1008.code real. Chergui.’envoie mon tableau valeurs : ’. du du du du processus processus processus processus 2 2 2 2 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.longueur_tranche.’Moi. 1007.nb_valeurs)/) print *.+i. & MPI_REAL . allocatable. 1003.code) print *. 1005. 2. processus ’. dimension(:) :: valeurs. Moi. D. Moi. 1004.i=1.2.’Moi.rang.rang. 1006. 1004.-F.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .donnees.1 – Avril 2012 J. processus 2 envoie mon tableau valeurs : 1001. P. 1003.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 4. Dupays.’. 1. processus ’. 1005.4 – Diffusion sélective : MPI_SCATTER() program scatter use mpi implicit none integer.donnees call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . Lavallée. 1008. 1007.rang. Lecas. I. 3.code) longueur_tranche=nb_valeurs/nb_procs allocate(donnees(longueur_tranche)) if (rang == 2) then allocate(valeurs(nb_valeurs)) valeurs(:)=(/(1000.longueur_tranche. 1006. 1002. Moi.

51/326 4 – Communications collectives 4. P. Chergui. D.5 – Collecte : MPI_GATHER() 0 A1 A0 A2 A3 1 2 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 DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas. Lavallée.1 – Avril 2012 J. D. P. Wautelet . Dupays.5 – Collecte : MPI_GATHER() 4 – Communications collectives 4. I.-F. Girou.

-F.’Moi.rang. processus 2 . processus Moi. D. P.1 – Avril 2012 J.code) if (rang == 2) print *.i. 1004.rang.+rang*longueur_tranche+i.longueur_tranche.’envoie mon tableau valeurs : ’. 1008. : 1005. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas.2. 1004.code) call MPI_COMM_RANK ( MPI_COMM_WORLD . parameter integer real.longueur_tranche. processus ’.5 – Collecte : MPI_GATHER() program gather use mpi implicit none integer. MPI_COMM_WORLD . processus Moi. j’ai reçu 1001.donnees(1:nb_valeurs) call MPI_FINALIZE (code) end program gather > mpiexec -n 4 Moi. I. : 1007. Girou.longueur_tranche. 1006. MPI_REAL .’Moi.longueur_tranche)/) print *. allocatable.i=1. dimension(:) :: :: :: :: nb_valeurs=8 nb_procs. P. processus Moi. 1003. & MPI_REAL .code) longueur_tranche=nb_valeurs/nb_procs allocate(valeurs(longueur_tranche)) valeurs(:)=(/(1000. Moi.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 4.donnees. 1005. dimension(nb_valeurs) real. 1002. Wautelet .& valeurs(1:longueur_tranche) call MPI_GATHER (valeurs.code donnees valeurs call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . 1002.rang. Dupays. ’j’’ai reçu ’. processus 2’. processus gather 1 envoie 0 envoie 2 envoie 3 envoie mon mon mon mon tableau tableau tableau tableau valeurs valeurs valeurs valeurs : 1003. 1006. 1008. D. 1007. : 1001. Chergui.nb_procs.

Girou. P. Wautelet . Dupays. P. D.6 – Collecte générale : MPI_ALLGATHER() 4 – Communications collectives 4. D. Lavallée.6 – Collecte générale : MPI_ALLGATHER() A0 A0 A1 A1 A0 0 A2 A1 A3 A1 A3 A2 A0 A2 1 2 A2 A3 3 P0 A0 P1 A1 P2 A2 P3 A3 INSTITUT DU DÉVELOPPEMENT 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 Figure 15 – Collecte générale : MPI_ALLGATHER() MPI – Version 4. I. Chergui.53/326 4 – Communications collectives 4. Lecas.1 – Avril 2012 J.-F.

& MPI_REAL .rang. P.i=1. Wautelet . 1001.nb_procs.rang. Moi. 3.longueur_tranche)/) call MPI_ALLGATHER (valeurs. Lavallée. allocatable. processus processus processus processus 1. P. 1006.code) print *. 1003. dimension(:) call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD .’Moi. 1001.rang. 1008. 1004.longueur_tranche.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 4. 1005. 2. Girou. 1002. Moi. I. 1003. 1008. dimension(nb_valeurs) real.donnees(1:nb_valeurs)’ call MPI_FINALIZE (code) end program allgather > mpiexec -n 4 allgather Moi. 1008. 1004. 1008. 1006. Lecas. 1004.code donnees valeurs INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 1007. 1002. Dupays. 1001. D. :: :: :: :: nb_valeurs=8 nb_procs. MPI_COMM_WORLD . 1005. 1002. 1005. 1002.donnees. 1006.longueur_tranche. 1003. processus ’.code) longueur_tranche=nb_valeurs/nb_procs allocate(valeurs(longueur_tranche)) valeurs(:)=(/(1000.code) call MPI_COMM_RANK ( MPI_COMM_WORLD . 1007. 1004. 1007.+rang*longueur_tranche+i. 1006. 0. Chergui. j’’ai reçu ’. j’ai j’ai j’ai j’ai reçu reçu reçu reçu 1001.i. parameter integer real. D.’.1 – Avril 2012 J. 1007. MPI_REAL . 1005.longueur_tranche.-F. Moi.6 – Collecte générale : MPI_ALLGATHER() program allgather use mpi implicit none integer. 1003.

Girou. I. Dupays. Wautelet . Lavallée. P.7 – Collecte : MPI_GATHERV() 0 A1 A0 A2 A3 1 2 3 P0 P1 P2 P3 A0 A1 A2 A3 MPI_GATHERV() P0 P1 P2 P3 Figure 16 – Collecte : MPI_GATHERV() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE A0 A1 A2 A3 MPI – Version 4.1 – Avril 2012 J. Chergui.7 – Collecte : MPI_GATHERV() 4 – Communications collectives 4.-F. P. D. Lecas. D.55/326 4 – Communications collectives 4.

Wautelet . Girou. i. Dupays.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 4. D.-F. dimension(nb_valeurs) real.nb_procs. allocatable.& valeurs(1:longueur_tranche) IF (rang == 2) THEN ALLOCATE(nb_elements_recus(nb_procs).code) call MPI_COMM_RANK ( MPI_COMM_WORLD .’envoie mon tableau valeurs : ’. parameter integer real.longueur_tranche)/) PRINT *.rang. & i=1.reste)+i. allocatable. processus ’. rang.code) longueur_tranche=nb_valeurs/nb_procs reste = mod(nb_valeurs.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 DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.nb_procs) if (reste > rang) longueur_tranche = longueur_tranche+1 ALLOCATE(valeurs(longueur_tranche)) valeurs(:) = (/(1000. dimension(:) :: :: :: :: :: nb_valeurs=10 nb_procs. rang. D. Chergui.1 – Avril 2012 J. I. Lecas. ’Moi.+(rang*(nb_valeurs/nb_procs))+min(rang. dimension(:) integer. Lavallée.deplacements call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . code donnees valeurs nb_elements_recus.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.7 – Collecte : MPI_GATHERV() program gatherv use mpi implicit none integer. P. P. longueur_tranche.

donnees. Moi. 1002. 1004. 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. 1005. Moi. Moi. Girou. 1006. 1007. Dupays. 1010. 1007. D.& deplacements. ’Moi. 1010. 1004. 1008.2. Wautelet . 1008. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.code) IF (rang == 2) PRINT *. 1003. Chergui.1 – Avril 2012 J. 1009. I.nb_elements_recus. Lecas. Moi. processus 2 je reçois 1009. 1003. Lavallée. processus 2 je recois’. MPI_REAL . D.57/326 4 – Communications collectives 4. donnees(1:nb_valeurs) CALL MPI_FINALIZE (code) end program gatherv > mpiexec -n 4 gatherv Moi. MPI_COMM_WORLD .longueur_tranche. P. P. 1002. 1005. 1001. 1006. MPI_REAL .7 – Collecte : MPI_GATHERV() CALL MPI_GATHERV (valeurs.-F.

D.-F. P. Lavallée. D. Dupays.1 – Avril 2012 J.8 – Échanges croisés : MPI_ALLTOALL() 4 – Communications collectives 4. Wautelet . Chergui. I.8 – Échanges croisés : MPI_ALLTOALL() A0 A1 B1 B0 A3 0 C1 B2 D1 B3 D0 C0 A2 C2 1 2 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() Figure 17 – Échanges croisés : MPI_ALLTOALL() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. P. Lecas.58/326 4 – Communications collectives 4.

rang.8 – Échanges croisés : MPI_ALLTOALL() 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.longueur_tranche. MPI_REAL .donnees(1:nb_valeurs) call MPI_FINALIZE (code) end program alltoall INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet . & MPI_REAL .’Moi. & valeurs(1:nb_valeurs) call MPI_ALLTOALL (valeurs. j’’ai reçu ’.-F. P. I.longueur_tranche. dimension(nb_valeurs) :: nb_valeurs=8 :: nb_procs. D.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .+rang*nb_valeurs+i.nb_procs. Chergui. Lecas.59/326 4 – Communications collectives 4.’envoie mon tableau valeurs : ’.’Moi.rang.donnees.code) print *.i=1. processus ’.longueur_tranche.code :: valeurs.i.code) valeurs(:)=(/(1000.’.rang. Dupays. processus ’. D.1 – Avril 2012 J.rang. P.nb_valeurs)/) longueur_tranche=nb_valeurs/nb_procs print *. Girou. Lavallée. MPI_COMM_WORLD .donnees call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . parameter integer real.

Chergui. D. 1028. 1022.8 – Échanges croisés : MPI_ALLTOALL() > mpiexec -n 4 alltoall Moi. 1015. 1032. 1007. Moi. j’ai j’ai j’ai j’ai reçu reçu reçu reçu 1001. 1014. 1006. 1008. 1. 1030. Lecas. P. 1021. 1010. Moi. I. Wautelet . processus 3 envoie mon tableau valeurs : 1025. 1027. 1019. 1031. 1014. 1005. 1020. processus processus processus processus 0. 1007. 1028. processus 0 envoie mon tableau valeurs : 1001. 1015. Moi. 1023. 1003. 1029. 1012. 1027. processus 2 envoie mon tableau valeurs : 1017. 1019. 1012. 1004. 1026. Dupays. 1017. Moi. 1023. 1008.1 – Avril 2012 J. 1032. 1029. P. 1009. 1005. Moi. 1011.-F. 2. 1020. 1010. Lavallée. Moi. 1018. 1021. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 1011. 1003. 1013. D. 1018. 1022. 1024.60/326 4 – Communications collectives 4. 1024. 1006. 1004. 1016. 1002. 1031. 1016. 1013. Moi. 1030. 1026. 3. processus 1 envoie mon tableau valeurs : 1009. 1025. 1002. Girou.

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet . ☞ MPI propose des sous-programmes de haut-niveau pour opérer des réductions sur des données réparties sur un ensemble de processus. Des exemples typiques sont la somme des éléments d’un vecteur SUM(A(:)) ou la recherche de l’élément de valeur maximum dans un vecteur MAX(V(:)). les processus précédents du communicateur et lui-même. Le résultat est obtenu sur un seul processus (MPI_REDUCE()) ou bien sur tous (MPI_ALLREDUCE(). D. P. P. Chergui.1 – Avril 2012 J. ☞ Si plusieurs éléments sont concernés par processus.61/326 4 – Communications collectives 4. la fonction de réduction est appliquée à chacun d’entre eux. ☞ Les sous-programmes MPI_OP_CREATE() et MPI_OP_FREE() permettent de définir des opérations de réduction personnelles. Lecas.9 – Réductions réparties ☞ Une réduction est une opération appliquée à un ensemble d’éléments pour en obtenir une seule valeur. I. Girou. Lavallée.-F. ☞ Le sous-programme MPI_SCAN() permet en plus d’effectuer des réductions partielles en considérant. Dupays. qui est en fait équivalent à un MPI_REDUCE() suivi d’un MPI_BCAST()). D.9 – Réductions réparties 4 – Communications collectives 4. pour chaque processus.

Lavallée. Chergui. P. Lecas. P. Girou.-F. Wautelet . I. D. D.62/326 4 – Communications collectives 4.1 – Avril 2012 J.9 – Réductions réparties Table 3 – Principales opérations de réduction prédéfinies (il existe aussi d’autres opérations logiques) Nom MPI_SUM MPI_PROD MPI_MAX MPI_MIN MPI_MAXLOC MPI_MINLOC MPI_LAND MPI_LOR MPI_LXOR Opération Somme des éléments Produit des éléments Recherche du maximum Recherche du minimum Recherche de l’indice du maximum Recherche de l’indice du minimum ET logique OU logique OU exclusif logique INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays.

D. Lavallée. I. P.63/326 4 – Communications collectives 4. Lecas. Wautelet . P.-F. Dupays.9 – Réductions réparties 1000+1+2+3+4+5+6 = 1021 1 0 1 4 2 3 2 5 3 6 4 5 6 Figure 18 – Réduction répartie (somme) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. Chergui. Girou. D.

MPI_SUM .somme.code) if (rang == 0) then valeur=1000 else valeur=rang endif call MPI_REDUCE (valeur.rang.code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . P. MPI_COMM_WORLD .rang. processus 0 . I.somme end if call MPI_FINALIZE (code) end program reduce > mpiexec -n 7 reduce Moi. Lavallée. D.64/326 4 – Communications collectives 4. Wautelet . P.somme.code) call MPI_COMM_RANK ( MPI_COMM_WORLD . Dupays.’Moi. Lecas.code) if (rang == 0) then print *. MPI_INTEGER . j’ai pour valeur de la somme globale 1021 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou.nb_procs.-F. j’’ai pour valeur de la somme globale ’.1.valeur.0.9 – Réductions réparties 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. D.1 – Avril 2012 J. Chergui. processus 0.

Girou. D. I. Dupays. Lecas. P.-F.1 – Avril 2012 J. Wautelet . D.9 – Réductions réparties 7200 10×1×2×3×4 ×5×6 = 7200 7200 1 0 1 7200 7200 2 5 3 7200 2 3 6 7200 4 4 7200 5 6 Figure 19 – Réduction répartie (produit) avec diffusion du résultat INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. P.65/326 4 – Communications collectives 4. Lavallée.

MPI_INTEGER . P. Girou. I. MPI_PROD .nb_procs. j’’ai reçu la valeur du produit global ’.9 – Réductions réparties 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.rang.code) print *.code call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . MPI_COMM_WORLD .valeur.produit.’.1 – Avril 2012 J.’Moi.rang. Chergui. D. processus ’.code) if (rang == 0) then valeur=10 else valeur=rang endif call MPI_ALLREDUCE (valeur. Lecas. D.1. P.66/326 4 – Communications collectives 4.produit.produit call MPI_FINALIZE (code) end program allreduce INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays.-F. Wautelet . Lavallée.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .

Lavallée. 4. Wautelet . 5. Chergui. processus processus processus processus processus processus processus 6. Dupays. Moi. 3.1 – Avril 2012 J. Girou. P.-F. Moi. P. Moi.67/326 4 – Communications collectives 4. 0. 2. Moi.9 – Réductions réparties > mpiexec -n 7 allreduce Moi. Lecas. j’ai j’ai j’ai j’ai j’ai j’ai j’ai reçu reçu reçu reçu reçu reçu reçu 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 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. Moi. D. 1. Moi. D.

Lavallée. MPI_ALLGATHERV() et MPI_ALLTOALLV() étendent MPI_SCATTER().10 – Compléments 4 – Communications collectives 4. qui elle est inclusive. D. Girou. MPI_GATHER().-F. I. ☞ Deux nouveaux sous-programmes ont été ajoutés pour étendre les possibilités des sous-programmes collectifs dans quelques cas particuliers : ➳ MPI_ALLTOALLW() : version de MPI_ALLTOALLV() où les déplacements sont exprimés en octets et non en éléments. MPI_ALLGATHER() et MPI_ALLTOALL() au cas où le nombre d’éléments à diffuser ou collecter est différent suivant les processus.1 – Avril 2012 J.10 – Compléments ☞ Les sous-programmes MPI_SCATTERV(). D. P. P. Dupays. ➳ MPI_EXSCAN() : version exclusive de MPI_SCAN(). MPI_GATHERV(). Wautelet . Chergui. Lecas. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.68/326 4 – Communications collectives 4.

. . . . . . . . . . . 70 5. . . . . . . . . . . . 78 5. . . . . . . . . .3 Approche RMA de MPI . . 73 5. . . . . . . . . . . . . . . 96 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . Lavallée. . 71 5. . . . . . . . . . . . . . . . . .1 Rappel : concept de l’échange de messages . . . . . . . . . . . . . . . . . . . . . . . . . I. . . . . . . . . .2 Notion de fenêtre mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chergui. . . . . . . . . . . 92 5. . . . . . .3 Transfert des données . . . . . . . . .69/326 5 – Copies de mémoire à mémoire 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 5. . . . . . . . . . . . . . . . . . . . 74 5. . . . . . . . . . .2 Synchronisation de type cible passive . . .5 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Introduction . . . . . . . . . . . . .4 Achèvement du transfert : la synchronisation . 82 5. 72 5.1 – Avril 2012 J. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dupays. . . . . . . . . . . . . . . . . P. . . 83 5. . . . . . . . . . . . . .1 Synchronisation de type cible active . .-F. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4. . . . Girou. . . . . . . . . . . . . . . . . . . Lecas. .1.4. . . . . . D. . . . Wautelet . . .1. . . . . . . P.2 Concept des copies de mémoire à mémoire . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . .

-F. Parmi les plus utilisées. Appelées RMA pour Remote Memory Access ou OSC pour One Sided Communication. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. etc. c’est l’un des apports majeurs de MPI.) . ➋ les communications par copies de mémoire à mémoire (accès direct à la mémoire d’un processus distant).1 – Introduction Diverses approches existent pour transférer des données entre deux processus distincts. Dupays.70/326 5 – Copies de mémoire à mémoire 5. I. D. P.1 – Introduction 5 – Copies de mémoire à mémoire 5. Lavallée. on trouve : ➊ les communications point à point par échange de messages (MPI. P. Chergui. Lecas. D. Girou.1 – Avril 2012 J. Wautelet .

1 – Introduction 5.1 – Rappel : concept de l’échange de messages 0 source J’envoie source 1 cible Je reçois dans cible Figure 20 – L’échange de messages Dans le concept de l’échange de messages. Ceci peut être contraignant et difficile à mettre en œuvre dans certains algorithmes (par exemple lorsqu’il faut gérer un compteur global).1 – Avril 2012 J. Lecas.-F. P. Cela nécessite que l’émetteur comme le destinataire prennent part à la communication. Wautelet . Lavallée.71/326 5 – Copies de mémoire à mémoire 5. I. un émetteur (source) va envoyer un message à un processus destinataire (cible) qui va faire la démarche de recevoir ce message. P. Girou. D.1 – Introduction 5 – Copies de mémoire à mémoire 5. Dupays.1. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. D.

Girou.. Lecas. P. Wautelet . MPI ayant simplement unifié les solutions constructeurs déjà existantes (telles que shmem (CRAY).1 – Avril 2012 J. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P.1 – Introduction 5 – Copies de mémoire à mémoire 5. un processus a directement accès (en lecture. Les principaux avantages sont les suivants : ☞ des performances améliorées lorsque le matériel le permet.. lapi (IBM). Dans cette approche. Chergui. Dupays. le processus distant n’a donc pas à intervenir dans la procédure de transfert des données. .1. I. écriture ou mise à jour) à la mémoire d’un autre processus distant.72/326 5 – Copies de mémoire à mémoire 5.-F.) en proposant ses propres primitives RMA. Via ces sous-programmes. Lavallée. ☞ une programmation plus simple de certains algorithmes. D. D.1 – Introduction 5.2 – Concept des copies de mémoire à mémoire Le concept de communication par copies de mémoire à mémoire n’est pas nouveau.

-F. ➋ déclenchement du transfert des données directement de la mémoire d’un processus à celle d’un autre processus.1. Il faut alors spécifier le type. Lecas.3 – Approche RMA de MPI L’approche RMA de MPI peut être divisée en trois étapes successives : ➊ définition sur chaque processus d’une zone mémoire (fenêtre mémoire locale) visible et susceptible d’être accédée par des processus distants . ➌ achèvement des transferts en cours par une étape de synchronisation.1 – Avril 2012 J. P. Lavallée. le nombre et la localisation initiale et finale des données. I. D. D. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet . Dupays. les données étant alors réellement disponibles pour les calculs.73/326 5 – Copies de mémoire à mémoire 5. Chergui. Girou. P.1 – Introduction 5.1 – Introduction 5 – Copies de mémoire à mémoire 5.

une fenêtre mémoire locale est caractérisée par son adresse de départ. Wautelet . c’est la notion de fenêtre mémoire. D. Ces caractéristiques peuvent être différentes sur chacun des processus. P. d’une zone mémoire spécifique appelée fenêtre mémoire locale. P. I. sa taille en octets (qui peut être nulle) et la taille de l’unité de déplacement à l’intérieur de cette fenêtre (en octets). l’opération collective MPI_WIN_CREATE() permet la création d’un objet MPI fenêtre.2 – Notion de fenêtre mémoire Tous les processus prenant part à une opération de copie de mémoire à mémoire doivent spécifier quelle partie de leur mémoire va être accessible aux autres processus . Au niveau de chaque processus.2 – Notion de fenêtre mémoire 5 – Copies de mémoire à mémoire 5.-F. Lecas.74/326 5 – Copies de mémoire à mémoire 5. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée. pour chaque processus. Cet objet est composé. ☞ Plus précisément. Dupays. Chergui. D.1 – Avril 2012 J. Girou.

Lavallée. Girou. D. Lecas. P. P. D.75/326 5 – Copies de mémoire à mémoire 5.1 – Avril 2012 J.-F. Chergui. Wautelet . Dupays. I. win1 et win2 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 – Notion de fenêtre mémoire Exemple : Objet MPI fenêtre win1 0 Première fenêtre locale Deuxième fenêtre locale Première fenêtre locale 1 Deuxième fenêtre locale Objet MPI fenêtre win2 Figure 21 – Création de deux objets MPI fenêtre.

on doit libérer la fenêtre avec le sous-programme MPI_WIN_FREE().1 – Avril 2012 J. Remarque : ☞ Le choix de l’unité de déplacement associée à la fenêtre mémoire locale est important (indispensable dans un environnement hétérogène et facilitant le codage dans tous les cas). Lavallée. I. D. Wautelet . L’obtention de la taille d’un type MPI prédéfini se fait en appelant le sous-programme MPI_TYPE_SIZE().76/326 5 – Copies de mémoire à mémoire 5. Girou.2 – Notion de fenêtre mémoire ☞ Une fois les transferts terminés. MPI_WIN_SIZE ou MPI_WIN_DISP_UNIT. Dupays. P. P. ☞ MPI_WIN_GET_ATTR() permet de connaître les caractéristiques d’une fenêtre mémoire locale en utilisant les mots clés MPI_WIN_BASE. D.-F. Lecas. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui.

unite = ". unite call MPI_FINALIZE (code) end program fenetre > mpiexec -n 3 processus 1 processus 0 processus 2 fenetre taille. I. Lecas. code) call MPI_WIN_GET_ATTR (win. n=4 integer (kind= MPI_ADDRESS_KIND ) :: dim_win. MPI_WIN_BASE ."processus". & MPI_COMM_WORLD . P."taille. Lavallée. base. D. dimension(:). MPI_INFO_NULL .1 – Avril 2012 J.code) print *. MPI_WIN_DISP_UNIT . base. base. flag.d0)). win. base. unite real(kind=kind(1.-F. taille_reel. taille. P. dim_win. unite. unite = 32 17248330400 0 2 8 32 17248330400 8 8 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.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 5 – Copies de mémoire à mémoire 5. base. base. Wautelet . MPI_WIN_SIZE . rang. taille_reel. flag. allocatable :: win_local logical :: flag call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . unite = taille. rang. Girou. win. code) call MPI_WIN_FREE (win. code) call MPI_WIN_GET_ATTR (win. taille. unite = taille.code) if (rang==0) n=0 allocate(win_local(n)) dim_win = taille_reel*n call MPI_WIN_CREATE (win_local. flag. base. Chergui.2 – Notion de fenêtre mémoire program fenetre use mpi implicit none integer :: code. code) call MPI_WIN_GET_ATTR (win. rang. Dupays. & taille. D.taille_reel. code) call MPI_TYPE_SIZE ( MPI_DOUBLE_PRECISION .

Wautelet . I.1 – Avril 2012 J. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D.3 – Transfert des données MPI permet à un processus de lire (MPI_GET()).3 – Transfert des données 5 – Copies de mémoire à mémoire 5. le processus cible n’appelle aucun sous-programme MPI.78/326 5 – Copies de mémoire à mémoire 5. Chergui. Toutes les informations nécessaires sont spécifiées sous forme de paramètres lors de l’appel au sous-programme MPI par l’origine. d’écrire (MPI_PUT()) et de mettre à jour (MPI_ACCUMULATE()) des données situées dans la fenêtre mémoire locale d’un processus distant. Lors de l’initialisation du transfert. On nomme origine le processus qui fait l’appel au sous-programme d’initialisation du transfert et cible le processus qui possède la fenêtre mémoire locale qui va être utilisée dans la procédure de transfert. P. Girou. P.-F. Dupays. D. Lavallée. Lecas.

1 – Avril 2012 J. ☞ des paramètres ayant rapport à la cible : le rang de la cible ainsi que l’objet MPI fenêtre.3 – Transfert des données En particulier. P. I. D. Girou. un déplacement dans cette fenêtre locale .-F. D. l’adresse mémoire du premier élément. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet . Dupays.79/326 5 – Copies de mémoire à mémoire 5. ce qui détermine de façon unique une fenêtre mémoire locale . Chergui. P. on trouve : ☞ des paramètres ayant rapport à l’origine : le type des éléments . Lavallée. leur nombre . le nombre et le type des données à transférer. Lecas.

MPI_INTEGER . Wautelet . P.nb_cible. I. Lecas. nb_cible=10. Girou... D. MPI_INTEGER .cible. end program exemple_put Déplacement de 40 unités dans la fenêtre locale 1 0 Première fenêtre locale Première fenêtre locale B(1 :10) Figure 22 – Exemple d’un MPI_PUT INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F. code integer (kind= MPI_ADDRESS_KIND ) :: deplacement=40 integer.1 – Avril 2012 J.win. Lavallée.deplacement. cible=1. call MPI_PUT (B.80/326 5 – Copies de mémoire à mémoire 5. dimension(10) :: B . win. Chergui.nb_orig..3 – Transfert des données 1 2 3 4 5 6 7 8 program exemple_put integer :: nb_orig=10.. Dupays. D. P.code) .

Lecas. Chergui.1 – Avril 2012 J. seul le sens de transfert des données étant inversé. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. les seules données accessibles sont celles contenues dans la fenêtre mémoire locale. ☞ MPI_ACCUMULATE() admet parmi ses paramètres une opération qui doit être soit du type MPI_REPLACE. ☞ Sur le processus cible. soit l’une des opérations de réduction prédéfinies : MPI_SUM. P. etc. Ce ne peut en aucun cas être une opération définie par l’utilisateur. I. D. Girou.-F.3 – Transfert des données Remarques : ☞ La syntaxe de MPI_GET est identique à celle de MPI_PUT. Dupays. MPI_PROD. D. MPI_MAX. Wautelet . P.81/326 5 – Copies de mémoire à mémoire 5. ☞ Les sous-programmes de transfert de données RMA sont des primitives non bloquantes (choix délibéré de MPI).

Lavallée. D. D.4 – Achèvement du transfert : la synchronisation 5 – Copies de mémoire à mémoire 5.4 – Achèvement du transfert : la synchronisation Le transfert des données débute après l’appel à l’un des sous-programmes non bloquants (MPI_PUT(). . tous les processus associés à la fenêtre prenant part à la synchronisation) . ➋ synchronisation de type cible passive (seul le processus origine appelle le sous-programme de synchronisation).. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou.-F. Dupays. I.). Mais quand le transfert est-il terminé et les données réellement disponibles ? ⇓ Après une synchronisation qui est à la charge du programmeur. Ces synchronisations peuvent être classées en deux types : ➊ synchronisation de type cible active (opération collective. Chergui.82/326 5 – Copies de mémoire à mémoire 5. P. P. Wautelet ..1 – Avril 2012 J. Lecas.

83/326

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation 5.4.1 – Synchronisation de type cible active

☞ Se fait en utilisant le sous-programme MPI MPI_WIN_FENCE(). ☞ MPI_WIN_FENCE() est une opération collective sur tous les processus associés à l’objet MPI fenêtre. ☞ MPI_WIN_FENCE() agit comme une barrière de synchronisation. Elle attend la fin de tous les transferts de données (RMA ou non) utilisant la fenêtre mémoire locale et initiés depuis le dernier appel à MPI_WIN_FENCE(). ☞ Cette primitive va permettre de séparer les parties calcul du code (où l’on utilise des données de la fenêtre mémoire locale via des load ou des store) des parties de transfert de données de type RMA. ☞ Un argument assert de la primitive MPI_WIN_FENCE(), de type entier, permet d’affiner son comportement en vue de meilleures performances. Diverses valeurs sont prédéfinies MPI_MODE_NOSTORE, MPI_MODE_NOPUT, MPI_MODE_NOPRECEDE, MPI_MODE_NOSUCCEED. Une valeur de zéro pour cet argument est toujours valide.

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

84/326

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation

Remarques : ☞ Le fait d’avoir choisi des sous-programmes RMA d’initialisation du transfert non bloquants et une synchronisation pour l’achèvement des transferts en cours autorise l’implémentation à regrouper lors de l’exécution divers transferts vers la même cible en un transfert unique. L’effet de la latence est ainsi réduit et les performances améliorées. ☞ Le caractère collectif de la synchronisation a pour conséquence qu’on n’a pas réellement affaire à ce que l’on appelle du « One Sided Communication »... En fait tous les processus du communicateur vont devoir prendre part à la synchronisation, ce qui perd de son intérêt !

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

85/326

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation

Du bon usage de MPI_WIN_FENCE
☞ Il faut s’assurer qu’entre deux appels successifs à MPI_WIN_FENCE() il n’y a soit que des affectations locales (load/store) sur des variables contenues dans la fenêtre mémoire locale du processus, soit que des opérations RMA de type MPI_PUT() ou MPI_ACCUMULATE(), mais jamais les deux en même temps ! 0 MPI_WIN_FENCE() | MPI_WIN_FENCE() MPI_PUT() MPI_WIN_FENCE() 1 MPI_WIN_FENCE() win_loc(:) = win_loc(:) + 1.0 MPI_WIN_FENCE() ① MPI_WIN_FENCE()

Le programme précédent est-il conforme au bon usage de MPI_WIN_FENCE() ? Tout dépend de la portion de code représentée par ①. Si celle-ci n’engendre pas de load/store sur la fenêtre locale (affectation ou utilisation d’une variable stockée dans la fenêtre locale), alors c’est bon ; dans le cas contraire, le résultat est indéfini.

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

86/326

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation

Exemple récapitulatif
P0
tab

P1
win_loc MPI_PUT

ligne correspondante l. 1,30 l. 31,35

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

MPI_ACCUMULATE tab win_loc

l. 58,63 l. 65

Figure 23 – Exemple récapitulatif correspondant au code ex_fence
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

87/326

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation

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)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

88/326

5 – Copies de mémoire à mémoire

5.4 – Achèvement du transfert : la synchronisation

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

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

code) if (rang==0) then nb_elements = m-1. D.code) call MPI_WIN_FREE (win. MPI_DOUBLE_PRECISION .win_local(:) endif call MPI_FINALIZE (code) end program ex_fence INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. "win_local="."processus".-F.win.code) if (rang==0) then print *. & MPI_SUM .win. Lecas."processus".4 – Achèvement du transfert : la synchronisation 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. & deplacement. cible. Lavallée. deplacement = 1 call MPI_ACCUMULATE (tab(2). I.1 – Avril 2012 J. "tab=". rang. rang. Chergui. nb_elements. P. code) end if call MPI_WIN_FENCE (assert. Girou.tab(:) else print *.win. D. P. Wautelet .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. MPI_DOUBLE_PRECISION .89/326 5 – Copies de mémoire à mémoire 5. nb_elements.

En d’autres termes. même si cela n’est pas recommandé (une telle utilisation impliquant de trop nombreuses restrictions). D. Dans la suite on supposera ne pas être dans ce cas. les zones mémoires mises en jeu lors d’appels à plusieurs sous-programmes MPI_PUT() agissant sur la même fenêtre mémoire locale. ☞ Entre deux appels successifs au sous-programme MPI_WIN_FENCE(). I.. Lecas.4 – Achèvement du transfert : la synchronisation Quelques précisions et restrictions. D. Wautelet . P. P.1 – Avril 2012 J. Dupays. Chergui. ne doivent pas se recouvrir . on a les contraintes suivantes : • les sous-programmes MPI_PUT() n’admettent pas le recouvrement à l’intérieur d’une même fenêtre mémoire locale.90/326 5 – Copies de mémoire à mémoire 5. ☞ Il faut toujours séparer par un appel à MPI_WIN_FENCE() un store et l’appel à un sous-programme MPI_PUT() ou MPI_ACCUMULATE() accédant à la même fenêtre mémoire locale même à des endroits différents ne se recouvrant pas. Lavallée.. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F. ☞ Il est possible de travailler sur des fenêtres mémoire locales différentes qui se recouvrent. Girou.

à la condition que les types des données et l’opération de réduction utilisés soient identiques lors de tous ces appels . Girou.1 – Avril 2012 J. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas. I. P. D.-F. D. • les sous-programmes MPI_PUT() et MPI_ACCUMULATE() utilisés consécutivement n’admettent pas le recouvrement à l’intérieur d’une même fenêtre mémoire locale . • un load et un appel au sous-programme MPI_GET() peuvent accéder concurremment à n’importe quelle partie de la fenêtre locale.91/326 5 – Copies de mémoire à mémoire 5. soit lors de l’appel à un sous-programme de type MPI_PUT() ou MPI_ACCUMULATE(). Chergui. pourvu qu’elle n’ait pas été mise à jour auparavant soit par un store. P. Wautelet . Lavallée.4 – Achèvement du transfert : la synchronisation • les sous-programmes MPI_ACCUMULATE() admettent le recouvrement à l’intérieur d’une même fenêtre mémoire locale. Dupays.

Girou.e.4.4 – Achèvement du transfert : la synchronisation 5 – Copies de mémoire à mémoire 5. identifiée par un numéro de processus cible et un objet MPI fenêtre).1 – Avril 2012 J. ☞ Contrairement à la synchronisation par MPI_WIN_FENCE() (qui est une opération collective de type barrière). D. D. Chergui. La période qui commence au lock et se termine à l’unlock est appelée une période d’accès à la fenêtre mémoire locale. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. I. Lavallée. synchronisation) ne font intervenir que le processus origine .2 – Synchronisation de type cible passive ☞ Se fait via les appels aux sous-programmes MPI MPI_WIN_LOCK() et MPI_WIN_UNLOCK().4 – Achèvement du transfert : la synchronisation 5. Ce n’est que durant cette période que le processus origine va avoir accès à la fenêtre mémoire locale du processus cible.-F. ici seul le processus origine va participer à la synchronisation. P. c’est du vrai « One Sided Communication ».92/326 5 – Copies de mémoire à mémoire 5. Wautelet . Lecas. De ce fait tous les appels nécessaires au transfert des données (initialisation du transfert. ☞ Les opérations de lock et d’unlock ne s’appliquent qu’à une fenêtre mémoire locale donnée (i. P.

-F. il suffit pour le processus origine d’entourer l’appel aux primitives RMA d’initialisation de transfert de données par MPI_WIN_LOCK() et MPI_WIN_UNLOCK(). get. Lavallée. Wautelet . accumulate) sans que la cible ait besoin de faire appel à des sous-programmes MPI. Dupays. Lecas. Girou. aucun appel de sous-programmes MPI n’est à faire. P. Pour le processus cible. Chergui.4 – Achèvement du transfert : la synchronisation ☞ Pour l’utiliser. D. P. ☞ Lorsque MPI_WIN_UNLOCK() rend la main. tous les transferts de données initiés après le MPI_WIN_LOCK() sont terminés. ☞ Une utilisation basique des synchronisations de type cible passive consiste à créer des versions bloquantes des RMA (put. D. ☞ Le premier argument de MPI_WIN_LOCK() permet de spécifier si le fait de faire plusieurs accès simultanés via des opérations de RMA sur une même fenêtre mémoire locale est autorisé (MPI_LOCK_SHARED) ou non (MPI_LOCK_EXCLUSIVE).1 – Avril 2012 J. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.93/326 5 – Copies de mémoire à mémoire 5. I.

orig_count. Lavallée. intent(out) :: code integer(kind= MPI_ADDRESS_KIND ). Girou. I. & target_disp. P. dimension(:) :: orig_addr call MPI_WIN_LOCK ( MPI_LOCK_SHARED . & target_count.d0)). D.-F. Lecas. target_disp.1 – Avril 2012 J. Chergui. target_datatype. Wautelet . code) call MPI_WIN_UNLOCK (target_rank. target_datatype. target_rank. target_count. intent(in) :: target_disp real(kind=kind(1. intent(in) :: orig_count. target_count. 0.94/326 5 – Copies de mémoire à mémoire 5. win integer. win. P. code) end subroutine get_bloquant INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. orig_datatype. orig_datatype. orig_datatype. code) call MPI_GET (orig_addr. target_rank. target_rank. Dupays. & target_datatype. win. code) integer. orig_count. win.4 – Achèvement du transfert : la synchronisation 1 2 3 4 5 6 7 8 9 10 11 12 13 subroutine get_bloquant(orig_addr. D. target_rank. win.

Chergui. Lecas. Lavallée..1 – Avril 2012 J. Girou.4 – Achèvement du transfert : la synchronisation Remarque concernant les codes Fortran Pour être portable.-F. D. Wautelet .. il faut allouer la fenêtre mémoire avec MPI_ALLOC_MEM(). pointeurs Fortran CRAY. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. qui ne font pas partie de la norme Fortran95).95/326 5 – Copies de mémoire à mémoire 5. Dans le cas où ces derniers ne sont pas disponibles. MPI_WIN_UNLOCK()). P. Dupays. I. lors de l’utilisation des synchronisations de type cible passive (MPI_WIN_LOCK(). P.e. Cette fonction admet comme argument des pointeurs de type C (i. D. il faut utiliser un programme C pour faire l’allocation de la fenêtre mémoire.

Dupays. I. P. Girou. Chergui... D. Wautelet . Lavallée. Une connaissance approfondie de la norme est nécessaire pour ne pas tomber dans les nombreux pièges. P. ☞ L’intérêt du concept RMA de MPI réside essentiellement dans l’approche cible passive.-F.96/326 5 – Copies de mémoire à mémoire 5. Lecas.). INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J.5 – Conclusions 5 – Copies de mémoire à mémoire 5. ☞ Les performances peuvent être très variables d’une implémentation à l’autre.5 – Conclusions ☞ Les concepts RMA de MPI sont compliqués à mettre en œuvre sur des applications non triviales. C’est seulement dans ce cas que l’utilisation des sous-programmes RMA est réellement indispensable (application nécessitant qu’un processus accède à des données appartenant à un processus distant sans interruption de ce dernier. D.

. . . . . . . . . . . . 106 6. . . . . . . .3 Types avec un pas constant . Dupays. . . . . . . . . . . . .3 Type « bloc d’une matrice » . . . . . . . . . . . . . . 128 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . 116 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Introduction . . . . . . .-F. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chergui. . . . . . . . . . . . . . . . . . . . . 98 6. . . . . . . . . . . . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Exemples . . . . . . . . . . . . .1 – Avril 2012 J. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Type « colonne d’une matrice ». . . . .7 Construction de sous-tableaux . . . 104 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I. . . . . . . .2 Types contigus . . . . . . 108 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 Types homogènes à pas variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 Types hétérogènes . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . Girou. . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 6. . . . . . . . . . . . . . . 110 6. . . . . . . . . . . . . . . . . .104 6. . . . . . . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lecas. . . . . . . . . . .5.2 Type « ligne d’une matrice » . . . . . 101 6. . . . . . . . . . . . .97/326 6 – Types de données dérivés 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 6. . . .5. . . . . . . . . . . . . . 121 6. . . . . . . . . . . 103 6. Wautelet .5. . . . . 100 6. . . .9 Sous-programmes annexes . . . . . . . . . . . . . . .10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4 Autres sous-programmes . . . . . . . . . . . . . . . . . . . . .

MPI_TYPE_VECTOR(). ☞ Si on souhaite réutiliser le même nom pour définir un autre type dérivé. Chergui.1 – Introduction 6 – Types de données dérivés 6. on doit au préalable le libérer avec le sous-programme MPI_TYPE_FREE() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_REAL.-F. P. les données échangées sont typées : MPI_INTEGER. etc ☞ On peut créer des structures de données plus complexes à l’aide de sous-programmes tels que MPI_TYPE_CONTIGUOUS(). I. il faut le valider à l’aide du sous-programme MPI_TYPE_COMMIT(). D.1 – Avril 2012 J. Lecas.98/326 6 – Types de données dérivés 6. Wautelet . Dupays. D. MPI_TYPE_CREATE_HVECTOR() ☞ À chaque fois que l’on crée un type de données. Lavallée. P.1 – Introduction ☞ Dans les communications. Girou. MPI_COMPLEX.

Dupays. Lecas.-F.1 – Avril 2012 J. I. MPI_INTEGER.99/326 6 – Types de données dérivés 6. Chergui. Wautelet . P.1 – Introduction MPI_TYPE_CREATE_STRUCT MPI_TYPE_[CREATE_H]INDEXED MPI_TYPE_[CREATE_H]VECTOR MPI_TYPE_CONTIGUOUS MPI_REAL. D. P. Girou. Lavallée. MPI_LOGICAL Figure 24 – Hiérarchie des constructeurs de type MPI INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D.

100/326

6 – Types de données dérivés

6.2 – Types contigus

6 – Types de données dérivés
6.2 – Types contigus

☞ MPI_TYPE_CONTIGUOUS() crée une structure de données à partir d’un ensemble homogène de type préexistant de données contiguës en mémoire. 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.

call MPI_TYPE_CONTIGUOUS (5, MPI_REAL ,nouveau_type,code)

Figure 25 – Sous-programme MPI_TYPE_CONTIGUOUS
integer, intent(in) :: nombre, ancien_type integer, intent(out) :: nouveau_type,code call MPI_TYPE_CONTIGUOUS (nombre,ancien_type,nouveau_type,code)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

101/326

6 – Types de données dérivés

6.3 – Types avec un pas constant

6 – Types de données dérivés
6.3 – Types avec un pas constant

☞ MPI_TYPE_VECTOR() crée une structure de données à partir d’un ensemble homogène de type préexistant de données distantes d’un pas constant en mémoire. Le pas est donné en nombre d’éléments. 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.

call MPI_TYPE_VECTOR (6,1,5, MPI_REAL ,nouveau_type,code)

Figure 26 – Sous-programme MPI_TYPE_VECTOR
integer, integer, integer, integer, intent(in) intent(in) intent(in) intent(out) :: :: :: :: nombre_bloc,longueur_bloc pas ! donné en éléments ancien_type nouveau_type,code

call MPI_TYPE_VECTOR (nombre_bloc,longueur_bloc,pas,ancien_type,nouveau_type,code)
INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

102/326

6 – Types de données dérivés

6.3 – Types avec un pas constant

☞ MPI_TYPE_CREATE_HVECTOR() crée une structure de données à partir d’un ensemble homogène de type prédéfini de données distantes d’un pas constant en mémoire. Le pas est donné en nombre d’octets. ☞ Cette instruction est utile lorsque le type générique n’est plus un type de base (MPI_INTEGER, MPI_REAL,...) mais un type plus complexe construit à l’aide des sous-programmes MPI, parce qu’alors le pas ne peut plus être exprimé en nombre d’éléments du type générique.
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)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

103/326

6 – Types de données dérivés

6.4 – Autres sous-programmes

6 – Types de données dérivés
6.4 – Autres sous-programmes

☞ Il est nécessaire de valider tout nouveau type de données dérivé à l’aide du sous-programme MPI_TYPE_COMMIT().
integer, intent(inout) :: nouveau_type integer, intent(out) :: code call MPI_TYPE_COMMIT (nouveau_type,code)

☞ La libération d’un type de données dérivé se fait par le sous-programme MPI_TYPE_FREE().
integer, intent(inout) :: nouveau_type integer, intent(out) :: code call MPI_TYPE_FREE (nouveau_type,code)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

104/326

6 – Types de données dérivés

6.5 – Exemples

6 – Types de données dérivés
6.5 – Exemples 6.5.1 – Type « colonne d’une matrice »

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) ! Définition 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)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

105/326

6 – Types de données dérivés

6.5 – Exemples

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

! Envoi de la première colonne if ( rang == 0 ) then call MPI_SEND (a(1,1),1,type_colonne,1,etiquette, MPI_COMM_WORLD ,code) ! Réception dans la dernière colonne elseif ( rang == 1 ) then call MPI_RECV (a(1,nb_colonnes),1,type_colonne,0,etiquette,& MPI_COMM_WORLD ,statut,code) end if ! Libère le type call MPI_TYPE_FREE (type_colonne,code) call MPI_FINALIZE (code) end program colonne

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

2 – Type « ligne d’une matrice » 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. P. Lavallée.nb_colonnes):: integer.rang. dimension( MPI_STATUS_SIZE ) :: integer :: nb_lignes=5.nb_colonnes=6 etiquette=100 a statut rang. MPI_REAL .:) = real(rang) ! Définition du type type_ligne call MPI_TYPE_VECTOR (nb_colonnes.type_ligne call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . D.code.5 – Exemples 6 – Types de données dérivés 6. D. Chergui.5.5 – Exemples 6. Wautelet . P. parameter :: real. parameter :: integer.1. Dupays.-F.code) ! Validation du type type_ligne call MPI_TYPE_COMMIT (type_ligne.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou.type_ligne. Lecas.106/326 6 – Types de données dérivés 6. dimension(nb_lignes.1 – Avril 2012 J.nb_lignes.code) ! Initialisation de la matrice sur chaque processus a(:. I.

MPI_COMM_WORLD . Wautelet .1. Girou. P.& MPI_COMM_WORLD . Lavallée.1).code) end if ! Libère le type type_ligne call MPI_TYPE_FREE (type_ligne. Lecas. P.code) call MPI_FINALIZE (code) end program ligne INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. D.1 – Avril 2012 J.type_ligne. Dupays.statut.code) ! Réception dans l’avant-dernière ligne elseif ( rang == 1 ) then call MPI_RECV (a(nb_lignes-1.-F.107/326 6 – Types de données dérivés 6. Chergui.etiquette.1.etiquette.type_ligne.1. I.5 – Exemples 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ! Envoi de la deuxième ligne if ( rang == 0 ) then call MPI_SEND (a(2.1).0.

rang. dimension( MPI_STATUS_SIZE ) :: integer :: nb_lignes=5. Wautelet .3 – Type « bloc d’une matrice » 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. I.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P.code. D.type_bloc. Dupays.1 – Avril 2012 J. Chergui.nb_colonnes=6 etiquette=100 nb_lignes_bloc=2. parameter :: real.108/326 6 – Types de données dérivés 6.5.5 – Exemples 6 – Types de données dérivés 6.:) = real(rang) ! Création du type type_bloc call MPI_TYPE_VECTOR (nb_colonnes_bloc.nb_colonnes_bloc=3 a statut rang. parameter :: integer. Girou. P. Lecas. D.nb_lignes.& MPI_REAL .5 – Exemples 6.code) ! Initialisation de la matrice sur chaque processus a(:.nb_lignes_bloc. Lavallée. parameter :: integer.nb_colonnes):: integer. dimension(nb_lignes.-F.type_bloc call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .code) ! Validation du type type_bloc call MPI_TYPE_COMMIT (type_bloc.

1.109/326 6 – Types de données dérivés 6. I.type_bloc.1.statut.code) end if ! Libération du type type_bloc call MPI_TYPE_FREE (type_bloc.1.etiquette.nb_colonnes-2).-F. Girou. Lavallée. P.code) call MPI_FINALIZE (code) end program bloc INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.& MPI_COMM_WORLD . D.0.etiquette.5 – Exemples 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ! Envoi d’un bloc if ( rang == 0 ) then call MPI_SEND (a(1.1 – Avril 2012 J. P.1). MPI_COMM_WORLD . D.type_bloc. Wautelet . Chergui.code) ! Réception du bloc elseif ( rang == 1 ) then call MPI_RECV (a(nb_lignes-1. Dupays. Lecas.

D.) mais un type plus complexe construit avec les sous-programmes MPI vus précédemment.. P. P. On ne peut exprimer alors le pas en nombre d’éléments du type générique d’où le recours à MPI_TYPE_CREATE_HINDEXED(). ☞ Pour MPI_TYPE_CREATE_HINDEXED(). ☞ MPI_TYPE_CREATE_HINDEXED() a la même fonctionnalité que MPI_TYPE_INDEXED() sauf que le pas séparant deux blocs de données est exprimé en octets. Girou. Dupays. I. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4..6 – Types homogènes à pas variable 6 – Types de données dérivés 6.-F. D.6 – Types homogènes à pas variable ☞ MPI_TYPE_INDEXED() permet de créer une structure de données composée d’une séquence de blocs contenant un nombre variable d’éléments et séparés par un pas variable en mémoire.110/326 6 – Types de données dérivés 6. Chergui. comme pour MPI_TYPE_CREATE_HVECTOR().1 – Avril 2012 J. Cette instruction est utile lorsque le type générique n’est pas un type de base MPI (MPI_INTEGER. Lavallée. Lecas. MPI_REAL. Ce dernier est exprimé en éléments. Wautelet . utilisez MPI_TYPE_SIZE() ou MPI_TYPE_GET_EXTENT() pour obtenir de façon portable la taille du pas en nombre d’octets. .

code call MPI_TYPE_INDEXED (nb.dimension(nb) :: deplacements integer.ancien_type.intent(in).intent(out) :: nouveau_type. Lavallée. Dupays.7) ancien_type nouveau_type Figure 27 – Le constructeur MPI_TYPE_INDEXED integer.1 – Avril 2012 J.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.longueurs_blocs. Wautelet .nouveau_type. déplacements=(0. P.111/326 6 – Types de données dérivés 6. Lecas.-F.intent(in) :: nb integer.3. D.dimension(nb) :: longueurs_blocs ! Attention les déplacements sont donnés en éléments integer.6 – Types homogènes à pas variable nb=3. Chergui.1.intent(in) :: ancien_type integer.3). Girou.deplacements. D. I. longueurs_blocs=(2.intent(in). P.

24) ancien_type nouveau_type Figure 28 – Le constructeur MPI_TYPE_CREATE_HINDEXED integer. Lecas.intent(in) integer.dimension(nb) ! Attention les déplacements sont donnés en octets integer(kind= MPI_ADDRESS_KIND ).intent(in).longueurs_blocs.1. Wautelet . Dupays. longueurs_blocs=(2. Girou.intent(in) integer.-F.code call MPI_TYPE_CREATE_HINDEXED (nb.intent(in).deplacements. I.112/326 6 – Types de données dérivés 6.dimension(nb) integer.14. déplacements=(2. D. Lavallée.6 – Types homogènes à pas variable nb=4. ancien_type. Chergui. P.1 – Avril 2012 J.10. D.nouveau_type. P.1).2.intent(out) :: nb :: longueurs_blocs :: deplacements :: ancien_type :: nouveau_type.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui.1 – Avril 2012 J. D.6 – Types homogènes à pas variable Dans l’exemple suivant. P. Dupays. Wautelet .113/326 6 – Types de données dérivés 6. I. D. chacun des deux processus : ➀ initialise sa matrice (nombres croissants positifs sur le processus 0 et négatifs décroissants sur le processus 1) . Lecas.-F. Lavallée. P. ➂ envoie sa matrice triangulaire à l’autre et reçoit une matrice triangulaire qu’il stocke à la place de celle qu’il a envoyée via l’instruction MPI_SENDRECV_REPLACE() . Girou. ➃ libère ses ressources et quitte MPI. ➁ construit son type de données (datatype) : matrice triangulaire (supérieure pour le processus 0 et inférieure pour le processus 1) .

6 – Types homogènes à pas variable 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 Après -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 -9 -17 -25 -33 -41 -49 -57 -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 Figure 29 – Échanges entre les 2 processus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas.1 – Avril 2012 J.114/326 6 – Types de données dérivés 6. Lavallée. D. Girou. Dupays. Chergui. P. D. P.-F. Wautelet . I.

i=1.code) ! Permutation des matrices triangulaires supérieure et inférieure call MPI_SENDRECV_REPLACE (a.i=1.type_triangle. Dupays.2).code) ! Initialisation de la matrice sur chaque processus a(:. MPI_REAL .dimension(n. P.statut.i=1.etiquette. MPI_COMM_WORLD .parameter real.1 – Avril 2012 J. (/n.mod(rang+1.type_triangle longueurs_blocs.code rang.longueurs_blocs.i=1. D.code) call MPI_TYPE_COMMIT (type_triangle. I.code) call MPI_FINALIZE (code) end program triangle INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet .n) /) deplacements(:) = (/ (n*(i-1)+i.rang. P.-rang).6 – Types homogènes à pas variable program triangle use mpi implicit none integer.n) /) else longueurs_blocs(:) = (/ (n-i. D.mod(rang+1. Girou. Chergui.dimension( MPI_STATUS_SIZE ) integer integer integer.1.type_triangle.n) /) deplacements(:) = (/ (n*(i-1).deplacements call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .deplacements.n) /) endif call MPI_TYPE_INDEXED (n. Lecas.etiquette=100 a statut i.dimension(n) :: :: :: :: :: :: n=8. Lavallée.code) ! Libération du type triangle call MPI_TYPE_FREE (type_triangle.i=1.n) integer.2).-F.n*n) /). & etiquette.:) = reshape( (/ (sign(i.n/)) ! Création du type matrice triangulaire sup pour le processus 0 ! et du type matrice triangulaire inférieure pour le processus1 if (rang == 0) then longueurs_blocs(:) = (/ (i-1.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 6 – Types de données dérivés 6.

7 – Construction de sous-tableaux ☞ Le sous-programme MPI_TYPE_CREATE_SUBARRAY() permet de créer un sous-tableau à partir d’un tableau.ancien_type.coord_debut.profil_tab.ancien_type integer. D. P. Wautelet . Girou. D. P.-F. Dupays.intent(out) :: nouveau_type.code call MPI_TYPE_CREATE_SUBARRAY (nb_dims. Lecas.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.intent(in) :: nb_dims integer.dimension(ndims).intent(in) :: ordre.116/326 6 – Types de données dérivés 6.profil_sous_tab. integer.7 – Construction de sous-tableaux 6 – Types de données dérivés 6.profil_sous_tab.coord_debut integer. Chergui. Lavallée.intent(in) :: profil_tab. ordre.1 – Avril 2012 J. I.nouveau_type.

-F.7 – Construction de sous-tableaux Rappels sur le vocabulaire relatif aux tableaux en Fortran 95 ☞ Le rang d’un tableau est son nombre de dimensions. nb_dims : rang du tableau profil_tab : profil du tableau à partir duquel on va extraire un sous-tableau profil_sous_tab : profil du sous-tableau coord_debut : coordonnées de départ si les indices du tableau commençaient à 0. c. son profil est le vecteur (10.2 /) ☞ ordre : ordre de stockage des éléments 1 MPI_ORDER_FORTRAN spécifie le mode de stockage en Fortran. D. si on veut que les coordonnées de départ du sous-tableau soient tab(2. Wautelet .1 – Avril 2012 J. Son rang est 3.21). Par exemple. suivant les lignes ☞ ☞ ☞ ☞ INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. suivant les colonnes 2 MPI_ORDER_C spécifie le mode de stockage en C. ☞ Le profil d’un tableau est un vecteur dont chaque dimension est l’étendue du tableau dans la dimension correspondante. P. Lecas. P. c.-10:10). D. Chergui.6. Soit par exemple le tableau T(10.-à-d.-à-d. son étendue dans la première dimension est 10.0:5. dans la seconde 6 et dans la troisième 21.3). Girou. Dupays. ☞ L’étendue d’un tableau est son nombre d’éléments dans une dimension. Lavallée. I. il faut que coord_debut(:)=(/ 1.117/326 6 – Types de données dérivés 6.

1 – Avril 2012 J. Dupays. Chergui. D. Wautelet . Lavallée.118/326 6 – Types de données dérivés 6. D. Lecas.7 – Construction de sous-tableaux AVANT 1 2 3 4 5 6 7 8 9 10 11 12 1 -7 -8 4 APRES 5 -11 -12 8 9 10 11 12 Processus 0 Processus 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -1 -2 -3 -4 -5 -6 2 3 -9 -10 6 7 Processus 1 Processus 1 Figure 30 – Échanges entre les 2 processus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. Girou. P.-F. P.

& etiquette=1000. P.nb_colonnes) :: tab integer.-rang).nb_dims=2 integer :: code. Wautelet . & (/ nb_lignes.7 – Construction de sous-tableaux 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. Dupays.code) ! Initialisation du tableau tab sur chaque processus tab(:. Chergui.i=1.dimension(nb_lignes. I.rang. D. Lavallée.i integer.1 – Avril 2012 J.nb_lignes*nb_colonnes) /) .dimension(nb_dims) :: profil_tab. Girou.coord_debut integer.profil_sous_tab.-F.:) = reshape( (/ (sign(i.119/326 6 – Types de données dérivés 6. Lecas. D.type_sous_tab.nb_colonnes=3.rang.dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .parameter :: nb_lignes=4.nb_colonnes /) ) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P.

2 /) ! Coordonnées de départ du sous-tableau ! Pour le processus 0 on part de l’élément tab(2.& MPI_ORDER_FORTRAN . MPI_INTEGER .type_sous_tab.2).code) call MPI_TYPE_COMMIT (type_sous_tab. Chergui. P.mod(rang+1.2). ! il faut mettre explicitement le profil du tableau pour qu’il soit connu ! sur tous les processus. Girou.statut.rang /) ! Création du type dérivé type_sous_tab call MPI_TYPE_CREATE_SUBARRAY (nb_dims.& mod(rang+1.1.etiquette. Dupays.nb_colonnes) /) ! Profil du sous-tableau profil_sous_tab(:) = (/ 2.1 – Avril 2012 J.profil_tab. Lecas.code) ! Permutation du sous-tableau call MPI_SENDRECV_REPLACE (tab. D.type_sous_tab. MPI_COMM_WORLD .code) call MPI_FINALIZE (code) end program subarray INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.coord_debut. D.1) ! Pour le processus 1 on part de l’élément tab(3.profil_sous_tab. si le tableau concerné n’a pas été alloué sur tous les processus. I.etiquette. Lavallée. P.-F. Wautelet .2) coord_debut(:) = (/ rang+1.120/326 6 – Types de données dérivés 6.code) call MPI_TYPE_FREE (type_sous_tab.7 – Construction de sous-tableaux 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. soit profil_tab(:) = (/ nb_lignes. ! ATTENTION.

via MPI_GET_ADDRESS(). I.121/326 6 – Types de données dérivés 6. Lavallée.1 – Avril 2012 J. ➳ MPI. Wautelet . D. ➳ Il a les mêmes fonctionnalités que MPI_TYPE_INDEXED() mais permet en plus la réplication de blocs de données de types différents. Lecas. ➳ compte tenu de l’hétérogénéité des données et de leur alignement en mémoire. P.8 – Types hétérogènes ➳ Le sous-programme MPI_TYPE_CREATE_STRUCT() est le constructeur de types le plus général. fournit un sous-programme portable qui permet de retourner l’adresse d’une variable. Girou. Chergui. Dupays.-F.8 – Types hétérogènes 6 – Types de données dérivés 6. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. ➳ Les paramètres de MPI_TYPE_CREATE_STRUCT() sont les mêmes que ceux de MPI_TYPE_INDEXED() avec en plus : ➳ le champ anciens_types est maintenant un vecteur de types de données MPI . D. P. le calcul du déplacement entre deux éléments repose sur la différence de leurs adresses .

7. I.122/326 6 – Types de données dérivés 6. P.5.8 – Types hétérogènes nb=5. Girou.adresse_variable. Wautelet .intent(in) integer.intent(out) :: adresse_variable integer. déplacements=(0.intent(in).deplacements.1 – Avril 2012 J.11.nouveau_type.intent(in). intent(out) :: :: :: :: nb longueurs_blocs deplacements anciens_types type 2 type 3 :: nouveau_type. longueurs_blocs=(3. D. anciens_types.intent(in).1.type1.type3) type 1 anciens_types nouveau_type Figure 31 – Le constructeur MPI_TYPE_CREATE_STRUCT integer.1.intent(in) :: variable integer(kind= MPI_ADDRESS_KIND ). P.26). Lecas.code) <type>.type2.type3. Lavallée.dimension(nb) integer.21.code call MPI_TYPE_CREATE_STRUCT (nb.1). Dupays. anciens_types=(type1.intent(out) :: code call MPI_GET_ADDRESS (variable.dimension(nb) integer(kind= MPI_ADDRESS_KIND ). Chergui.longueurs_blocs. D.-F.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.dimension(nb) integer.

MPI_INTEGER . Wautelet . dimension(4) type Particule character(len=5) integer real. P.code.code) ! Construction du type de données types = (/ MPI_CHARACTER .1/) :: :: :: :: :: :: :: :: :: n=1000.adresses categorie masse coords classe :: p. dimension( MPI_STATUS_SIZE ) integer integer.123/326 6 – Types de données dérivés 6.1. dimension(4) integer(kind= MPI_ADDRESS_KIND ). Girou. P.i types. dimension(n) call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . Lavallée. I.3. MPI_LOGICAL /) longueurs_blocs = (/5. D.8 – Types hétérogènes 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.1 – Avril 2012 J. MPI_REAL . dimension(3) logical end type Particule type(Particule). Chergui. Dupays.longueurs_blocs deplacements. Lecas.type_particule.etiquette=100 statut rang.rang. parameter integer. D.temp_p INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F.

D.n. Wautelet .adresses(3).code) MPI_GET_ADDRESS (p(1)%masse.type_particule. Lecas. ! Envoi des particules de 0 vers 1 if (rang == 0) then call MPI_SEND (p(1)%categorie. Girou. & code) ! Validation du type structuré call MPI_TYPE_COMMIT (type_particule.code) ! Initialisation des particules pour chaque processus . P.adresses(1).type_particule.etiquette.etiquette.code) endif ! Libération du type call MPI_TYPE_FREE (type_particule. Dupays.deplacements.code) call MPI_FINALIZE (code) end program Interaction_Particules INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D..1 – Avril 2012 J. & statut.adresses(1) end do call MPI_TYPE_CREATE_STRUCT (4.-F.types.124/326 6 – Types de données dérivés 6. I.longueurs_blocs.code) MPI_GET_ADDRESS (p(1)%classe.. MPI_COMM_WORLD . P. Lavallée.n. Chergui.0.code) MPI_GET_ADDRESS (p(1)%coords.4 deplacements(i)=adresses(i) . MPI_COMM_WORLD .type_particule.code) else call MPI_RECV (temp_p(1)%categorie.adresses(4).code) ! Calcul des déplacements relatifs à l’adresse de départ do i=1.8 – Types hétérogènes 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 call call call call MPI_GET_ADDRESS (p(1)%categorie.1..adresses(2).

Chergui.code) ☞ On peut modifier la borne inférieure d’un type dérivé et son étendue pour créer un nouveau type adapté du précédent integer.borne_inf_alignee.code) ☞ L’étendue ainsi que la borne inférieure d’un type dérivé.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. P. Dupays. intent(out) :: taille.9 – Sous-programmes annexes ☞ La taille totale d’un type de données : MPI_TYPE_SIZE() integer.code call MPI_TYPE_CREATE_RESIZED (ancien_type. nouveau_type. intent(in) :: type_derive integer(kind= MPI_ADDRESS_KIND ).1 – Avril 2012 J. en tenant compte des éventuels alignements mémoire : MPI_TYPE_GET_EXTENT() integer. P. intent(in) :: ancien_type integer(kind= MPI_ADDRESS_KIND ).taille_alignee integer.intent(out):: borne_inf_alignee.taille. code call MPI_TYPE_SIZE (type_donnee. intent(out) :: nouveau_type. intent(in) :: type_donnee integer.intent(in) :: nouvelle_borne_inf. Lavallée. Lecas. intent(out) :: code call MPI_TYPE_GET_EXTENT (type_derive.taille_alignee.9 – Sous-programmes annexes 6 – Types de données dérivés 6.nouvelle_taille integer.-F. D.nouvelle_taille. Girou. Wautelet .125/326 6 – Types de données dérivés 6.nouvelle_borne_inf. D.

I. code) ! Construction du type derivé typeDemiLigne2 tailleDeplacement = taille_integer call MPI_TYPE_CREATE_RESIZED (typeDemiLigne. Chergui. & demi_ligne=nb_colonnes/2. taille_integer.nb_colonnes /) ) ! Construction du type derivé typeDemiLigne call MPI_TYPE_VECTOR (demi_ligne. dimension(nb_lignes.& typeDemiLigne2. dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .typeDemiLigne2 integer :: code.taille_integer.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.nb_colonnes) :: a integer :: typeDemiLigne.nb_lignes*nb_colonnes) /).9 – Sous-programmes 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 ma_ligne use mpi implicit none integer.-rang). MPI_INTEGER .-F.rang.:) = reshape( (/ (sign(i. Lavallée. Dupays. parameter :: nb_lignes=5.typeDemiLigne.rang.code) ! Connaître la taille du type de base MPI_INTEGER call MPI_TYPE_SIZE ( MPI_INTEGER . Lecas.tailleDeplacement.borneInf. P.i=1. & (/ nb_lignes.nb_colonnes=6. D. D.126/326 6 – Types de données dérivés 6.i integer(kind= MPI_ADDRESS_KIND ) :: borneInf=0.etiquette=1000 integer. Girou. Wautelet .1 – Avril 2012 J. tailleDeplacement integer.1.nb_lignes.code) ! Initialisation de la matrice A sur chaque processus a(:. P.

1). Girou.1 – Avril 2012 J. 0.nb_colonnes-1). Chergui. etiquette. code) else ! Réception pour le processus 1 dans la matrice A call MPI_RECV (A(1. D. Dupays. & MPI_COMM_WORLD .127/326 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 6 – Types de données dérivés 6.-F. 1.A(i. P.statut.& MPI_COMM_WORLD .9 – Sous-programmes annexes ! Validation du type typeDemiLigne2 call MPI_TYPE_COMMIT (typeDemiLigne2. D. 6. 2. Lecas.nb_lignes print *. Lavallée.’Matrice A sur le processus 1’ do i=1. MPI_INTEGER .code) if (rang == 0) then ! Envoi de la matrice A au processus 1 avec le type typeDemiLigne2 call MPI_SEND (A(1. P. etiquette. code) print *. Wautelet . 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 DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. typeDemiLigne2.

de simplifier l’écriture de sous-programmes d’échanges interprocessus. Girou.-F. I. Chergui. ☞ L’association des types dérivés et des topologies (décrites dans l’un des prochains chapitres) fait de MPI l’outil idéal pour tous les problèmes de décomposition de domaines avec des maillages réguliers ou irréguliers. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée. P.10 – Conclusion 6 – Types de données dérivés 6.128/326 6 – Types de données dérivés 6.10 – Conclusion ☞ Les types dérivés MPI sont de puissants mécanismes portables de description de données ☞ Ils permettent.1 – Avril 2012 J. Dupays. Lecas. Wautelet . D. lorsqu’ils sont associés à des instructions comme MPI_SENDRECV(). D. P.

. . . . 133 7. . . . . . . . . . . . . . . . 132 7. . . . . . . . . . . . . . . . . . . . . . 135 7. . . . .2. . . . . . . . 130 7. . . . . . .2. . . . . . . . . . . 140 7. . .3 Envois bufferisés .4 Envois standards . . . . . . . . . . . . . P. . . . . . . . . . .3 Recouvrement calculs-communications . . .129/326 7 – Optimisations 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 7. . . . . . . Lavallée. . . . . . . . . . . . . . . . . . . . . . . Lecas.2. . . . . D. . . . . . . . . . . . . . . Chergui. . . . . . . . . . . . . . . . . . . . . .6 Performances des différents modes d’envoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2. . . . . . . . . . . . . . . . . . . . . .2 Envois synchrones . . . . . . . . . . . . . . . . . . . . 139 7. . . . . . . .1 – Avril 2012 J. . . . . . .2. . . . . . . . . . . .2 Modes d’envoi point à point . . . . . . . . . . . . . . . . . 142 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . . . . . . . . . . 141 7. . . . . . . . . . . . . . 131 7. . . . . . . . . . .2. . . . . . . . . . . . . . . P. . . . . . . . . . . . . . . .1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-F. Girou. . Dupays. . . . . . . . . . . . .1 Rappels terminologiques . . . . . . . D. . . . . . . . . Wautelet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I. . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Envois en mode ready . . . . . . . . . .

par exemple : ☞ choisir le mode de communication le plus adapté . ☞ L’optimisation des communications. peut s’accomplir à de nombreux niveaux dont. Dupays. Lecas.130/326 7 – Optimisations 7. I. D. P.1 – Introduction ☞ L’optimisation des communications MPI doit être un souci essentiel lorsque la part de ces dernières par rapport aux calculs devient assez importante. Wautelet . Lavallée. D. P.-F. Girou. ☞ recouvrir les communications par des calculs. Chergui.1 – Introduction 7 – Optimisations 7. au-delà du choix de l’algorithme le plus efficace possible.1 – Avril 2012 J. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.

Chergui. Dupays. P.2 – Modes d’envoi point à point Mode Envoi standard Envoi synchrone Envoi bufferisé Envoi en mode ready Réception Bloquant MPI_SEND MPI_SSEND MPI_BSEND MPI_RSEND MPI_RECV Non bloquant MPI_ISEND MPI_ISSEND MPI_IBSEND MPI_IRSEND MPI_IRECV INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Girou.-F. Lavallée. Wautelet . P. I.2 – Modes d’envoi point à point 7 – Optimisations 7.1 – Avril 2012 J. Lecas.131/326 7 – Optimisations 7. D.

Lavallée.2. Un envoi ne pourra commencer que lorsque sa réception sera postée.1 – Rappels terminologiques Il est important de bien comprendre la définition de certains termes au sens MPI. Appel bloquant : un appel est bloquant si l’espace mémoire servant à la communication peut être réutilisé immédiatement après la sortie de l’appel.2 – Modes d’envoi point à point 7 – Optimisations 7. Il ne peut donc y avoir communication que si les deux processus sont prêts à communiquer. Appel non bloquant : un appel non bloquant rend la main très rapidement.2 – Modes d’envoi point à point 7. P. D. Envoi synchrone : un envoi synchrone implique une synchronisation entre les processus concernés.-F. Dupays.1 – Avril 2012 J. Il n’y a alors pas de couplage entre les deux processus de la communication. D. mais n’autorise pas la réutilisation immédiate de l’espace mémoire utilisé dans la communication. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. La sortie de ce type d’envoi ne signifie donc pas que la réception a eu lieu. Wautelet . P. Les données qui ont été ou seront envoyées sont celles qui étaient dans cet espace au moment de l’appel.132/326 7 – Optimisations 7. Girou. Il est nécessaire de s’assurer que la communication est bien terminée (avec MPI_WAIT par exemple) avant de l’utiliser à nouveau. I. les données ont été reçues dans cet espace (si le code de retour est MPI_SUCCESS)). Envoi bufferisé : un envoi bufferisé implique la recopie des données dans un espace mémoire intermédiaire. Chergui. S’il s’agit d’une réception. Lecas.

.... ...1 – Avril 2012 J.2 – Modes d’envoi point à point 7 – Optimisations 7. Chergui...-F.. I.. Girou.. ........ Protocole de rendez-vous Processus 0 envelopp e Processus 1 Le protocole de rendez-vous est généralement celui employé pour les envois en mode synchrone (dépend de l’implémentation)..2 – Modes d’envoi point à point 7.......... Temps ir recevo prêt à données . Wautelet ..... ..... D.... INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée.. D... P... L’accusé de réception est optionnel... accus pti é réce on . Dupays.2.....133/326 7 – Optimisations 7. .. Lecas. . . P.2 – Envois synchrones Un envoi synchrone se fait en appelant le sous-programme MPI_SSEND ou MPI_ISSEND.....

D.134/326 7 – Optimisations 7. D.-F. Lavallée. Chergui. Dupays. Girou. P. I. Wautelet . P.1 – Avril 2012 J.2 – Modes d’envoi point à point Avantages Consomment peu de ressources (pas de buffer) Rapides si le récepteur est prêt (pas de recopie dans un buffer) Garantie de la réception grâce à la synchronisation Inconvénients Temps d’attente si le récepteur n’est pas là/pas prêt Risques de deadlocks INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas.

P. Chergui.135/326 7 – Optimisations 7.3 – Envois bufferisés Envois bufferisés Un envoi bufferisé se fait en appellant le sous-programme MPI_BSEND ou MPI_IBSEND.2. Lecas. Girou. P. Lavallée. Dupays. Ils doivent être alloués en tenant compte des surcoûts mémoire des messages (en ajoutant la constante MPI_BSEND_OVERHEAD pour chaque instance de message).1 – Avril 2012 J. D.2 – Modes d’envoi point à point 7. I. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 – Modes d’envoi point à point 7 – Optimisations 7. D.-F. Les buffers doivent être gérés manuellement (avec appels à MPI_ATTACH et MPI_DETACH). Wautelet .

. .. ..... Lavallée.. D..... .......2 – Modes d’envoi point à point Protocole avec buffer utilisateur du côté de l’émetteur Cette approche est celle généralement employée pour les appels MPI_BSEND ou MPI_IBSEND..... le buffer se trouve du côté de l’émetteur et est géré explicitement par l’application....... ...... L’accusé de réception est optionnel..136/326 7 – Optimisations 7.. Dans cette approche... P... . Chergui.. .. . on Temps accusé récepti . Processus 0 recop ie message Processus 1 .. ..... Wautelet ...... Girou..1 – Avril 2012 J.. De nombreuses variantes sont possibles............. .. .. . I.... . Dupays. Un buffer géré par MPI peut exister du côté du récepteur. ........ ... INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.......... D..-F.. Lecas. P......... ......

..... .. Lavallée.... Il peut aussi être utilisé pour les envois avec MPI_BSEND avec des petits messages (dépend de l’implémentation) et en court-circuitant le buffer utilisateur du côté de l’émetteur.. .... on Temps accus pti é réce ... . .... Chergui.. ..-F.. Dupays...2 – Modes d’envoi point à point Protocole eager Le protocole eager est souvent employé pour les envois en mode standard pour les messages de petites tailles. ........ D.. D... Girou............ INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4..... . le buffer se trouve du côté du récepteur. Wautelet ....... I.. P. L’accusé de réception est optionnel... ...137/326 7 – Optimisations 7. . ..1 – Avril 2012 J.... P.. ... Processus 0 message Processus 1 . ... Lecas. Dans cette approche.................

Lecas.1 – Avril 2012 J. Wautelet . Girou.138/326 7 – Optimisations 7. Dupays. P.-F. I.2 – Modes d’envoi point à point Avantages Pas besoin d’attendre le récepteur (recopie dans un buffer) Pas de risque de blocage (deadlocks) Inconvénients Consomment plus de ressources (occupation mémoire par les buffers avec risques de saturation) Les buffers d’envoi utilisés dans les appels MPI_BSEND ou MPI_IBSEND doivent être gérés manuellement (souvent délicat de choisir une taille adaptée) Un peu plus lent que les envois synchrones si le récepteur est prêt Pas de garantie de la bonne réception (découplage envoi-réception) Risque de gaspillage d’espace mémoire si les buffers sont trop surdimensionnés L’application plante si les buffers sont trop petits Il y a aussi souvent des buffers cachés géré par l’implémentation MPI du côté de l’expéditeur et/ou du récepteur (et consommant des ressources mémoires) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée. Chergui. P. D. D.

-F. P. Lavallée. Dupays.4 – Envois standards Envois standards Un envoi standard se fait en appelant le sous-programme MPI_SEND ou MPI_ISEND.2 – Modes d’envoi point à point 7 – Optimisations 7. Dans la plupart des implémentations. Lecas. Avantages Souvent le plus performant (choix du mode le plus adapté par le constructeur) Le plus portable pour les performances Inconvénients Peu de contrôle sur le mode réellement utilisé (souvent accessible via des variables d’environnement) Risque de deadlock selon le mode réel Comportement pouvant varier selon l’architecture et la taille du problème INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou.2 – Modes d’envoi point à point 7. Wautelet . Chergui.1 – Avril 2012 J. P. D.2. I.139/326 7 – Optimisations 7. ce mode passe d’un mode bufferisé à un mode synchrone lorsque la taille des messages croît. D.

I. Lecas. Leur utilisation est fortement déconseillée. Wautelet .140/326 7 – Optimisations 7. Chergui. P. D. Avantages Légèrement plus performant que le mode synchrone car le protocole de synchronisation peut être simplifié Inconvénients Erreurs si le récepteur n’est pas prêt lors de l’envoi INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 – Modes d’envoi point à point 7 – Optimisations 7.-F. D.2 – Modes d’envoi point à point 7. Girou. Attention : il est obligatoire de faire ces appels seulement lorsque la réception est déjà postée. Dupays.1 – Avril 2012 J.5 – Envois en mode ready Envois en mode ready Un envoi en mode ready se fait en appellant le sous-programme MPI_RSEND ou MPI_IRSEND. P.2. Lavallée.

P.2 – Modes d’envoi point à point 10 4 Ping−pong extranode balanced Vargas − Standard Vargas − Synchroneous Vargas − Buffered Babel − Standard Babel − Synchroneous Babel − Buffered 10 3 Bandwidth (MiB/s) 10 2 10 1 10 0 10 −1 10 2 10 4 10 6 10 8 Message size (bytes) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. D. P. I. Lavallée. Girou. Chergui.141/326 7 – Optimisations 7. Dupays. D. Lecas. Wautelet .-F.

142/326 7 – Optimisations 7. MPI_ISEND. de masquer tout ou une partie des coûts de communications.3 – Recouvrement calculs-communications 7 – Optimisations 7. Dupays. Il est ainsi possible. Lavallée. si l’architecture matérielle et logicielle le permet.1 – Avril 2012 J. P. MPI_IRECV et MPI_WAIT). Lecas. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F. Girou. I. Cette approche s’utilise dans MPI par l’utilisation de sous-programmes non-bloquants (i.3 – Recouvrement calculs-communications Présentation Le recouvrement des communications par des calculs est une méthode permettant de réaliser des opérations de communications en arrière-plan pendant que le programme continue de s’exécuter. D. P.e. D. Wautelet . Chergui. Le recouvrement calculs-communications peut être vu comme un niveau supplémentaire de parallélisme.

. ...3 – Recouvrement calculs-communications Recouvrement partiel Processus 0 requête Recouvrement total Processus 0 requête . ...... . I...... terminé ? envo i oui .. oui INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4... Temps terminé ? i Temps envo .. .... . P............1 – Avril 2012 J... D...143/326 7 – Optimisations 7.. Chergui....... P. .. Dupays...-F.. . Lecas.... Girou........ D... Lavallée... Wautelet .

3 – Recouvrement calculs-communications Avantages Possibilité de masquer tout ou une partie des coûts des communications (si l’architecture le permet) Pas de risques de deadlock Inconvénients Surcoûts plus importants (plusieurs appels pour un seul envoi ou réception.-F. Dupays. Lavallée. Girou. I. D.0) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas. P. Wautelet . Chergui.144/326 7 – Optimisations 7. D. gestion des requêtes) Complexité plus élevée et maintenance plus compliquée Peu performant sur certaines machines (par exemple avec transfert commençant seulement à l’appel de MPI_WAIT) Risque de perte de performance sur les noyaux de calcul (par exemple gestion différenciée entre la zone proche de la frontière d’un domaine et la zone intérieure entraînant une moins bonne utilisation des caches mémoires) Limité aux communications point à point (a été étendu aux collectives dans MPI 3. P.1 – Avril 2012 J.

Wautelet . Chergui.-F. Lecas.3 – Recouvrement calculs-communications Utilisation L’envoi d’un message se fait en 2 étapes : Initier l’envoi ou la réception par un appel à un sous-programme commençant par MPI_ISEND ou MPI_IRECV (ou une de leurs variantes) Attendre la fin de la contribution locale par un appel à MPI_WAIT (ou à une de ses variantes). P. Girou.1 – Avril 2012 J. P. Les communications sont recouvertes par toutes les opérations qui se déroulent entre ces deux étapes. I. L’accès aux données en cours de réception est interdit avant la fin de l’appel à MPI_WAIT (l’accès aux données en cours d’envoi est également interdit pour les implémentations MPI antérieures à la 2. D. Lavallée.145/326 7 – Optimisations 7. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Dupays.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. D. MPI_REAL . & req(1).comm.req.dest.tag. I.niter ! Initie les communications call MPI_IRECV (data_ext. Wautelet . sz.dest. Chergui.data_ext) end do INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J.code) ! Calcule le domaine exterieur call calcul_domaine_exterieur(data_int. MPI_STATUSES_IGNORE . Lecas.-F. P.data_bound. P.146/326 7 – Optimisations 7. MPI_REAL .sz.tag. & req(2).code) call MPI_ISEND (data_bound. Lavallée. D. Girou.comm. dimension(2) :: req do i=1.3 – Recouvrement calculs-communications 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 integer. Dupays.

Un recouvrement de 0% signifie que la durée totale d’exécution vaut 2x la durée d’un noyau de calcul (ou communication). Selon le schéma de communication.-F. Wautelet .147/326 7 – Optimisations 7.. les résultats peuvent être totalement différents. Girou. processus aléatoires. I. Un recouvrement de 100% signifie que la durée totale vaut 1x la durée d’un noyau de calcul (ou communication).1 – Avril 2012 J. P.). Chergui. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. P. par paires. D. Lecas. D..3 – Recouvrement calculs-communications Niveau de recouvrement sur différentes machines Machine Blue Gene/P DCMF_INTERRUPT=0 Blue Gene/P DCMF_INTERRUPT=1 Power6 InfiniBand NEC SX-8 CURIE Niveau 34% 100% 38% 10% 0% Mesures faites en recouvrant un noyau de calcul et un noyau de communication de mêmes durées et en utilisant différents schémas de communications (intra/extra-nœuds.

. . . . . . . . . . . . . . . . . . . . . . . . .2 Communicateur par défaut . . . . . . Girou. . . . . . . . . . . . . . . . . . . . . . . . . . .148/326 8 – Communicateurs 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 8. 155 8. . . . . . . . . . . . . . . .4 Groupes et communicateurs . . . . . . . . . . . . . . . . . . . . . .6. . . . . . . . . . . . 150 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . .6 Topologies . . . . . . . .3 Exemple . . . . . . 149 8. . . . . . . . Wautelet . . . . . . . . P. . . . . . . . .1 Introduction . . . .6. . . D. . . . . . . . 159 8. . . . . . . . . . . .2 Subdiviser une topologie cartésienne . . . 151 8. . . . . . . . . . . 153 8. . . . . . . . . . Chergui. . . . . . . . . . . . . . . . . . . . . 175 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . . . . . . .5 Communicateur issu d’un autre . . . . . . . . . . Dupays. . .1 Topologies cartésiennes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . Lecas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I. . . . . . 160 8. . . . . . . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 – Avril 2012 J. . . . . . . . . . . . . . . . . . . . . . .-F. . . . . . . . . . . .

I.1 – Introduction Il s’agit de partitionner un ensemble de processus afin de créer des sous-ensembles sur lesquels on puisse effectuer des opérations telles que des communications point à point. etc. Chergui. Lavallée. collectives.1 – Introduction 8 – Communicateurs 8.1 – Avril 2012 J. MPI_COMM_WORLD c2 e4 b1 h 7 a0 g6 f5 d3 Figure 32 – Partitionnement d’un communicateur INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. Wautelet . Chaque sous-ensemble ainsi créé aura son propre espace de communication.-F. D.149/326 8 – Communicateurs 8. P. P. Lecas. Girou. D.

☞ Ce communicateur initial MPI_COMM_WORLD est créé pour toute la durée d’exécution du programme à l’appel du sous-programme MPI_INIT() ☞ Ce communicateur ne peut être détruit que via l’appel à MPI_FINALIZE() ☞ Par défaut.2 – Communicateur par défaut 8 – Communicateurs 8. Dupays.150/326 8 – Communicateurs 8. cela a été résolu en postulant que la poule existait déjà. En effet. Girou..1 – Avril 2012 J. D. I. ☞ On ne peut créer un communicateur qu’à partir d’un autre communicateur ☞ Fort heureusement. P. il fixe donc la portée des communications point à point et collectives à tous les processus de l’application INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D.. Wautelet .2 – Communicateur par défaut C’est l’histoire de la poule et de l’œuf. dont l’identificateur MPI_COMM_WORLD est un entier défini dans les fichiers d’en-tête. un communicateur est fourni par défaut.-F. Lavallée. Lecas. Chergui. P.

D. 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 $ mpirun −np 8 CommPairImpair call MPI_INIT(.) call MPI_COMM_SPLIT(. P. Wautelet . nous allons : ☞ regrouper d’une part les processus de rang pair et d’autre part les processus de rang impair . Girou..3 – Exemple 8 – Communicateurs 8.-F.. Lavallée. P. D.) Figure 33 – Création/destruction d’un communicateur INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. I.1 – Avril 2012 J. Lecas...3 – Exemple Dans l’exemple qui suit..) 2 a0 e4 0 3 1 g6 c2 call MPI_BCAST(... Chergui.151/326 8 – Communicateurs 8. ☞ ne diffuser un message collectif qu’aux processus de rang pair et un autre qu’aux processus de rang impair..) a0 e 4 g6 c2 h7 f 5 b1 d 3 call MPI_COMM_FREE(.

Lavallée. Lecas. I.152/326 8 – Communicateurs 8.1 – Avril 2012 J. D.3 – Exemple Que faire pour que le processus 2 diffuse ce message au sous-ensemble de processus de rang pair. 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. Chergui. Girou. par exemple ? ☞ Boucler sur des send/recv peut être très pénalisant surtout si le nombre de processus est élevé. Dupays.-F. ☞ La solution est de créer un communicateur regroupant ces processus de sorte que le processus 2 diffuse le message à eux seuls MPI_COMM_WORLD a0 e4 g6 c2 h7 b1 f5 d3 Figure 34 – Un nouveau communicateur INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. P. D. Wautelet .

D. P. I. Lecas. qui est un ensemble ordonné de processus .-F.1 – Avril 2012 J. pour construire un communicateur. il existe deux façons de procéder : ① par l’intermédiaire d’un groupe de processus . Wautelet .4 – Groupes et communicateurs ☞ Un communicateur est constitué : ① d’un groupe. qui permet de délimiter l’espace de communication.4 – Groupes et communicateurs 8 – Communicateurs 8. ② d’un contexte de communication mis en place à l’appel du sous-programme de construction du communicateur. Chergui. D. Girou. ② directement à partir d’un autre communicateur.153/326 8 – Communicateurs 8. P. ☞ Les contextes de communication sont gérés par MPI (le programmeur n’a aucune action sur eux : c’est un attribut « caché ») ☞ En pratique. Dupays. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.

MPI_COMM_DUP(). il est possible d’en détruire en utilisant le sous-programme MPI_COMM_FREE() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P.-F. I.1 – Avril 2012 J. MPI_COMM_SPLIT() ☞ Les constructeurs de communicateurs sont des opérateurs collectifs (qui engendrent des communications entre les processus) ☞ Les communicateurs que le programmeur crée peuvent être gérés dynamiquement et.154/326 8 – Communicateurs 8. Lavallée. divers sous-programmes existent pour construire des communicateurs : MPI_CART_CREATE(). D. Wautelet . MPI_CART_SUB(). D. Lecas. Chergui. Girou. de même qu’il est possible d’en créer. P.4 – Groupes et communicateurs ☞ Dans la bibliothèque MPI. Dupays. MPI_COMM_CREATE().

-F. car elle impose de : ☞ nommer différemment les deux communicateurs (par exemple comm_pair et comm_impair) . ! Diffusion du message seulement aux processus de rangs impairs call MPI_BCAST (a.comm_impair. MPI_REAL .rang_ds_pair.code) elseif (comm_impair /= MPI_COMM_NULL ) then .. Lavallée. ☞ laisser le soin à MPI d’ordonner le rang des processus dans ces deux communicateurs . Chergui. MPI_REAL ..code) end if INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.m. ! Diffusion du message seulement aux processus de rangs pairs call MPI_BCAST (a. P.m. ☞ passer par les groupes pour construire ces deux communicateurs . Wautelet ..1 – Avril 2012 J.5 – Communicateur issu d’un autre L’utilisation directe des groupes présente dans ce cas divers inconvénients.comm_pair.rang_ds_impair. P. D. Girou.155/326 8 – Communicateurs 8. I. Lecas.5 – Communicateur issu d’un autre 8 – Communicateurs 8.. Dupays. D. ☞ faire des tests conditionnels lors de l’appel au sous-programme MPI_BCAST() : if (comm_pair /= MPI_COMM_NULL ) then .

P.clef..nouveau_comm. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. clef integer. P. couleur. Lavallée. D. integer.156/326 8 – Communicateurs 8.code) processus rang_monde couleur clef rang_nv_com 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 Figure 35 – Construction de communicateurs avec MPI_COMM_SPLIT() Un processus qui se voit attribuer une couleur égale à la valeur MPI_UNDEFINED n’appartiendra qu’à son communicateur initial. I.. code call MPI_COMM_SPLIT (comm.1 – Avril 2012 J.-F. D. Chergui. Dupays.couleur. Lecas. intent(out) :: nouveau_comm. Wautelet . Girou.5 – Communicateur issu d’un autre Le sous-programme MPI_COMM_SPLIT() permet de partitionner un communicateur donné en autant de communicateurs que l’on veut. intent(in) :: comm.

P. Chergui. via le constructeur MPI_COMM_SPLIT().. Wautelet . D.1 – Avril 2012 J. D. P.-F. Lavallée. Girou. Dupays. ceci se met en place très simplement.5 – Communicateur issu d’un autre Voyons comment procéder pour construire le communicateur qui va subdiviser l’espace de communication entre processus de rangs pairs et impairs. Lecas..157/326 8 – Communicateurs 8. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_COMM_WORLD processus rang_monde couleur clef rang_pairs_imp 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 Figure 36 – Construction du communicateur CommPairsImpairs avec MPI_COMM_SPLIT() En pratique. I.

-F. dimension(m) :: :: :: :: m=16 clef. Girou. D.CommPairsImpairs. P.CommPairsImpairs rang_dans_monde. Wautelet . D. Lecas. if(rang_dans_monde == 5) a(:)=5.code a call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .m.mod(rang_dans_monde. Lavallée.0.1 – Avril 2012 J.code) call MPI_FINALIZE (code) end program PairsImpairs INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Chergui. I.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 8.5 – Communicateur issu d’un autre program PairsImpairs use mpi implicit none integer.2).rang_dans_monde. if(rang_dans_monde == 2) a(:)=2.code) ! Diffusion du message par le processus 0 de chaque communicateur aux processus ! de son groupe call MPI_BCAST (a.code) ! Destruction des communicateurs call MPI_COMM_FREE (CommPairsImpairs.code) ! Initialisation du vecteur A a(:)=0.clef. MPI_REAL . parameter integer integer real.OR.CommPairsImpairs. Dupays. clef = rang_dans_monde if (rang_dans_monde == 2 . rang_dans_monde == 5 ) then clef=-1 end if ! Création des communicateurs pair et impair en leur donnant une même dénomination call MPI_COMM_SPLIT ( MPI_COMM_WORLD .

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. I. Lavallée. Wautelet .6 – Topologies ☞ Dans la plupart des applications.6 – Topologies 8 – Communicateurs 8. Chergui. P. P. D. plus particulièrement dans les méthodes de décomposition de domaine où l’on fait correspondre le domaine de calcul à la grille de processus. ➠ les processus sont identifiés par leurs coordonnées dans la grille.-F.159/326 8 – Communicateurs 8. ➳ Topologies de type graphe ➠ généralisation à des topologies plus complexes. ➠ la grille peut être périodique ou non .1 – Avril 2012 J. Dupays. Lecas. il est intéressant de pouvoir disposer les processus suivant une topologie régulière ☞ MPI permet de définir des topologies virtuelles du type cartésien ou graphe ➳ Topologies de type cartésien ➠ chaque processus est défini dans une grille de processus . Girou.

160/326

8 – Communicateurs

8.6 – Topologies

8 – Communicateurs

8.6 – Topologies 8.6.1 – Topologies cartésiennes

☞ Une topologie cartésienne est définie lorsqu’un 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

call MPI_CART_CREATE (comm_ancien, ndims,dims,periods,reorganisation,comm_nouveau,code)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

161/326

8 – Communicateurs

8.6 – Topologies

☞ Exemple sur une grille comportant 4 domaines suivant x et 2 suivant y, périodique en y.
use mpi integer integer, parameter integer, dimension(ndims) logical, dimension(ndims) logical :: :: :: :: :: comm_2D, code ndims = 2 dims periods reorganisation

............................................... 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 même que dans l’ancien communicateur (MPI_COMM_WORLD). Si reorganisation = .true., l’implémentation MPI choisit l’ordre des processus.

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

162/326

8 – Communicateurs

8.6 – Topologies

y

1 0 1 0

3 2 3 2

5 4 5 4

7 6 7 6 x

Figure 37 – Topologie cartésienne 2D périodique en y

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, 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 périodique.
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)

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, 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

7

11

15

2

6

10

14 13 12 z=1 z=0

0 y z x

4

8

Figure 38 – Topologie cartésienne 3D non périodique

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

165/326

8 – Communicateurs

8.6 – Topologies

☞ Dans une topologie cartésienne, 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 entrée valent toutes 0, cela signifie qu’on laisse à MPI le choix du nombre de processus dans chaque direction en fonction du nombre total de processus. dims en entrée (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

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

I.rang. dimension(ndims). P. le sous-programme MPI_CART_RANK() retourne le rang du processus associé aux coordonnées dans la grille.coords. Wautelet . integer.intent(in) :: coords integer. D.-F.6 – Topologies ☞ Dans une topologie cartésienne. intent(in) :: comm_nouveau integer. code call MPI_CART_RANK (comm_nouveau. Dupays.166/326 8 – Communicateurs 8. Lavallée. Chergui. Lecas. intent(out) :: rang.1 – Avril 2012 J. D.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Girou.

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.rang(i).1) 0 (0.en sortie rang(0)=6.en sortie rang(1)=7.-F........0) 7 (3.....1) 0 (0. D.. P. Chergui.. Lavallée.1) 2 (1.0) x Figure 39 – Topologie cartésienne 2D périodique en y coords(1)=dims(1)-1 do i=0.. Wautelet . I.... P. Lecas..en entrée coords=(3.0) 5 (2.... Dupays..0) 1 (0.0)..0) 3 (1.1) 4 (2.code) end do ....0) 3 (1.1) 6 (3.coords. i=1.....6 – Topologies y 1 (0. D.0) 7 (3.1) 4 (2..167/326 8 – Communicateurs 8...dims(2)-1 coords(2) = i call MPI_CART_RANK (comm_2D..0) 5 (2...1) 6 (3. i=0..en entrée coords=(3...1 – Avril 2012 J.. Girou....1) 2 (1.1).

Lecas. ndims. Lavallée. coords. rang. Chergui.1 – Avril 2012 J. intent(in) :: comm_nouveau. rang. P. dimension(ndims).6 – Topologies ☞ Dans une topologie cartésienne. code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. P. Wautelet . D. ndims integer.intent(out) :: coords integer. Dupays. integer. Girou.-F. intent(out) :: code call MPI_CART_COORDS (comm_nouveau.168/326 8 – Communicateurs 8. I. le sous-programme MPI_CART_COORDS() retourne les coordonnées d’un processus de rang donné dans la grille.

1) 4 (2. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.0).(3. P.. D..169/326 8 – Communicateurs 8.4.. Wautelet ...(2.code) end if .....1 – Avril 2012 J. les valeurs de rang sont : 0. I.0)..1) 0 (0.-F..0) 7 (3. Girou. En entrée.rang.2..1) 2 (1...0) 5 (2.0) 3 (1.6..0) 1 (0.....0) 3 (1.1) 4 (2....1) 2 (1...0) x Figure 40 – Topologie cartésienne 2D périodique en y if (mod(rang. Lecas... En sortie. D.....1) 6 (3.. Lavallée.... P.6 – Topologies y 1 (0..0).coords..0)... Chergui.0) 5 (2. les valeurs de coords sont : (0..1) 6 (3.0) 7 (3..1) 0 (0...(1.2.2) == 0) then call MPI_CART_COORDS (comm_2D. Dupays..

pas integer. code) ☞ Le paramètre direction correspond à l’axe du déplacement (xyz). direction. P. direction.rang_suivant integer. Dupays. rang_suivant. intent(out) :: code call MPI_CART_SHIFT (comm_nouveau. ☞ Le paramètre pas correspond au pas du déplacement. Girou. P. D. rang_precedent. Wautelet .6 – Topologies ☞ Dans une topologie cartésienne. Chergui. un processus appelant le sous-programme MPI_CART_SHIFT() se voit retourner le rang de ses processus voisins dans une direction donnée. integer.170/326 8 – Communicateurs 8. Lavallée.-F. Lecas. I. D. pas. intent(out) :: rang_precedent. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. intent(in) :: comm_nouveau.1 – Avril 2012 J.

..0) direction = 1 x direction = 0 Figure 41 – Appel du sous-programme MPI_CART_SHIFT() call MPI_CART_SHIFT (comm_2D. Pour le processus 2..0...code) . Wautelet ........-F..rang_bas....... D.. P. I.........rang_gauche...... Dupays...rang_droit.0) 3 2 3 (1. Lecas.....rang_haut..code) ..1) 6 (3.. rang_droit=4 call MPI_CART_SHIFT (comm_2D.6 – Topologies y 1 0 1 (0...... rang_bas=3.1.1..1 – Avril 2012 J....1) 2 (1....171/326 8 – Communicateurs 8...1) 0 (0..... Girou... Lavallée.0) 7 6 7 (3... D....... Chergui........1.0) 5 4 5 (2. rang_gauche=0........ rang_haut=3 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4... P.1) 4 (2. Pour le processus 2.

.... rang_avant=-1.. rang_haut=2 call MPI_CART_SHIFT (comm_3D.....rang_haut.. Chergui..... rang_bas=-1...rang_arriere. Dupays.......1......... Pour le processus 0..6 – Topologies 3 2 0 y z x 7 11 15 6 4 10 8 14 13 12 z=1 z=0 direction=0 direction=1 direction=2 Figure 42 – Appel du sous-programme MPI_CART_SHIFT() call MPI_CART_SHIFT (comm_3D.1.1... rang_droit=4 call MPI_CART_SHIFT (comm_3D..2.. Pour le processus 0......172/326 8 – Communicateurs 8....rang_gauche...... P...-F.code) ...... I...rang_bas........1. D.....1 – Avril 2012 J... D......code) .. Lecas. Girou........ rang_gauche=-1........ P.rang_droit............... Lavallée.... Pour le processus 0............rang_avant.....0.... rang_arriere=1 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.code) ..... Wautelet .

integer.nb_procs.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Dupays.W=4 ndims = 2 dims. D.1 – Avril 2012 J. logical. Girou.173/326 8 – Communicateurs 8.comm_2D voisin N=1. I. Wautelet .ndims.E=2. logical :: :: dimension(4) :: parameter :: parameter :: dimension (ndims) :: dimension (ndims) :: :: rang_ds_topo.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. D. P. Lavallée. Lecas.nb_procs code.code) ! Connaître le nombre de processus suivant x et y dims(:) = 0 call MPI_DIMS_CREATE (nb_procs.coords periods reorganisation call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . integer.S=3. integer.dims.-F. Chergui.

174/326 8 – Communicateurs 8.true.voisin(N).0.1.false.-F.false.voisin(S). D.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 ! Création grille 2D périodique en y periods(1) = .rang_ds_topo.code) ! Recherche de mes voisins Sud et Nord call MPI_CART_SHIFT (comm_2D.1.code) call MPI_CART_COORDS (comm_2D. reorganisation = . call MPI_CART_CREATE ( MPI_COMM_WORLD .1 – Avril 2012 J.code) ! Connaître mes coordonnées dans la topologie call MPI_COMM_RANK (comm_2D.voisin(E).coords.1. D. Lecas. I. Chergui. Dupays. periods(2) = . P. P.periods.voisin(W). Lavallée. Wautelet .ndims.reorganisation.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.ndims.rang_ds_topo.comm_2D. Girou.code) call MPI_FINALIZE (code) end program decomposition INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.dims.

D.6. I. dégénérer une topologie cartésienne 2D (ou 3D) revient à créer autant de communicateurs qu’il y a de lignes ou de colonnes (resp.175/326 8 – Communicateurs 8. Lecas. si la topologie initiale est 3D.-F.1 – Avril 2012 J.6 – Topologies 8. si la topologie initiale est 2D .6 – Topologies 8 – Communicateurs 8. Girou. ☞ Pour MPI. P. ☞ L’intérêt majeur est de pouvoir effectuer des opérations collectives restreintes à un sous-ensemble de processus appartenant à : ➳ une même ligne (ou colonne). P. D. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 – Subdiviser une topologie cartésienne ☞ La question est de savoir comment dégénérer une topologie cartésienne 2D ou 3D de processus en une topologie cartésienne respectivement 1D ou 2D. Dupays. Chergui. Lavallée. ➳ un même plan. Wautelet . de plans) dans la grille cartésienne initiale.

I.176/326 8 – Communicateurs 8.-F. P. Lavallée. Dupays. Wautelet .6 – Topologies 2 1 0 0 0 1 2 4 3 1 5 7 6 2 8 V 11 1 0 0 0 1 2 2 4 3 1 5 7 6 2 8 10 9 3 11 V 10 9 3 Figure 43 – Deux exemples de distribution de données dans une topologie 2D dégénérée INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas. Girou. D. P. Chergui. D.1 – Avril 2012 J.

conserve_dims. D. 4 7 10 w=4 3 1 6 2 9 3 w=3 3 1 v(:)=3 w=3 w=3 4 v(:)=4 w=4 w=4 5 v(:)=5 w=5 w=5 8 11 w=5 7 10 w=4 6 2 9 3 w=3 Figure 44 – Représentation initiale d’un tableau V dans la grille 2D et représentation finale après la distribution de celui-ci sur la grille 2D dégénérée INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.intent(in) :: CommCart integer. v(:)=0. v(:)=0.177/326 8 – Communicateurs 8. ☞ en utilisant le sous-programme MPI_CART_SUB() prévu à cet effet.code) 2 1 0 0 0 1 v(:)=0. v(:)=0. logical. P. Girou. v(:)=0.intent(in). Wautelet .6 – Topologies Il existe deux façons de faire pour dégénérer une topologie : ☞ en utilisant le sous-programme général MPI_COMM_SPLIT() .CommCartD. v(:)=0. v(:)=3.-F. code call MPI_CART_SUB (CommCart. Lecas. v(:)=5. 2 5 8 11 2 1 0 0 0 1 2 w=5 v(:)=0. I.dimension(NDim) :: conserve_dims integer. v(:)=4. Dupays. Lavallée. P. Chergui.1 – Avril 2012 J. v(:)=0. v(:)=0. D.intent(out) :: CommCartD.

178/326 8 – Communicateurs 8.conserve_dims Reordonne m=4 V(:)=0. D.1 – Avril 2012 J. Girou.dimension(NDim2D) logical integer. P.Coord2D Periode. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Chergui.code NDim2D=2 Dim2D.Comm1D.6 – Topologies 1 2 3 4 5 6 7 8 9 10 11 12 program CommCartSub use mpi implicit none integer integer. Lavallée.rang. Dupays. W=0.-F. Lecas. dimension(m) real :: :: :: :: :: :: :: :: Comm2D. I.parameter integer.parameter real.dimension(NDim2D) logical. D. Wautelet .

Comm1D. P." . Lecas. ReOrdonne = .NDim2D.true.code) print ’("Rang : ".Comm1D.1.W.".code) ! Les processus de la colonne 2 distribuent le vecteur V aux processus de leur ligne call MPI_SCATTER (V. Chergui.W call MPI_FINALIZE (code) end program CommCartSub INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. conserve_dims(2) = .code) call MPI_CART_COORDS (Comm2D. ! Subdivision de la grille cartésienne 2D call MPI_CART_SUB (Comm2D.1.Coord2D.false. D. D. P. & rang.rang.ReOrdonne.code) call MPI_COMM_RANK (Comm2D.Comm2D.false.NDim2D.") . Coordonnees : (". W = ".Coord2D(1). Lavallée.false.1 – Avril 2012 J.179/326 8 – Communicateurs 8.I2.F2. I.I1. call MPI_CART_CREATE ( MPI_COMM_WORLD .Dim2D.-F. Girou.code) ! Initialisation du vecteur V if (Coord2D(1) == 1) V(:)=real(rang) ! Chaque ligne de la grille doit être une topologie cartésienne 1D conserve_dims(1) = .".rang. MPI_REAL .1.0)’.conserve_dims.Periode. MPI_REAL .Coord2D(2).I1.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) ! Création de la grille 2D initiale Dim2D(1) = 4 Dim2D(2) = 3 Periode(:) = . Dupays. Wautelet .

4. Coordonnees : (0. D. W W W W W W W W W W W W = = = = = = = = = = = = 3. Coordonnees : (0. Dupays. . . P. Coordonnees : (0. 4.1) . Coordonnees : (2. Coordonnees : (1. 4. Coordonnees : (1. 5.-F.0) . . D.1) . Coordonnees : (3. Wautelet .1 – Avril 2012 J. 5. . Coordonnees : (2.0) . P.2) . Coordonnees : (3. 3.1) .180/326 8 – Communicateurs 8. . Chergui.1) . . INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.0) . Coordonnees : (3. .2) .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 . 5. . Lavallée. Lecas. Coordonnees : (1. 5. 4. I.2) . Girou. 3.2) .0) . Coordonnees : (2. . . 3. .

. . .2 Via des déplacements implicites individuels . . . . . Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 Via des déplacements implicites partagés. .5. . . . . . . . .1. . . . . . . . . . . . . . . . . 192 9. . . . . . . . . . . . . . Dupays. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 Définition de vues . . . . . . . . . . . . . . . . . . . .Girou. . . .1. . . . .MPI . .2 Enjeux . . . . . . . . . . . . . . . Lecas. . . . . . . . . . .. . . . . . . . . 196 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 . . . . . . . . . . . . . . . .P. . . . . . . . . . . . 223 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .I. . . . . . . . . . . . . . . . . . . 218 9. . . . . . . . . . . . .2 Via des déplacements implicites individuels . .1 Via des déplacements explicites . . . .8. . . . . . . . . . . . . . . . . . . . . . . . . . .187 9. . . . . . . . . . .4. . . . . . . . . . . 196 9. .4 Lectures/écritures individuelles . . . . . . . . . . . . . . 235 . . . .2 Gestion de fichiers . . . . . . . . . . . . . . . . . . . . . .181/326 9 – MPI-IO 1 Introduction 2 Environnement 3 Communications point à point 4 5 6 7 Communications collectives Copies de mémoire à mémoire Types de données dérivés Optimisations 8 Communicateurs 9 MPI-IO 9. . .4. . . . . . 189 9. . . .8 Lectures/écritures non bloquantes . . . . . . . . .P. . . . . . . . . . . 220 9. . . . . . . . . . . . . . . . . .5. . . . . . . . . . 209 9. . . . . . . . . .6 Positionnement explicite des pointeurs dans un fichier . . . . . .1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 Lectures/écritures collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 9.1 Introduction . . . . . . . . . . . . .1 Via des déplacements explicites . . . . . . .3 Lectures/écritures : généralités . . . . .-F. . . . . . . . . . . . . . . . . . . . . . . . . .1 Via des déplacements explicites . . 184 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . D. . 182 9. . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . Chergui. . . . . Wautelet J. . . . . . . . . . .3 Via des déplacements implicites partagés. . . . . . . . . . . 201 9. . . . . . . 210 9. .–. . . . . . . . 236 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE . . . . . . . . . . .4. . . . .–. . . . . .. . . . . . . . . . . . . 212 9. . . .D. . . . . . . . . . . . 206 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Avril 2012 9. . . . . . . . . . . . . . . . .3 Définitions. . . . . . . Lavallée. . .. . . . . . . . . . . .

D. D.1 – Introduction 9. P. P. et génèrent donc un nombre conséquent d’entrées-sorties.1 – Avril 2012 J.182/326 9 – MPI-IO 9. les applications qui font des calculs volumineux manipulent également des quantités importantes de données externes. ☞ Le traitement efficace de celles-ci influe donc parfois très fortement sur les performances globales des applications. Wautelet .-F. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Introduction 9 – MPI-IO 9. Lavallée. I. Lecas.1. Chergui. Dupays. Girou.1 – Présentation ☞ Très logiquement.

I.). ☞ Les buts de MPI-IO.1 – Introduction ☞ L’optimisation des entrées-sorties de codes parallèles se fait par la combinaison : ➳ de leur parallélisation.1 – Avril 2012 J. Girou. etc. expressivité et souplesse. La définition des données accédées suivant les processus se fait par l’utilisation de types de données (de base ou bien dérivés). via l’interface de haut niveau qu’il propose. P.-F. pour éviter de créer un goulet d’étranglement en raison de leur sérialisation . Lavallée. elles sont gérées de façon similaire à ce que propose MPI pour les messages. Lecas. sont d’offrir simplicité. Dupays. D. ➳ de techniques mises en œuvre explicitement au niveau de la programmation (lectures / écritures non-bloquantes) . ☞ MPI-IO autorise des accès aussi bien séquentiels qu’aléatoires. D. Wautelet . Quant aux notions d’opérations collectives et de non-bloquantes. Chergui. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. ☞ MPI-IO offre une interface calquée sur celle utilisée pour l’échange de messages. gestion des tampons d’entrées-sorties.183/326 9 – MPI-IO 9. ➳ d’opérations spécifiques prises en charge par le système d’exploitation (regroupement des requêtes. tout en autorisant des implémentations performantes prenant en compte les spécificités matérielles et logicielles des dispositifs d’entrées-sorties des machines cibles.

184/326 9 – MPI-IO 9. D.1 – Introduction 9. certaines techniques d’optimisation sont accessibles aux utilisateurs.2 – Enjeux ☞ C’est une interface de haut niveau. mais où beaucoup d’optimisations essentielles peuvent être implémentées de façon transparente. Wautelet . où. Chergui. P. D.1 – Introduction 9 – MPI-IO 9. Deux exemples importants en sont : ➳ le cas d’accès nombreux. Girou. à de petits blocs discontinus : ceci peut être traité par un mécanisme de passoire (data sieving). par un seul processus. après regroupement d’un ensemble de requêtes. comme on l’a dit. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F.1. Dupays. I.1 – Avril 2012 J. P. Lavallée. puis affectation aux zones mémoire utilisateur des sous-ensembles adéquats de données . Lecas. lecture d’un grand bloc contigu du disque vers une zone mémoire tampon.

185/326 9 – MPI-IO 9. D. D.1 – Introduction Requêtes sur de petits blocs non contigus d’un fichier Lecture d’un grand bloc contigu et transfert dans une zone mémoire tampon Copies mémoire des éléments requis dans les variables du programme Figure 45 – Mécanisme de passoire dans le cas d’accès nombreux. Lavallée.-F. I. Lecas. Chergui. par un seul processus. Girou. P. Dupays. P. à de petits blocs discontinus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. Wautelet .

I.1 – Introduction ➳ le cas d’accès. P. D. processus 2 Communications Variable du processus 0 Variable du processus 1 Variable du processus 2 Figure 46 – Lecture en deux phases.-F. Requête proc. Dupays. 0 Requête proc. Lecas. Wautelet . Chergui.1 – Avril 2012 J. P. D. processus 0 Lecture Tampon mém. 1 Requête proc. processus 1 Lecture Tampon mém. par un ensemble de processus. par exemple) : ceci peut être traité par des entrées-sorties collectives en décomposant les opérations en deux phases. 2 Fichier Domaine du processus 0 Domaine du processus 1 Domaine du processus 2 Lecture Tampon mém.186/326 9 – MPI-IO 9. à des blocs discontinus (cas des tableaux distribués. par un ensemble de processus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. Lavallée.

P. exprimée en octets. D. prédéfini ou bien créé en tant que type dérivé. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. motif (filetype) : c’est un masque qui constitue la base du partitionnement d’un fichier entre processus (si le fichier est vu comme un pavage à une dimension. déplacement initial (displacement) : c’est une adresse absolue.1 – Introduction 9.3 – Définitions fichier (file) : un fichier MPI est un ensemble ordonné de données typées. Lavallée.1 – Avril 2012 J. P. ou bien un type dérivé MPI construit comme une répétition d’occurrences d’un tel type élémentaire de données (les trous — parties de fichiers non accédées — doivent également être un multiple du type_élém utilisé). par rapport au début du fichier et à partir de laquelle une vue commence. C’est ou bien un type élémentaire de données. type élémentaire de données — type_élém (etype) : c’est l’unité de donnée utilisée pour calculer les positionnements et pour accéder aux données. le motif est la tuile élémentaire qui sert au pavage). Dupays. I. D.187/326 9 – MPI-IO 9.1. Un fichier est ouvert collectivement par tous les processus d’un communicateur. Toutes les opérations d’entrées-sorties collectives ultérieures se feront dans ce cadre. Ce peut être n’importe quel type de donnée MPI.1 – Introduction 9 – MPI-IO 9. Wautelet . Girou.-F. Chergui. Lecas.

exprimée en nombre de type_élém. Girou. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. position (offset) : c’est la position dans le fichier. Il y en a de deux sortes : les pointeurs individuels qui sont propres à chaque processus ayant ouvert le fichier .188/326 9 – MPI-IO 9. C’est un ensemble ordonné de types élémentaires de données. une fois que celui-ci a été ouvert. descripteur (file handle) : le descripteur est un objet caché créé à l’ouverture et détruit à la fermeture d’un fichier. P. D. relativement à la vue courante (les trous définis dans la vue ne sont pas comptabilisés pour calculer les positions). pointeur (file pointer) : ils sont tenus à jour automatiquement par MPI et déterminent des positions à l’intérieur du fichier. Wautelet . Chergui. I.1 – Introduction vue (view) : une vue définit l’ensemble des données visibles (et donc accessibles) d’un fichier. taille du fichier (file size) : la taille d’un fichier MPI est mesurée en nombre d’octets. les pointeurs partagés qui sont communs à tous les processus ayant ouvert le fichier. D. Toutes les opérations sur un fichier se font en spécifiant comme référence son descripteur. Lecas. Lavallée.-F. Dupays.1 – Avril 2012 J. P.

pré-allocation. I. Wautelet . P. Girou. P. obtention des caractéristiques) mais d’autres sont disponibles (suppression. Dupays. la destruction éventuelle à la fermeture. fermeture. ☞ Les attributs (décrivant les droits d’accès. etc. Chergui.-F.). ☞ L’ouverture d’un fichier renvoie un descripteur. qui sera ensuite utilisé dans toutes les opérations portant sur ce fichier.2 – Gestion de fichiers ☞ Les tâches courantes de gestion de fichiers sont des opérations collectives faites par tous les processus du communicateur indiqué.189/326 9 – MPI-IO 9. etc.) doivent être précisés par opérations sur des constantes prédéfinies. ☞ Les informations disponibles via le sous-programme MPI_FILE_SET_INFO() varient d’une implémentation à l’autre. D. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. ☞ Tous les processus du communicateur au sein duquel un fichier est ouvert participeront aux opérations collectives ultérieures d’accès aux données. ☞ Nous ne décrivons ici que les principaux sous-programmes (ouverture. Lecas. D. Lavallée. le mode d’ouverture.2 – Gestion de fichiers 9 – MPI-IO 9.

Lecas. P.1 – Avril 2012 J.190/326 9 – MPI-IO 9. Chergui. D. Lavallée. D. Dupays.2 – Gestion de fichiers Table 4 – Attributs pouvant être positionnés lors de l’ouverture des fichiers 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 Signification seulement en lecture en lecture et écriture seulement en écriture création du fichier s’il n’existe pas erreur si le fichier existe erreur si le fichier est déjà ouvert par une autre application accès séquentiel pointeurs en fin de fichier (mode ajout) destruction après la fermeture INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. P. Girou. Wautelet .-F.

Wautelet .descripteur. D. Dupays. Girou. P."fichier. Lecas.txt".txt -rw------1 nom grp 0 Feb 08 12:13 fichier.-F. D. P.code) call MPI_FILE_CLOSE (descripteur. I. Lavallée. & MPI_MODE_RDWR + MPI_MODE_CREATE . MPI_INFO_NULL .2 – Gestion de fichiers 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 .txt INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.code) call MPI_FINALIZE (code) end program open01 > ls -l fichier. Chergui.191/326 9 – MPI-IO 9.1 – Avril 2012 J.

☞ Il y a de nombreuses variantes disponibles : nous en décrirons un certain nombre. D. via des pointeurs gérés par le système (ces pointeurs peuvent être de deux types : soit individuels à chaque processus. P. I.-F. soit partagés par tous les processus) .1 – Avril 2012 J. Lavallée. Dupays. Wautelet . Lecas. P. D. les accès pouvant être collectifs (c’est-à-dire effectués par tous les processus du communicateur au sein duquel le fichier a été ouvert) ou propres seulement à un ou plusieurs processus. ➳ la synchronisation. les accès pouvant être de type bloquants ou non bloquants . ➳ le regroupement.192/326 9 – MPI-IO 9.3 – Lectures/écritures : généralités ☞ Les transferts de données entre fichiers et zones mémoire des processus se font via des appels explicites à des sous-programmes de lecture et d’écriture. ☞ On distingue trois propriétés des accès aux fichiers : ➳ le positionnement. Chergui. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. qui peut être explicite (en spécifiant par exemple le nombre voulu d’octets depuis le début du fichier) ou implicite. Girou. sans pouvoir être exhaustif.3 – Lectures/écritures : généralités 9 – MPI-IO 9.

Dupays. I.3 – Lectures/écritures : généralités Table 5 – Résumé des types d’accès possibles Positionnement Synchronisation Regroupement individuel MPI_FILE_READ_AT MPI_FILE_WRITE_AT MPI_FILE_IREAD_AT 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 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée. Lecas.1 – Avril 2012 J. P. D.193/326 9 – MPI-IO 9.-F. Wautelet . Chergui. D. Girou. P.

Chergui. D. P. Dupays.1 – Avril 2012 J. I. Lecas.3 – Lectures/écritures : généralités Positionnement Synchronisation bloquantes Regroupement individuel MPI_FILE_READ MPI_FILE_WRITE MPI_FILE_IREAD MPI_FILE_IWRITE collectif pointeurs implicites individuels non bloquantes MPI_FILE_READ_ALL MPI_FILE_WRITE_ALL MPI_FILE_READ_ALL_BEGIN MPI_FILE_READ_ALL_END MPI_FILE_WRITE_ALL_BEGIN MPI_FILE_WRITE_ALL_END 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 partagés non bloquantes MPI_FILE_IWRITE_SHARED MPI_FILE_WRITE_ORDERED_BEGIN MPI_FILE_WRITE_ORDERED_END bloquantes INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. D. Wautelet . Lavallée. Girou.-F.194/326 9 – MPI-IO 9.

Lavallée. qui doit correspondre à une suite de copies contiguë du type élémentaire de donnée (type_élém) de la « vue » courante. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. P.1 – Avril 2012 J. Wautelet . I. Lecas. Dupays. Chergui. le type de données. D. le nombre d’éléments pris en compte .-F. D. P.3 – Lectures/écritures : généralités ☞ Il est possible de mélanger les types d’accès effectués à un même fichier au sein d’une application.195/326 9 – MPI-IO 9. ☞ Les ➳ ➳ ➳ zones mémoire accédées sont décrites par trois quantités : l’adresse initiale de la zone concernée .

1 – Avril 2012 J. Wautelet .1 – Via des déplacements explicites ☞ La position est exprimée en nombre d’occurrences d’un type de données. I. D. ☞ Le fichier ne doit pas avoir été ouvert avec l’attribut MPI_MODE_SEQUENTIAL. lequel doit être un multiple du type élémentaire de donnée de la « vue » courante. Chergui. Dupays. P.4 – Lectures/écritures individuelles 9. P.4. Lecas.196/326 9 – MPI-IO 9. D. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F.4 – Lectures/écritures individuelles 9 – MPI-IO 9. Girou.

P.code) call MPI_FILE_CLOSE (descripteur.code) call MPI_FINALIZE (code) end program write_at INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. ":".nb_valeurs)/) print *. Wautelet .code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_WRITE_AT (descripteur. D.position_fichier.1 – Avril 2012 J.valeurs(:) call MPI_FILE_OPEN ( MPI_COMM_WORLD . P. dimension(nb_valeurs) integer. dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 i. parameter integer integer(kind= MPI_OFFSET_KIND ) integer. Lecas."donnees.4 – Lectures/écritures individuelles 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.-F. Dupays. Lavallée.dat". "Écriture processus". MPI_MODE_WRONLY + MPI_MODE_CREATE . I.code) call MPI_TYPE_SIZE ( MPI_INTEGER . MPI_INTEGER . Chergui.nb_valeurs.nb_octets_entier.code) valeurs(:)= (/(i+rang*100.rang.rang.nb_octets_entier position_fichier valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .code.descripteur. Girou.valeurs.rang.i=1.197/326 9 – MPI-IO 9. & MPI_INFO_NULL .descripteur. & statut.

10 110 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 105. D. 109. 2. 4. 8. 101. 7. Chergui. Dupays. 6. 5. 102. 108. 107. 106. 3.198/326 9 – MPI-IO 9. P.4 – Lectures/écritures individuelles Processus 0 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 101 102 103 104 105 106 107 108 109 110 Figure 47 – Exemple d’utilisation de MPI_FILE_WRITE_AT() > mpiexec -n 2 write_at Écriture processus 0 : Écriture processus 1 : 1. 9. 103. Girou. P. Lecas. Wautelet .1 – Avril 2012 J.-F. Lavallée. D. I. 104.

I.code. Chergui."donnees.199/326 9 – MPI-IO 9. Wautelet .nb_valeurs.-F. D. Lecas.nb_octets_entier.dat". D.":". & statut. dimension(nb_valeurs) integer.code) call MPI_TYPE_SIZE ( MPI_INTEGER .code) call MPI_FINALIZE (code) end program read_at INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_INFO_NULL .code) print *.code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_READ_AT (descripteur. dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 rang. P.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD . Lavallée. & descripteur.1 – Avril 2012 J.rang.valeurs(:) call MPI_FILE_CLOSE (descripteur. parameter integer integer(kind= MPI_OFFSET_KIND ) integer. Dupays.descripteur. P.4 – Lectures/écritures individuelles 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.nb_octets_entier position_fichier valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . "Lecture processus".valeurs. MPI_INTEGER . MPI_MODE_RDONLY .rang.position_fichier. Girou.

Dupays. 7. 105. Girou. I. 108. 109. 104. D. Chergui. 102. D. 106. 6. 9. 5.-F. P. Wautelet .1 – Avril 2012 J. 107. 8. 110 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P.4 – Lectures/écritures individuelles Processus 0 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 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 d’utilisation de MPI_FILE_READ_AT() > mpiexec -n 2 read_at Lecture processus 0 : 1. Lecas. 2.200/326 9 – MPI-IO 9. Lavallée. 3. 4. 10 Lecture processus 1 : 101. 103.

☞ Le fichier ne doit pas avoir été ouvert avec l’attribut MPI_MODE_SEQUENTIAL. ☞ Dans tous ces sous-programmes.4. D. D. ☞ Pour un processus donné. Girou. le pointeur est positionné sur le type élémentaire de donnée suivant.201/326 9 – MPI-IO 9. Lavallée. et ceci par fichier et par processus. deux accès successifs au même fichier permettent donc d’accéder automatiquement aux éléments consécutifs de celui-ci. Chergui. Wautelet . P.-F.4 – Lectures/écritures individuelles 9 – MPI-IO 9. les pointeurs partagés ne sont jamais accédés ou modifiés. P.2 – Via des déplacements implicites individuels ☞ Dans ces cas-ci.1 – Avril 2012 J. ☞ Après chaque accès. un pointeur individuel est géré par le système. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. Lecas. Dupays.4 – Lectures/écritures individuelles 9.

descripteur.valeurs.-F. Chergui.valeurs(7).code valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . MPI_INTEGER . D.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD . MPI_MODE_RDONLY . MPI_INFO_NULL ."donnees.code) call MPI_FINALIZE (code) end program read01 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. parameter integer integer. I.dat".202/326 9 – MPI-IO 9. MPI_INTEGER .code) call MPI_FILE_READ (descripteur. Lavallée.code) call MPI_FILE_READ (descripteur.4.statut. P. dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang. & descripteur.statut.valeurs(:) call MPI_FILE_CLOSE (descripteur. D.code) print *. P. Lecas. Girou. Wautelet .":". dimension(nb_valeurs) integer. "Lecture processus".1 – Avril 2012 J.rang.4 – Lectures/écritures individuelles 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.6.rang. Dupays.

D. Girou. 2. Wautelet .-F. 5. 9. 6. Dupays. 10 10 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 6. P.4 – Lectures/écritures individuelles Processus 0 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 1 2 3 4 5 6 1 2 3 4 5 6 7 8 9 10 Figure 49 – Exemple 1 d’utilisation de MPI_FILE_READ() > mpiexec -n 2 read01 Lecture processus 1 : Lecture processus 0 : 1. Chergui. 8. 1. 8.1 – Avril 2012 J. 3. 3. 9. Lavallée. Lecas. 4. 2. 4. 5. D. I. 7.203/326 9 – MPI-IO 9. 7. P.

Lecas.valeurs. I. Dupays. P.dat".code) call MPI_FILE_READ (descripteur.rang.":". & descripteur.code) if (rang == 0) then call MPI_FILE_READ (descripteur.code valeurs=0 statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .5.-F. MPI_MODE_RDONLY . Girou.1 – Avril 2012 J.code) end if print *. Lavallée.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .valeurs.8.statut.valeurs(1:8) call MPI_FILE_CLOSE (descripteur.statut."donnees. dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang.rang. dimension(nb_valeurs) integer. D.204/326 9 – MPI-IO 9.5. MPI_INTEGER . parameter integer integer. MPI_INTEGER .4 – Lectures/écritures individuelles 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. "Lecture processus".code) call MPI_FINALIZE (code) end program read02 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.valeurs.code) else call MPI_FILE_READ (descripteur.descripteur. MPI_INTEGER .statut. D. Chergui. P. Wautelet . MPI_INFO_NULL .

3. 6. 10. Lavallée. D. Girou. 103.205/326 9 – MPI-IO 9.-F.4 – Lectures/écritures individuelles 1 Processus 0 0 2 0 3 0 4 0 5 0 0 0 0 0 0 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 1 2 3 4 5 6 7 8 0 0 9 10 101 102 103 6 1 2 3 4 5 7 8 0 0 Figure 50 – Exemple 2 d’utilisation de MPI_FILE_READ() > mpiexec -n 2 read02 Lecture processus 0 : Lecture processus 1 : 1. 5. 4. Chergui. P. 0 8 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas. 9. 0. 7. Wautelet . 2. Dupays. 102.1 – Avril 2012 J. I. P. 0. 101. D.

commun à tous les processus du communicateur dans lequel le fichier a été ouvert.206/326 9 – MPI-IO 9. l’ordre de lecture n’est pas déterministe. le pointeur est positionné sur le type élémentaire de donnée suivant.3 – Via des déplacements implicites partagés ☞ Il existe un et un seul pointeur partagé par fichier. Chergui. Lavallée.-F. P. ☞ Tous les processus qui font une opération d’entrée-sortie utilisant le pointeur partagé doivent employer pour ce faire la même vue du fichier.4 – Lectures/écritures individuelles 9. D. P. il faut explicitement gérer l’ordonnancement des processus ou utiliser les variantes collectives. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.4. ☞ Après chaque accès.4 – Lectures/écritures individuelles 9 – MPI-IO 9. Lecas.1 – Avril 2012 J. Girou. Si le traitement doit être déterministe. Dupays. D. ☞ Si on utilise les variantes non collectives des sous-programmes. les pointeurs individuels ne sont jamais accédés ou modifiés. I. Wautelet . ☞ Dans tous ces sous-programmes.

P. MPI_INTEGER .4.dat".code) call MPI_FILE_READ_SHARED (descripteur. dimension(nb_valeurs) integer. I. & descripteur. dimension( MPI_STATUS_SIZE ) :: :: :: :: rang. Girou.4 – Lectures/écritures individuelles 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. Lavallée. D.":".code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .descripteur. Chergui.code) print *.207/326 9 – MPI-IO 9.statut.code) call MPI_FILE_READ_SHARED (descripteur.1 – Avril 2012 J. Dupays.-F.code) call MPI_FINALIZE (code) end program read_shared01 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. parameter integer. MPI_MODE_RDONLY . P. MPI_INFO_NULL . MPI_INTEGER . D.6.rang.valeurs. "Lecture processus".valeurs(:) call MPI_FILE_CLOSE (descripteur.statut.rang.valeurs(5). Lecas."donnees. Wautelet .code nb_valeurs=10 valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .

8. 110 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 6. 104. Chergui. Lavallée. D. 3. D. 106. 108. 7. 102. 4. P.208/326 9 – MPI-IO 9. 10 0 : 101. Wautelet .-F.1 – Avril 2012 J. 107. Girou.4 – Lectures/écritures individuelles Processus 0 101 102 103 104 101 102 103 104 105 106 107 108 109 110 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 1 2 3 4 1 2 3 4 5 6 7 8 9 10 Figure 51 – Exemple 2 d’utilisation de MPI_FILE_READ_SHARED() > mpiexec -n 2 read_shared01 Lecture processus Lecture processus 1 : 1. 5. I. 9. Dupays. Lecas. 109. 105. 2. P. 103.

Dupays.5 – Lectures/écritures collectives 9 – MPI-IO 9. Lecas. D. Le traitement est donc dans ce cas déterministe. ☞ Dans les opérations collectives. Wautelet . D. parce qu’elles autorisent davantage de techniques d’optimisation mises en œuvre automatiquement (comme les accès en deux phases — voir le paragraphe 2). Girou.-F. I. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. ☞ Les opérations collectives sont généralement plus performantes que les opérations individuelles. P. P.5 – Lectures/écritures collectives ☞ Tous les processus du communicateur au sein duquel un fichier est ouvert participent aux opérations collectives d’accès aux données.209/326 9 – MPI-IO 9. les accès sont effectués dans l’ordre des rangs des processus. Chergui.1 – Avril 2012 J.

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 . Girou.1 – Via des déplacements explicites program read_at_all use mpi implicit none integer.code) print *.1 – Avril 2012 J. Chergui.-F."donnees.statut.210/326 9 – MPI-IO 9.5.5 – Lectures/écritures collectives 9. dimension(nb_valeurs) integer. "Lecture processus". MPI_INFO_NULL .5 – Lectures/écritures collectives 9 – MPI-IO 9. Wautelet .rang.code) call MPI_TYPE_SIZE ( MPI_INTEGER .":". & descripteur.valeurs.rang. Lavallée. D.nb_octets_entier.code.nb_valeurs. P. Dupays. P.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD . parameter integer integer(kind= MPI_OFFSET_KIND ) integer.code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_READ_AT_ALL (descripteur. & MPI_INTEGER . I.position_fichier. Lecas.descripteur. dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 rang.dat".valeurs(:) call MPI_FILE_CLOSE (descripteur.code) call MPI_FINALIZE (code) end program read_at_all INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. MPI_MODE_RDONLY .

I.5 – Lectures/écritures collectives Processus 0 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 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 d’utilisation de MPI_FILE_READ_AT_ALL() > mpiexec -n 2 read_at_all Lecture processus 0 : 1.-F. P. 3. Dupays. 10 Lecture processus 1 : 101. 106. 9. 5. 4. 104. 103.1 – Avril 2012 J. D.211/326 9 – MPI-IO 9. Wautelet . 102. 7. 110 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 109. P. D. Girou. 105. 6. 8. Lavallée. 108. 2. Chergui. Lecas. 107.

rang.-F.dat". parameter integer. Lavallée.code nb_valeurs=10 valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .valeurs(5).6. dimension( MPI_STATUS_SIZE ) :: :: :: :: rang. MPI_MODE_RDONLY .2 – Via des déplacements 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 program read_all01 use mpi implicit none integer integer.1 – Avril 2012 J. D. Chergui.5 – Lectures/écritures collectives 9. Wautelet .statut.5 – Lectures/écritures collectives 9 – MPI-IO 9. D.rang. Lecas. I.descripteur. P. MPI_INFO_NULL . MPI_INTEGER .valeurs(:) call MPI_FILE_CLOSE (descripteur. "Lecture processus ". ":".212/326 9 – MPI-IO 9.4.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD . dimension(nb_valeurs) integer.code) call MPI_FINALIZE (code) end program read_all01 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4."donnees. Dupays.5. MPI_INTEGER .code) print *. P.valeurs. & descripteur. Girou.statut.code) call MPI_FILE_READ_ALL (descripteur.code) call MPI_FILE_READ_ALL (descripteur.

D. 9. 3. 10 Lecture processus 1 : 1. 9.213/326 9 – MPI-IO 9.5 – Lectures/écritures collectives Processus 0 1 2 3 4 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 1 2 3 4 1 2 3 4 5 6 7 8 9 10 Figure 53 – Exemple 1 d’utilisation de MPI_FILE_READ_ALL() > mpiexec -n 2 read_all01 Lecture processus 0 : 1. 8. Dupays. I. P. Girou. 4. Wautelet . 10 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 2. Chergui. 6. Lavallée. Lecas. 7. 3. 2. P. 5. 5. 7.-F.1 – Avril 2012 J. D. 6. 4. 8.

214/326

9 – MPI-IO

9.5 – Lectures/écritures 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 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

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

215/326

9 – MPI-IO

9.5 – Lectures/écritures collectives

Processus 0

0

0

1 0

2 0

3 0

4 0

0

0

0

0

Fichier

1

2

3

4

5

6

7

8

9

10 101 102 103 104 105 106 107 108 109 110

Processus 1

0

0

0

0

1 0

2 0

3 0

4 0

5 0

0

Figure 54 – Exemple 2 d’utilisation de MPI_FILE_READ_ALL()

> mpiexec -n 2 read_all02 Lecture processus 1 : 0, 0, 0, 0, 1, 2, 3, 4, 5, 0 Lecture processus 0 : 0, 0, 1, 2, 3, 4, 0, 0, 0, 0

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

216/326

9 – MPI-IO

9.5 – Lectures/écritures 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 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

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

217/326

9 – MPI-IO

9.5 – Lectures/écritures collectives

Processus 0

0

0

1 0

2 0

3 0

4 0

0

0

0

0

Fichier

1

2

3

4

5

6

7

8

9

10 101 102 103 104 105 106 107 108 109 110

Processus 1

0

0

0

0

1 0

2 0

3 0

4 0

5 0

0

Figure 55 – Exemple 3 d’utilisation de MPI_FILE_READ_ALL()

> mpiexec -n 2 read_all03 Lecture processus 1 : 0, 0, 0, 0, 1, 2, 3, 4, 5, 0 Lecture processus 0 : 0, 0, 1, 2, 3, 4, 0, 0, 0, 0

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

218/326

9 – MPI-IO

9.5 – Lectures/écritures collectives

9 – MPI-IO

9.5 – Lectures/écritures collectives 9.5.3 – Via des déplacements implicites partagés

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

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

219/326

9 – MPI-IO

9.5 – Lectures/écritures collectives

Processus 0 1

2

3

4

1

2

3

4

9 10 101 102 103 104

Fichier

1

2

3

4

5

6

7

8

9 10 101 102 103 104 105 106 107 108 109 110

Processus 1 5

6

7

8

5

6

7

8 105 106 107 108 109 110

Figure 56 – Exemple d’utilisation de MPI_FILE_ORDERED()

> 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

INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE

MPI – Version 4.1 – Avril 2012 J. Chergui, I. Dupays, D. Girou, P.-F. Lavallée, D. Lecas, P. Wautelet

ce qui permet de revenir en arrière dans le fichier. et de même le pointeur partagé avec le sous-programme MPI_FILE_SEEK_SHARED(). INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. MPI_SEEK_CUR fixe une valeur relative . Lavallée.-F. P. Girou. Chergui.6 – Positionnement explicite des pointeurs dans un fichier ☞ Les sous-programmes MPI_FILE_GET_POSITION() et MPI_FILE_GET_POSITION_SHARED() permettent de connaître respectivement la valeur courante des pointeurs individuels et celle du pointeur partagé. Wautelet . P. on peut spécifier une valeur négative. D. ☞ Avec MPI_SEEK_CUR. I. Lecas. ☞ Il y ➳ ➳ ➳ a trois modes possibles pour fixer la valeur d’un pointeur : MPI_SEEK_SET fixe une valeur absolue .6 – 9 – MPI-IO Positionnement explicite des pointeurs dans un fichier 9 – MPI-IO 9. MPI_SEEK_END positionne le pointeur à la fin du fichier. à laquelle un déplacement éventuel est ajouté. ☞ Il est possible de positionner explicitement les pointeurs individuels à l’aide du sous-programme MPI_FILE_SEEK().220/326 9. D.1 – Avril 2012 J.

P.code) position_fichier=4*nb_octets_entier call MPI_FILE_SEEK (descripteur.-F. dimension(nb_valeurs) integer. D.code) call MPI_FILE_READ (descripteur. MPI_MODE_RDONLY . & descripteur. MPI_INFO_NULL . Lavallée.code) call MPI_FILE_READ (descripteur.221/326 9.valeurs(:) call MPI_FILE_CLOSE (descripteur.code) call MPI_FILE_READ (descripteur.statut.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD . Lecas.3.nb_octets_entier.6 – 9 – MPI-IO Positionnement explicite des pointeurs dans un fichier 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. MPI_INTEGER .code position_fichier valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . MPI_INTEGER . Dupays.dat". MPI_SEEK_SET .code) print *.position_fichier. parameter integer integer(kind= MPI_OFFSET_KIND ) integer.rang.valeurs(4).1 – Avril 2012 J.4.statut.code) position_fichier=8*nb_octets_entier call MPI_FILE_SEEK (descripteur. MPI_SEEK_CUR .code) call MPI_FINALIZE (code) end program seek INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.3. "Lecture processus".valeurs(7). MPI_INTEGER .nb_octets_entier.position_fichier. D. Girou. dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 rang.code) call MPI_TYPE_SIZE ( MPI_INTEGER . Chergui.":".valeurs."donnees.rang.statut. Wautelet .descripteur. P. I.

Dupays.222/326 9. 2.-F. 8 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 3.6 – 9 – MPI-IO Positionnement explicite des pointeurs dans un fichier Processus 0 1 2 3 1 2 3 102103104 1 2 3 102103104 5 6 7 8 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 1 2 3 1 2 3 102103104 1 2 3 102103104 5 6 7 8 Figure 57 – Exemple d’utilisation de MPI_FILE_SEEK() > mpiexec -n 2 seek Lecture processus 1 : 1. 2. Chergui. 5. Girou. 7. D. Wautelet . 6. 103. 104.1 – Avril 2012 J. Lavallée. 6. 8 Lecture processus 0 : 1. 104. D. 3. I. 7. 103. 5. P. P. 102. 102. Lecas.

7 – Définition de vues 9 – MPI-IO 9. ☞ Un pointeur partagé n’est utilisable avec une vue que si tous les processus ont la même vue. définie par trois variables : un déplacement initial.7 – Définition de vues ☞ Les vues sont un mécanisme souple et puissant pour décrire les zones accédées dans les fichiers. Chergui.-F. P. une fois le positionnement initial effectué. D. Lecas. Wautelet . un type élémentaire de données et un motif. Girou.223/326 9 – MPI-IO 9. ☞ Il est possible de définir des trous dans une vue. ☞ Les vues sont construites à l’aide de types dérivés MPI ☞ Chaque processus a sa propre vue (ou ses propres vues) d’un fichier. I. P. ☞ Des processus différents peuvent parfaitement avoir des vues différentes du fichier. Lavallée. Une vue est définie comme répétition du motif. de façon à accéder à des parties complémentaires de celui-ci. de façon à ne pas tenir compte de certaines parties des données. ☞ Un processus donné peut définir et utiliser plusieurs vues différentes du même fichier. D. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays.1 – Avril 2012 J.

Girou. type_élém motif trous fichier déplacement initial données accessibles ··· Figure 58 – Type élémentaire de donnée et motif INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. même partiellement. Wautelet . les zones décrites par les types élémentaires et les motifs ne peuvent se recouvrir.224/326 9 – MPI-IO 9.1 – Avril 2012 J. I.7 – Définition de vues ☞ Si le fichier est ouvert en écriture.-F. P. Lecas. Chergui. type_élém et motif égaux à MPI_BYTE). Lavallée. P. ☞ La vue par défaut consiste en une simple suite d’octets (déplacement initial nul. D. D. Dupays.

P. Lavallée.1 – Avril 2012 J.7 – Définition de vues type_élém motif proc. I. Wautelet .225/326 9 – MPI-IO 9. Lecas. P. 2 fichier déplacement initial Figure 59 – Exemple de définition de motifs différents selon les processus ··· INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. 0 motif proc. Girou. 1 motif proc. D. D.-F. Chergui.

motif. P. D.-F. D. parameter integer(kind= MPI_ADDRESS_KIND ). Dupays.226/326 9 – MPI-IO 9. I.taille longueurs. P.descripteur.motif_temp. dimension( MPI_STATUS_SIZE ) :: :: :: :: :: :: :: :: nb_valeurs=10 borne_inf_zero=0 rang. dimension(2) integer. Chergui.parameter integer integer(kind= MPI_OFFSET_KIND ) integer(kind= MPI_ADDRESS_KIND ) integer.code deplacement_initial borne_inf.deplacements valeurs statut MPI_INTEGER 1 2 3 4 5 6 7 8 9 10 11 12 13 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. dimension(nb_valeurs) integer. Wautelet . Lavallée.7 – Définition de vues dép_initial 2 entiers type_élém motif trous Figure 60 – Motif employé dans l’exemple 1 d’utilisation de MPI_FILE_SET_VIEW() program read_view01 use mpi implicit none integer.1 – Avril 2012 J. Lecas. Girou.

code) call MPI_FINALIZE (code) end program read_view01 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_INFO_NULL .code) call MPI_FILE_READ (descripteur. Lavallée.taille. pour des raisons de portabilité deplacement_initial=0 call MPI_FILE_SET_VIEW (descripteur.longueurs.statut. MPI_INTEGER . & descripteur. D."donnees.code) MPI_TYPE_GET_EXTENT (motif_temp."Lecture processus". MPI_INTEGER .code) deplacements(1)=1 deplacements(2)=4 longueurs(1)=2 longueurs(2)=1 call call call call MPI_TYPE_INDEXED (2.dat".valeurs(:) call MPI_FILE_CLOSE (descripteur.valeurs(8).code) MPI_TYPE_COMMIT (motif.code) print *.":". MPI_INFO_NULL . & "native".code) MPI_TYPE_CREATE_RESIZED (motif_temp. D.borne_inf+taille. MPI_MODE_RDONLY .rang.deplacements.7 – Définition de vues call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .motif.-F.code) ! Ne pas omettre de passer par une variable intermédiaire de représentation ! MPI_OFFSET_KIND. P. MPI_INTEGER .code) call MPI_FILE_READ (descripteur.statut.7. I.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .deplacement_initial. Girou.rang.borne_inf.1 – Avril 2012 J. MPI_INTEGER .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 9.3. Lecas. Chergui.valeurs. P.motif_temp. Dupays.borne_inf_zero. Wautelet .motif.

10. 5. Girou. Lecas. I. 107 Lecture processus 0 : 2. 105. D. 102. 103. Dupays. Lavallée.7 – Définition de vues Processus 0 2 3 5 7 8 10 102 2 3 5 7 8 10 102 103 105 107 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 2 3 5 7 8 10 102 2 3 5 7 8 10 102 103 105 107 Figure 61 – Exemple 1 d’utilisation de MPI_FILE_SET_VIEW() > mpiexec -n 2 read_view01 Lecture processus 1 : 2. 105. 8. 5. 103. 10. D. 7.-F. P. 7. 107 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 102. Wautelet . P.1 – Avril 2012 J. 3. 3. Chergui.228/326 9 – MPI-IO 9. 8.

dimension(nb_valeurs) integer. I. Wautelet .-F. P. Chergui. Lavallée.coord.code deplacement_initial valeurs statut 1 2 3 4 5 6 7 8 9 10 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.7 – Définition de vues dép_initial type_élém motif proc. Lecas. 1 0 MPI_INTEGER Figure 62 – Motif employé dans l’exemple 2 d’utilisation de MPI_FILE_SET_VIEW() program read_view02 use mpi implicit none integer. D.1 – Avril 2012 J. dimension( MPI_STATUS_SIZE ) :: :: :: :: :: nb_valeurs=10 rang. 0 motif proc. parameter integer integer(kind= MPI_OFFSET_KIND ) integer. D.motif.229/326 9 – MPI-IO 9. Dupays. Girou.descripteur. P.

230/326 9 – MPI-IO 9.-F.":".(/coord .statut. Lavallée.code) print *.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .code) if (rang == 0) then coord=1 else coord=3 end if call MPI_TYPE_CREATE_SUBARRAY (1. D.rang. P.(/2/).deplacement_initial. MPI_INTEGER . D.code) call MPI_FILE_READ (descripteur.rang. Wautelet . & MPI_ORDER_FORTRAN .1/)."donnees.nb_valeurs. I.code) call MPI_FINALIZE (code) end program read_view02 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. "Lecture processus". MPI_MODE_RDONLY . & descripteur.code) call MPI_TYPE_COMMIT (motif.code) deplacement_initial=0 call MPI_FILE_SET_VIEW (descripteur. & "native".valeurs.7 – Définition de vues 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 . Dupays. Girou. MPI_INTEGER . Lecas.1 – Avril 2012 J.motif.valeurs(:) call MPI_FILE_CLOSE (descripteur. MPI_INTEGER .(/4/).motif. MPI_INFO_NULL . Chergui.dat". MPI_INFO_NULL . P.

Girou.7 – Définition de vues Processus 0 1 2 5 6 9 10 103 104 107 108 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 3 4 7 8 101 102 105 106 109 110 Figure 63 – Exemple 2 d’utilisation de MPI_FILE_SET_VIEW() > mpiexec -n 2 read_view02 Lecture processus 1 : 3. 7. 106.1 – Avril 2012 J. 4. 6. 109. 9. Lavallée. 110 Lecture processus 0 : 1.231/326 9 – MPI-IO 9. Dupays. P. Wautelet . 105. D. 104. 103. 108 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 102. 2. Lecas. Chergui. 8. I.-F. 107. 101. 5. D. P. 10.

MPI_MODE_RDONLY ."donnees. dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . D.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.7 – Définition de vues dép_initial 0 type_élém motif_1 (a) motif_1 MPI_INTEGER dép_initial 0 type_élém motif_2 (b) motif_2 MPI_INTEGER dép_initial 2 entiers type_élém motif_3 (c) motif_3 MPI_INTEGER Figure 64 – Motifs employés dans l’exemple 3 d’utilisation de MPI_FILE_SET_VIEW() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 program read_view03 use mpi implicit none integer. Lavallée.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD . Wautelet .1 – Avril 2012 J. dimension(nb_valeurs) :: valeurs integer.motif_2.motif_3.nb_octets_entier integer(kind= MPI_OFFSET_KIND ) :: deplacement_initial integer. D.232/326 9 – MPI-IO 9. Lecas.-F. Girou. Dupays.descripteur.code. & motif_1. P. & descripteur. MPI_INFO_NULL . parameter integer :: nb_valeurs=10 :: rang. Chergui.rang. P.dat". I.

motif_2. MPI_INTEGER . Dupays.statut.code) call MPI_FILE_READ (descripteur.code) call MPI_FILE_READ (descripteur.valeurs. & "native". D. & MPI_ORDER_FORTRAN .deplacement_initial. & "native".valeurs(:) call MPI_FILE_CLOSE (descripteur.(/0/). I. MPI_INTEGER .(/4/).rang.code) deplacement_initial=2*nb_octets_entier call MPI_FILE_SET_VIEW (descripteur.code) deplacement_initial=0 call MPI_FILE_SET_VIEW (descripteur.code) call MPI_TYPE_SIZE ( MPI_INTEGER .deplacement_initial.(/2/). MPI_INFO_NULL . & MPI_ORDER_FORTRAN .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 9.statut.(/3/). MPI_INTEGER .(/4/).code) call MPI_TYPE_CREATE_SUBARRAY (1.code) call MPI_FILE_READ (descripteur.motif_2.":".-F.(/2/).3. MPI_INTEGER .deplacement_initial. P.3.code) print *.code) call MPI_FILE_SET_VIEW (descripteur. MPI_INTEGER . Girou.valeurs(5). Lavallée.7 – Définition de vues call MPI_TYPE_CREATE_SUBARRAY (1.nb_octets_entier.valeurs(8).4. D. & "native".1 – Avril 2012 J.motif_3.motif_1. MPI_INTEGER . MPI_INFO_NULL . & MPI_ORDER_FORTRAN .code) call MPI_TYPE_CREATE_SUBARRAY (1. Wautelet .motif_1. Lecas.code) call MPI_FINALIZE (code) end program read_view03 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui.motif_3. MPI_INTEGER . P. MPI_INFO_NULL . MPI_INTEGER .(/4/).(/2/).(/1/).code) call MPI_TYPE_COMMIT (motif_3.code) call MPI_TYPE_COMMIT (motif_1. "Lecture processus". MPI_INTEGER .statut.code) call MPI_TYPE_COMMIT (motif_2.

104 Lecture processus 0 : 1. 104 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée. 3. 2. Wautelet . P. 7. 4. Lecas.-F. 6. P. 10.234/326 9 – MPI-IO 9. I. 3. 5.7 – Définition de vues Processus 0 1 2 5 6 1 2 5 6 3 4 7 1 2 5 6 3 4 7 6 10104 Fichier 1 2 3 4 5 6 7 8 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 Figure 65 – Exemple 3 d’utilisation de MPI_FILE_SET_VIEW() > mpiexec -n 2 read_view03 Lecture processus 1 : 1. Chergui. 6. 4. 2. 6. Dupays. 6.1 – Avril 2012 J. D. Girou. 7. D. 10. 5.

235/326 9 – MPI-IO 9.8 – Lectures/écritures non bloquantes ☞ Les entrées-sorties non bloquantes sont implémentées suivant le modèle utilisé pour les communications non bloquantes. D. ☞ Un accès non-bloquant doit donner lieu ultérieurement à un test explicite de complétude ou à une mise en attente (via MPI_TEST(). Dupays. etc.). ☞ L’intérêt est de faire un recouvrement entre les calculs et les entrées-sorties. P. Lecas. D. P. MPI_WAIT(). INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.8 – Lectures/écritures non bloquantes 9 – MPI-IO 9. de façon similaire à la gestion des messages non bloquants. Chergui. I. Wautelet .1 – Avril 2012 J.-F. Lavallée. Girou.

code integer(kind= MPI_OFFSET_KIND ) :: position_fichier integer. Dupays.rang. D. I.rang. Lavallée. Girou.8 – Lectures/écritures non bloquantes 9 – MPI-IO 9. dimension( MPI_STATUS_SIZE ) :: statut logical :: termine call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . Wautelet . P.1 – Via des déplacements explicites 1 2 3 4 5 6 7 8 9 10 11 12 13 14 program iread_at use mpi implicit none integer.236/326 9 – MPI-IO 9. Lecas.8 – Lectures/écritures non bloquantes 9. dimension(nb_valeurs) :: valeurs integer. Chergui.8. & descripteur. D.nb_octets_entier. P.1 – Avril 2012 J.nb_iterations=0.-F.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.requete. parameter integer :: nb_valeurs=10 :: i.

Wautelet .nb_iterations."Après"..code) call MPI_FINALIZE (code) end program iread_at INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. lecture processus". Lecas.position_fichier.rang.8 – Lectures/écritures non bloquantes 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 .-F. Chergui. Lavallée.code) position_fichier=rang*nb_valeurs*nb_octets_entier call MPI_FILE_IREAD_AT (descripteur..":". P. Dupays.code) call MPI_TYPE_SIZE ( MPI_INTEGER .nb_octets_entier. & descripteur. P. call MPI_TEST (requete.code) do while (nb_iterations < 5000) nb_iterations=nb_iterations+1 ! Calculs recouvrant le temps demandé par l’opération de lecture . Girou.1 – Avril 2012 J."donnees.requete.code) if (termine) exit end do print *. I.valeurs call MPI_FILE_CLOSE (descripteur.valeurs. MPI_INFO_NULL .termine.nb_valeurs."iterations. D.237/326 9 – MPI-IO 9. & MPI_INTEGER . D.dat". MPI_MODE_RDONLY .statut.

Girou. 106. Dupays. 2. Lecas. lecture processus 1 : 101. 103. 110 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet . 4.8 – Lectures/écritures non bloquantes Processus 0 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 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 d’utilisation de MPI_FILE_IREAD_AT() > mpiexec -n 2 iread_at Après 1 iterations. P. I. D. 109. 8.1 – Avril 2012 J. Chergui. lecture processus 0 : 1. 104. D. 105. 9. 3. 108.-F. Lavallée.238/326 9 – MPI-IO 9. 102. 6. 107. 10 Après 1 iterations. 5. P. 7.

valeurs. MPI_MODE_RDONLY . & descripteur. P.code) call MPI_FINALIZE (code) end program iread INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D.code) call MPI_FILE_IREAD (descripteur.rang.requete.requete. dimension( MPI_STATUS_SIZE ) :: :: :: :: nb_valeurs=10 rang.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .2 – Via des déplacements 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..239/326 9 – MPI-IO 9. dimension(nb_valeurs) integer.statut. P. Wautelet .8 – Lectures/écritures non bloquantes 9 – MPI-IO 9. call MPI_WAIT (requete. MPI_INTEGER . Dupays. Girou.8 – Lectures/écritures non bloquantes 9. "Lecture processus"..8.code) ! Calcul recouvrant le temps demandé par l’opération de lecture . parameter integer integer.1 – Avril 2012 J."donnees.rang. MPI_INFO_NULL . Chergui.code valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . Lecas. I.descripteur.nb_valeurs. Lavallée.":".valeurs(:) call MPI_FILE_CLOSE (descripteur.dat". D.code) print *.-F.

8. 2. Lecas. 5.8 – Lectures/écritures non bloquantes Processus 0 1 2 3 4 5 6 7 8 9 10 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 1 2 3 4 5 6 7 8 9 10 Figure 67 – Exemple 1 d’utilisation de MPI_FILE_IREAD() > mpiexec -n 2 iread Lecture processus 0 : 1. Chergui.-F. 3. Dupays. 10 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 8. I. 7. 9. Girou. 5. Wautelet .1 – Avril 2012 J. 6. D.240/326 9 – MPI-IO 9. Lavallée. 9. 2. 4. P. 4. 6. 10 Lecture processus 1 : 1. P. 3. 7. D.

Chergui.241/326 9 – MPI-IO 9.1 – Avril 2012 J. P. ☞ On ne peut modifier la zone mémoire concernée entre les deux phases de l’opération. via une forme particulière d’opération collective non bloquante. Dupays. D.8 – Lectures/écritures non bloquantes ☞ Il est possible d’effectuer des opérations qui soient à la fois collectives et non bloquantes. P. ☞ Néanmoins. Lecas. l’un pour déclencher l’opération et l’autre pour la terminer. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. il est possible pendant ce temps de faire des opérations non collectives sur le fichier. ☞ Il ne peut y avoir qu’une seule telle opération en cours à la fois par processus. Lavallée. Girou.-F. D. ☞ Celle-ci nécessite un appel à deux sous-programmes distincts. I. Wautelet .

"Lecture processus".242/326 9 – MPI-IO 9. Girou.valeurs. D.4.code) call MPI_FILE_READ_ORDERED_BEGIN (descripteur. P.rang. Chergui.code) call MPI_FINALIZE (code) end program read_ordered_begin_end INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. "Processus numéro :"."donnees. Wautelet .1 – Avril 2012 J. dimension( MPI_STATUS_SIZE ) :: :: :: :: rang. P.rang. Lecas.statut. MPI_INTEGER .rang call MPI_FILE_READ_ORDERED_END (descripteur.code) print *.valeurs. Dupays. Lavallée.8 – Lectures/écritures non bloquantes 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.-F. & descripteur. I. dimension(nb_valeurs) integer.":". MPI_MODE_RDONLY .code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .valeurs(1:4) call MPI_FILE_CLOSE (descripteur.code) print *. MPI_INFO_NULL .dat".descripteur. parameter integer.code nb_valeurs=10 valeurs statut call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .

6. Lavallée. 2.-F. Chergui. D. 4 Processus numéro : 1 Lecture processus 1 : 5.243/326 9 – MPI-IO 9. P. P. D. 8 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.8 – Lectures/écritures non bloquantes Processus 0 1 2 3 4 Fichier 1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 Processus 1 5 6 7 8 Figure 68 – Exemple d’utilisation de MPI_FILE_READ_ORDERED_BEGIN() > mpiexec -n 2 read_ordered_begin_end Processus numéro : 0 Lecture processus 0 : 1. Wautelet . Girou. 3. Dupays. I.1 – Avril 2012 J. Lecas. 7.

➳ l’utilisation des sous-programmes à positionnement explicite dans les fichiers ne sont à employer que dans des cas particuliers.9 – Conseils ☞ Comme on a pu le voir. P.-F. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. ou un ensemble d’entre eux qui peuvent être définis dans un communicateur particulier. Lecas. MPI-IO offre un ensemble très riche de fonctionnalités. le non-bloquant est une voie privilégiée d’optimisation à mettre en œuvre par les programmeurs. tout en restant portable. ➳ exactement comme pour le traitement des messages lorsque ceux-ci représentent une part importante de l’application. Celle-ci. D. en même temps qu’une interface de haut niveau. Lavallée. mais ceci ne doit être implémenté qu’après qu’on se soit assuré du comportement correct de l’application en mode bloquant.9 – Conseils 9 – MPI-IO 9. D. P. permet à la fois de masquer aux utilisateurs des opérations complexes et d’implémenter de façon transparente des optimisations particulières aux machines cibles. il faut généralement privilégier la forme collective des opérations . I. Chergui.1 – Avril 2012 J. l’utilisation implicite de pointeurs individuels ou partagés offrant une interface de plus haut niveau . ☞ Certains choix semblent clairement à conseiller : ➳ lorsque les opérations font intervenir tous les processus. Dupays.244/326 9 – MPI-IO 9. Wautelet .

Lecas. Wautelet . Lavallée. P. Girou.-F.245/326 10 – Conclusion 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D.1 – Avril 2012 J. P. Chergui. Dupays. I. D.

246/326 10 – Conclusion 10 – Conclusion ☞ Utiliser les communications point-à-point bloquantes. Chergui. De même. P. Girou. il est évidemment nécessaire d’avoir de bonnes performances OpenMP à l’intérieur de chaque processus MPI. mais pour que cette approche fonctionne bien. D. Lavallée. ☞ Écrire les communications comme si les envois étaient synchrones (MPI_SSEND()).-F. Un cours est dispensé à l’IDRIS (https://cours.fr/). ☞ Utiliser les fonctions d’entrées-sorties bloquantes. Dupays.idris. ceci avant de passer aux communications non-bloquantes. D. Il faudra alors essayer de faire du recouvrement calcul/communications. ☞ Éviter les barrières de synchronisation (MPI_BARRIER()). I. Lecas. ☞ La programmation mixte MPI/OpenMP peut apporter des gains d’extensibilité. il faudra alors faire du recouvrement calcul/entrées-sorties. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. surtout sur les fonctions collectives qui sont bloquantes. Wautelet .1 – Avril 2012 J. ceci avant de passer aux entrées-sorties non-bloquantes.

. . . .6 MPI-IO . . . . . . . . . . . . . . .MPI . . . . . . . . . . . . . . . . . . . . . . . . . . . .2 Types de données dérivés . . .1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dupays. . . . . . . . . . . . 249 11. . . .4. . . . .5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lecas. . . . . Avril 2012 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE J. . . . . . . .1 Communications collectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 11. . 272 11. . . . .5 Gestion de processus .4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wautelet . . . . . . . . . . . . . . . . . .4. . . . . . . . . . . . . Chergui. . . . . . . . . . . . . . . . . . . . . . . .2 Graphe de processus . D. . . . . . . . . . . 288 11. . . . . . .4 Suppression de processus . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . . . . . . . . . . . . . . . . . . . . . . . .5. . . . . . . . . . . . . . . . . . . . . . . .2 Types dérivés numériques. . . . . . . . . . . . . . . . . . . . . . . . . . 272 11. . . . . . . . . . . . . . . . .5. .3 Mode client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . . . . . . . . . . . . .1 Intra et intercommunicateurs . . . . . . . . . . . . . . . . . . . . . . . . D.2 Mode maître-ouvriers . . . .–. . . . . . . . . . . . . . .4 Communicateurs . . . . . . . . . . . . . P. . 313 . . .247/326 11 – Annexes 1 Introduction 2 Environnement 3 Communications point à point 4 5 6 7 Communications collectives Copies de mémoire à mémoire Types de données dérivés Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 11. . . . . . . . 280 11. . . . . . .264 11. . . . . . . . . . .2. . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . I. . . . . . . . . . . . . . 268 11. . Girou.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . .–. . . . . . . . . . . . 251 11. . . . . . . . .1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 11. . . . 312 11. . . . . . . . . . . . . . . . . . .3 Optimisations . . . . . . . . . . . . . . . . . . . . .5 Compléments . .2. . . . . . . . . . . . . . . . . . . . 288 11. . . . . .-F. . . . . . . . . . . . . . . . . Version . . .1 Distribution d’un tableau sur plusieurs processus . 304 11. . . . . . . . . . . . . 310 11. . . . . . . . . . . . . . . . . .

D. Wautelet . Girou. Dupays. Chergui. P. P.248/326 11 – Annexes 11 – Annexes Il s’agit ici de programmes concernant différentes fonctionnalités de MPI qui sont : ☞ moins fréquentes d’utilisation (création de sa propre opération de réduction. I. D.1 – Avril 2012 J. topologie de type graphe. Lecas. Lavallée.-F. communications persistantes) . INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. type dérivés spécifiques. mode client serveur). ☞ qui ne sont pas disponibles sur l’ensemble des machines (gestion dynamique de processus.

249/326 11 – Annexes 11. on se propose de créer sa propre opération de réduction. MPI_COMPLEX .code.1 – Communications collectives 11 – Annexes 11.rang+i+1)..i=1.1 – Communications collectives Dans cet exemple. produit de vecteurs de nombres complexes. mon_operation integer. D. mon_operation . P.. dimension(n) :: a. P. mon_operation .true.0.’Valeur du produit’. Dupays. I. 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) ! Initialisation du vecteur A sur chaque processus a(:) = (/ (cmplx(rang+i.rang. parameter :: n=4 complex. Wautelet .resultat. Lavallée.code) ! Affichage du résultat if (rang == 0) then print *.resultat end if call MPI_FINALIZE (code) end program ma_reduction INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.i.resultat external mon_produit call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . Chergui.1 – Avril 2012 J. D. Lecas.-F.n.code) ! Collecte sur le processus 0 du produit global call MPI_REDUCE (a. MPI_COMM_WORLD . Girou.n) /) ! Création de l’opération commutative mon_operation call MPI_OP_CREATE (mon_produit.

(-7215.-54765. (-1390.-2010. D. D. (-22000.-F. I. P.longueur vecteur2(i) = cmplx(real(vecteur1(i))*real(vecteur2(i)) ..i do i=1..).).type_donnee.-23420.1 – Avril 2012 J. & real(vecteur1(i))*aimag(vecteur2(i)) + & aimag(vecteur1(i))*real(vecteur2(i))) end do inutilise=0 end function mon_produit > mpiexec -n 5 ma_reduction Valeur du produit (155. Girou. Dupays.1 – Communications collectives 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ! Définition du produit terme à terme de deux vecteurs de nombres complexes integer function mon_produit(vecteur1.vecteur2 integer :: longueur..type_donnee) result(inutilise) implicit none complex.vecteur2.. Lavallée.& aimag(vecteur1(i))*aimag(vecteur2(i)).250/326 11 – Annexes 11.-8195.) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas.dimension(longueur) :: vecteur1. Chergui.longueur. Wautelet .). P.

I. nouveau_type.intent(out) :: nouveau_type.intent(in) :: profil_sous_tab.intent(in) :: ordre. P. D.nb_dims.mode_distribution. Girou.1 – Distribution d’un tableau sur plusieurs processus ☞ Le sous-programme MPI_TYPE_CREATE_DARRAY() permet de générer un tableau sur un ensemble de processus suivant une distribution par blocs ou cyclique.251/326 11 – Annexes 11.2 – Types de données dérivés 11. D.intent(in) :: nb_procs.ordre.mode_distribution integer. Lavallée.-F. P.profil_tab.distribution_procs.1 – Avril 2012 J.nb_dims integer.code call MPI_TYPE_CREATE_DARRAY (nb_procs.2 – Types de données dérivés 11 – Annexes 11.rang.ancien_type integer. integer.ancien_type.rang.2. Dupays. profil_sous_tab. Chergui.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.dimension(nb_dims).dimension(nb_dims).intent(in) :: profil_tab.distribution_procs integer. Lecas. Wautelet .

1 – Avril 2012 J. Lavallée. Girou. Wautelet . D.-F. P.252/326 11 – Annexes 11. P. Chergui. Dupays. I.2 – Types de données dérivés ☞ nb_dims : rang du tableau ☞ nb_procs : nombre total de processus ☞ rang : rang de chaque processus ☞ profil_tab : profil du tableau à distribuer ☞ mode_distribution : mode de distribution dans chaque dimension du tableau. D. Lecas. soit : 1 MPI_DISTRIBUTE_BLOCK indique une distribution par blocs 2 MPI_DISTRIBUTE_CYCLIC indique une distribution cyclique 3 MPI_DISTRIBUTE_NONE indique qu’il n’y a pas de distribution ☞ profil_sous_tab : profil d’un bloc ☞ distribution_procs : nombre de processus dans chaque dimension INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.

via le paramètre MPI_DISTRIBUTE_NONE. ☞ lorsqu’une dimension i est distribuée par blocs. I. Chergui. Dupays. on doit avoir nb_dims nb_procs = i=1 distribution_procs(i) .1 – Avril 2012 J. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. le nombre de processus choisi dans cette dimension doit valoir 1 (distribution_procs(i) = 1) et le profil du bloc dans cette dimension (profil_sous_tab(i)) est ignoré. D.2 – Types de données dérivés Quelques remarques : ☞ l’ordre des processus est le même que pour les topologies . D. Girou. ☞ pour que l’appel au sous-programme soit correct. P. Lecas. via le paramètre MPI_DISTRIBUTE_BLOCK.253/326 11 – Annexes 11. la règle suivante doit être respectée profil_sous_tab(i) * distribution_procs(i) ≥ profil_tab(i) . Wautelet .-F. ☞ lorsqu’une dimension i n’est pas distribuée. P. Lavallée.

6 /).MPI_DISTRIBUTE_BLOCK/) 1 0 1 11 11 11 11 0 00 00 00 00 1 11 11 11 11 0 00 00 00 00 11 00 11 00 1 11 0 00 111 000 11 11 00 00 1 11 0 00 111 000 11 11 00 00 1 11 0 00 111 000 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 – Définition du type dérivé sur chaque processus pour une distribution par blocs INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 /) ☞ profil_tab(:) = (/ 4. distribution_procs(:) = (/ 2. Wautelet . Chergui.254/326 11 – Annexes 11.3 /) ☞ mode_distribution(:)=(/MPI_DISTRIBUTE_BLOCK. Lavallée. P. D. profil_sous_tab(:) = (/ 2. Girou.-F. Dupays. D.2 – Types de données dérivés Distribution par blocs d’un tableau suivant 4 processus ☞ nb_procs = 4. I. P. Lecas.1 – Avril 2012 J.

nb_colonnes=6.nb_lignes*nb_colonnes)/).rang.:)=reshape((/(i*(rang+1).parameter :: nb_lignes=4. Chergui.dimension(nb_lignes.1 – Avril 2012 J. Dupays.i=1.distribution_procs integer. D. P. Lavallée.type_bloc integer.(/nb_lignes. Wautelet .2 – Types de données dérivés 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.nb_colonnes/)) ! Profil du tableau tab profil_tab(:) = shape(tab) ! Mode de distribution mode_distribution(:) = (/ MPI_DISTRIBUTE_BLOCK .etiquette1=1000.255/326 11 – Annexes 11.rang.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .nb_colonnes) :: tab integer. Lecas.nb_procs.etiquette2=1001 integer :: nb_procs.-F.i. & profil_sous_tab. I.dimension(nb_dims) :: profil_tab.code) ! Initialisation du tableau tab sur chaque processus tab(:.code.mode_distribution. & nb_dims=2. Girou.3 /) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. P.dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . MPI_DISTRIBUTE_BLOCK /) ! Profil d’un bloc profil_sous_tab(:) = (/ 2.

2. Dupays.-F.. MPI_COMM_WORLD .. MPI_ORDER_FORTRAN . & MPI_INTEGER . Girou.etiquette1..etiquette2. P. MPI_COMM_WORLD ...code) end select ! Affichage du tableau tab sur chaque processus . & profil_sous_tab..type_bloc...type_bloc.3. MPI_COMM_WORLD . D.statut.. Chergui. Lecas. I.nb_dims...1.1..2 – Types de données dérivés 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...type_bloc.. Wautelet .code) call MPI_TYPE_COMMIT (type_bloc.1 – Avril 2012 J.code) case(3) ! Le processus 3 reçoit son tableau tab du processeur 2 call MPI_RECV (tab. call MPI_TYPE_FREE (type_bloc. distribution_procs.code) case(1) ! Le processus 1 reçoit son tableau tab du processeur 0 call MPI_RECV (tab...256/326 11 – Annexes 11..1.type_bloc...statut.code) call MPI_FINALIZE (code) end program darray_bloc INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4..0..etiquette1....1.2 /) ! Création du type dérivé type_bloc call MPI_TYPE_CREATE_DARRAY (nb_procs..1.code) select case(rang) case(0) ! Le processus 0 envoie son tableau tab au processus 1 call MPI_SEND (tab. MPI_COMM_WORLD .. D...rang..code) case(2) ! Le processus 2 envoie son tableau tab au processus 3 call MPI_SEND (tab...etiquette2... Lavallée..mode_distribution.profil_tab.. P.type_bloc...

32. 10. 15. 48. 6. 12. 51. 6. 27. 45. 12. 40. I. 9. 6. 9. processus 0 21 22 23 24 processus 2 63 66 69 72 Tableau tab obtenu sur le 2. 1. 16. 24. 56. 8. 68. 48. 54. 16.2 – Types de données dérivés > mpiexec -n 4 darray_bloc Tableau tab obtenu sur le 1. 2. 11. 60. 38. 8. D. 5. 32. 40. 14. Wautelet . P.1 – Avril 2012 J. 52. P. 24. 20. 12. 44. 9. 12. 21. 18. Chergui. 12. 39. 3. 4. D. 15. 30. Tableau tab obtenu sur le 3. 6. 30. 18. processus 1 9 10 46 48 processus 3 84 88 33 36 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. Lavallée. 20. 4. 17. 22. 14. 57. 21.-F. 28. 10. 18. 2. 16. 13. 72. Dupays. 24. 7. 24. Tableau tab obtenu sur le 4. 20. Lecas. 36. 36. 5. 42. 33. 19.257/326 11 – Annexes 11. 8.

2 – Types de données dérivés Distribution cyclique d’un tableau suivant 4 processus ☞ nb_procs = 4. D.MPI_DISTRIBUTE_CYCLIC/) 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 111 000 11 00 1 11 11111 0 00 00000 11 00 1 11 11111 0 00 00000 1 0 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 Processus 0 Processus 1 Processus 2 Processus3 11 11 00 00 11 11 11 11 00 00 00 00 11 11 11 11 00 00 00 00 Figure 70 – Définition du type dérivé sur chaque processus pour une distribution cyclique INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2 /) ☞ profil_tab(:) = (/ 4.6 /).258/326 11 – Annexes 11. Lecas.2 /) ☞ mode_distribution(:)=(/MPI_DISTRIBUTE_CYCLIC. profil_sous_tab(:) = (/ 1.1 – Avril 2012 J. distribution_procs(:) = (/ 2. Dupays. Lavallée. I. Girou. P. D. P. Wautelet .-F. Chergui.

2 – Types de données dérivés 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.code) ! Initialisation du tableau tab sur chaque processus tab(:. D. Chergui. & nb_dims=2.nb_lignes*nb_colonnes)/).etiquette2=1001 integer :: nb_procs.:)=reshape((/(i*(rang+1).rang.dimension(nb_lignes.nb_procs.2 /) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays.i=1. D. Lecas.nb_colonnes=6. P.type_cyclique integer. Girou.parameter :: nb_lignes=4. & profil_sous_tab.distribution_procs integer.-F.code) call MPI_COMM_RANK ( MPI_COMM_WORLD .i.1 – Avril 2012 J.(/nb_lignes. Wautelet .mode_distribution. MPI_DISTRIBUTE_CYCLIC /) ! Profil d’un bloc profil_sous_tab(:) = (/ 1.nb_colonnes) :: tab integer.rang. Lavallée.etiquette1=1000.dimension(nb_dims) :: profil_tab.nb_colonnes/)) ! Profil du tableau tab profil_tab(:) = shape(tab) ! Mode de distribution mode_distribution(:) = (/ MPI_DISTRIBUTE_CYCLIC .259/326 11 – Annexes 11.code. P.dimension( MPI_STATUS_SIZE ) :: statut call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . I.

1.. D... P.code) end select ! Affichage du tableau tab sur chaque processus . P. Girou.2.code) case(1) ! Le processus 1 envoie son tableau tab au processus 3 call MPI_SEND (tab..2 /) ! Création du type dérivé type_cyclique call MPI_TYPE_CREATE_DARRAY (nb_procs.. Lecas. MPI_COMM_WORLD .-F. distribution_procs.code) case(2) ! Le processus 2 reçoit son tableau tab du processus 0 call MPI_RECV (tab.2 – Types de données dérivés ! Nombre de processus dans chaque dimension distribution_procs(:) = (/ 2...etiquette2.. Chergui. Lavallée.code) call MPI_TYPE_COMMIT (type_cyclique...rang.code) select case(rang) case(0) ! Le processus 0 envoie son tableau tab au processus 2 call MPI_SEND (tab.statut... I....type_cyclique.. & profil_sous_tab...nb_dims.1...0.. MPI_COMM_WORLD .code) call MPI_FINALIZE (code) end program darray_cyclique INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. & MPI_INTEGER .3.1 – Avril 2012 J..type_cyclique. MPI_COMM_WORLD . Wautelet . MPI_ORDER_FORTRAN .type_cyclique..profil_tab...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 11.. MPI_COMM_WORLD . call MPI_TYPE_FREE (type_cyclique..1.. Dupays.mode_distribution.etiquette1.etiquette2..type_cyclique.code) case(3) ! Le processus 3 reçoit son tableau tab du processus 1 call MPI_RECV (tab..1... D...type_cyclique.statut.....etiquette1.1.

6. 16. 16. 22. 17.261/326 11 – Annexes 11. 12. P. 20. Lavallée. 18. 60. 18. processus 0 21 22 23 24 processus 2 63 21 69 23 Tableau tab obtenu sur le 2. 36. 20. 15. 36.-F. 2. 14. I. 26. 68. 8. 24. Tableau tab obtenu sur le 4. 30. 72. 10. P. 20. processus 1 42 44 46 48 processus 3 84 88 92 96 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 80. Dupays. 39. 27. 51. 28. 48. 5. 3. D. 10. 6. 30. 19. 45. 9. D. Tableau tab obtenu sur le 3. 4. 19. 34. 33. 32. 22. 14. 4. 24. 32. 12. 5. 3. 38. 13.1 – Avril 2012 J. Girou. 17. 57. Wautelet . 11.2 – Types de données dérivés > mpiexec -n 4 darray_cyclique Tableau tab obtenu sur le 1. 18. 8. Lecas. 9. 30. 16. 26. 44. 1. 42. 28. 52. 21. 7. 15. 76. 12. 8. 40. Chergui. 36. 7.

distribution_procs(:) = (/ 2.262/326 11 – Annexes 11.3 /).2 – Types de données dérivés Autres exemples ☞ nb_procs = 4. D. profil_sous_tab(:) = (/ 2. Chergui. Lecas. Wautelet .1 – Avril 2012 J.2 /) ☞ profil_tab(:) = (/ 4.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 Processus 0 Processus 1 Processus 2 Processus3 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 Figure 71 – Définition du type dérivé sur chaque processus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. Girou. D. I. P.-F. Lavallée. P.

I. P. Chergui.-F.5 /). profil_sous_tab(:) = (/ 1. Wautelet .2 – Types de données dérivés ☞ nb_procs = 3.5 /) ☞ mode_distribution(:)=(/MPI_DISTRIBUTE_CYCLIC. Lavallée. D. P.1 – Avril 2012 J. Girou. Lecas. distribution_procs(:) = (/ 3.1 /) ☞ profil_tab(:) = (/ 5. D. Dupays.263/326 11 – Annexes 11.MPI_DISTRIBUTE_NONE/) 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 Processus 0 Processus 1 Processus 2 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 – Définition du 1 0 1 0 1 0 type dérivé sur chaque processus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.

264/326 11 – Annexes 11.2. MPI_TYPE_CREATE_F90_REAL() et MPI_TYPE_CREATE_F90_COMPLEX() ☞ Ces sous-programmes renvoient des types dérivés MPI INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Chergui. P. réel ou complexe ☞ MPI devait donc assurer la portabilité de ces types de données en définissant essentiellement les sous-programmes suivants : MPI_TYPE_CREATE_F90_INTEGER(). Dupays.-F. Wautelet .1 – Avril 2012 J.2 – Types de données dérivés 11. Lecas. I. P.2 – Types dérivés numériques ☞ Le langage Fortran 95 introduit deux fonctions intrinsèques selected_int_kind() et selected_real_kind() qui permettent de définir la précision et/ou l’étendue d’un nombre entier. Girou. Lavallée. D.2 – Types de données dérivés 11 – Annexes 11.

e) admet deux arguments optionnels positifs p et e (toutefois l’un des deux doit obligatoirement être fourni) indiquant respectivement la précision (nombre de chiffres décimaux significatifs) et l’étendue (la plage des nombres représentables en machine) désirées. Wautelet . Girou. P. D.1234568 sur p = 8 chiffres significatifs avec une étendue par défaut. Elle retourne un entier correspondant au sous-type permettant de représenter les réels x tels que 10−e < |x| < 10+e .2 – Types de données dérivés Rappels (extrait du cours Fortran 95 de l’IDRIS) ☞ La fonction intrinsèque selected_int_kind(e) reçoit en argument un nombre entier e positif et retourne une valeur qui correspond au sous-type permettant de représenter les entiers n tels que −10+e < n < 10+e ☞ La fonction intrinsèque selected_real_kind(p. Lecas. Chergui. Lavallée.1 – Avril 2012 J.265/326 11 – Annexes 11. ce nombre aurait la valeur x = 12345. Au mieux. P. (Fin des rappels) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays.123 en machine. (Fin de l’extrait) Exemple : on souhaite représenter le nombre réel 12345.-F. I. D.

Chergui. D. code) call MPI_FINALIZE (code) end program precision INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. preci=12 :: rang. rang. 0. mon_complex. code) if (rang == 0) donnee(:) = cmplx(rang.2 – Types de données dérivés 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. Lavallée. rang. parameter integer ! Le sous-type k représentera integer. n.266/326 11 – Annexes 11. D. mon_complex. MPI_COMM_WORLD . kind=k ) ! Utilisation du type mon_complex call MPI_BCAST (donnee. code une précision d’au moins 12 chiffres significatifs :: k=selected_real_kind(preci) :: donnee call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD . parameter complex( kind=k ). code) ! Construction du type MPI mon_complex associé à la précision demandée call MPI_TYPE_CREATE_F90_COMPLEX (preci.-F. Girou. dimension(n) :: n=101. Dupays. P. MPI_UNDEFINED . Wautelet .1 – Avril 2012 J. P. mon_complex . I. Lecas.

-F. Lavallée.267/326 11 – Annexes 11. Dupays. ils ne peuvent pas être libérés avec MPI_TYPE_FREE() ☞ De plus. les types générés par ces sous-programmes sont prédéfinis par MPI ☞ Par conséquent. D. P. Wautelet . I.1 – Avril 2012 J.2 – Types de données dérivés Remarques ☞ En réalité. D. il n’est pas nécessaire de les valider avec MPI_TYPE_COMMIT() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Girou. P. Chergui. Lecas.

I. l’appel à un sous-programme de communication à chaque itération peut être très pénalisant à la longue d’où l’intérêt des communications persistantes. Dupays. P. Lavallée. Elles consistent à : ➊ créer un schéma persistant de communication une fois pour toutes (à l’extérieur de la boucle) . il arrive parfois que l’on soit contraint de boucler un certain nombre de fois sur un envoi et une réception de message où la valeur des données manipulées change mais pas leurs adresses en mémoire ni leurs nombres ni leurs types. En outre. Chergui. la requête en fin de boucle. D.3 – Optimisations 11 – Annexes 11.-F. si nécessaire. envoi standard envoi synchroneous envoi buffered réception standard INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI_SEND_INIT() MPI_SSEND_INIT() MPI_BSEND_INIT() MPI_RECV_INIT() MPI – Version 4. Girou. Wautelet . Lecas.268/326 11 – Annexes 11.3 – Optimisations Dans un programme. ➋ activer réellement la requête d’envoi ou de réception dans la boucle . ➌ libérer.1 – Avril 2012 J. D. P.

nb.:) end do end if > mpiexec -n 2 AOptimiser Temps : 235 secondes L’utilisation d’un schéma persistant de communication permet de cacher la latence et de réduire les surcoûts induits par chaque appel aux sous-programmes de communication dans la boucle.1 – Avril 2012 J. MPI_REAL .code) c(1:nb. na.269/326 11 – Annexes 11. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. code) call MPI_WAIT (requete0.requete0. P. Chergui. Lavallée.b) end do elseif (rang == 1) then do k = 1.1:nb) = matmul(a(1:nb.etiquette.code) a(:. a. D. MPI_COMM_WORLD . Girou. pivotb.1:na)) + a(:. I. 1000 call sgetrf(na.statut.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. MPI_REAL .0. MPI_COMM_WORLD . pivota.statut. 1000 call MPI_ISSEND (c. Wautelet . Dupays. Lecas. D. code) call MPI_WAIT (requete1. b. na. na. a.etiquette.-F. pivota. nb.m*m. Le gain peut être important lorsque ce mode de communication est réellement implémenté.m*m.code) call sgetrf(nb.1:nb). P.:) = transpose(c(1:na.requete1.code) call sgetrf(na. code) call MPI_IRECV (c. na.1.

270/326 11 – Annexes 11. Wautelet . D.m*m.0. code) call MPI_START (requete1.:) end do end if > mpiexec -n 2 AOptimiser Temps : 235 secondes Ici.1:nb). na. na. b.etiquette.m*m.code) a(:. pivota.-F. Dupays. a.code) c(1:nb.requete1. MPI_COMM_WORLD .1. 1000 call sgetrf(na. code) call MPI_WAIT (requete1.1 – Avril 2012 J. Lecas.etiquette. Chergui.1:na)) + a(:. code) call MPI_WAIT (requete0. MPI_COMM_WORLD . nb. P.1:nb) = matmul(a(1:nb.b) end do elseif (rang == 1) then call MPI_RECV_INIT (c. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. a. pivota. Girou. MPI_REAL .:) = transpose(c(1:na. D. 1000 call MPI_START (requete0. pivotb.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.code) do k = 1. na. l’implémentation MPI et/ou l’infrastructure matérielle de la machine ne permettent malheureusement pas une utilisation efficace du mode persistant. nb. na.statut. Lavallée.code) call sgetrf(na.code) do k = 1. I.statut.requete0.code) call sgetrf(nb. MPI_REAL . P.

3 – Optimisations Remarques : ☞ Une communication activée par MPI_START() sur une requête créée par l’un des sous-programmes MPI_xxxx_INIT() est équivalente à une communication non bloquante MPI_Ixxxx(). Chergui.code). D. P. I. Dupays.1 – Avril 2012 J.271/326 11 – Annexes 11. ☞ Ce sous-programme ne libèrera la requête requete qu’une fois que la communication associée sera réellement terminée. Wautelet .-F. Lecas. ☞ Pour redéfinir un nouveau schéma persistant avec la même requête. P. Girou. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Lavallée. il faut auparavant libérer celle associée à l’ancien schéma en appelant le sous-programme MPI_REQUEST_FREE(requete.

☞ Un intercommunicateur est un communicateur qui permet l’établissement de ce lien de communication. Chergui. ☞ Le sous-programme MPI MPI_INTERCOMM_CREATE() permet de construire des intercommunicateurs. Lecas. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Dupays. Girou. I. D..4 – Communicateurs 11.. Wautelet . D. Lavallée.1 – Avril 2012 J. P.4. ☞ Des processus appartenant à des intracommunicateurs distincts ne peuvent communiquer que s’il existe un lien de communication entre ces intracommunicateurs. ☞ Le couplage des modèles océan/atmosphère illustre bien l’utilité des intra et intercommunicateurs.272/326 11 – Annexes 11.4 – Communicateurs 11 – Annexes 11.1 – Intra et intercommunicateurs ☞ Les communicateurs que nous avons construits jusqu’à présent sont des intracommunicateurs car ils ne permettent pas que des processus appartenant à des communicateurs distincts puissent communiquer entre eux. P.-F.

.-F.1 – Intra et intercommunicateurs Exemple récapitulatif sur les intra et intercommunicateurs MPI_COMM_WORLD IntraComm (ocean) IntraComm (atmosphere) IntraComm (visualisation) a0 0 d1 3 2 g6 InterComm OceanAtmos. D. Wautelet . Girou.4 – Communicateurs 11.4. P.1 – Avril 2012 J. Dupays. f1 5 Figure 73 – Couplage océan/atmosphère INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.273/326 11 – Annexes 11. P. Lecas. b0 1 1 e4 2 h7 c0 2 InterComm VisuAtmos. Lavallée.4 – Communicateurs 11 – Annexes 11. Chergui. D. I....

Lavallée.parameter :: tag1=1111. D. Wautelet .4 – Communicateurs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 program OceanAtmosphere use mpi implicit none integer. D. tag2=2222 integer :: RangMonde.274/326 11 – Annexes 11. NombreIntraComm. CommVisuAtmosphere call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD .couleur.IntraComm.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. code. Chergui.2 call MPI_COMM_SPLIT ( MPI_COMM_WORLD .RangMonde. P. & IntraComm.code) ! Construction des 3 IntraCommunicateurs NombreIntraComm = 3 couleur = mod(RangMonde.1 – Avril 2012 J. CommOceanAtmosphere.NombreIntraComm) ! = 0. Girou.-F. couleur.1. Lecas. P.RangMonde. Dupays.

Lecas.tag2.code) call visualisation(IntraComm.0.1. MPI_COMM_WORLD .CommVisuAtmosphere) end select end program OceanAtmosphere INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.tag1. Lavallée.CommOceanAtmosphere.275/326 11 – Annexes 11.0. Dupays.0.1 – Avril 2012 J. Girou.0.1.CommOceanAtmosphere. MPI_COMM_WORLD .CommVisuAtmosphere. D.CommOceanAtmosphere. MPI_COMM_WORLD . P. & code) call ocean(IntraComm. P. Wautelet . I.-F.tag2. MPI_COMM_WORLD . Chergui.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.tag1.code) call atmosphere(IntraComm.CommVisuAtmosphere) case(2) ! InterCommunicateur CommVisuAtmosphere pour que le groupe 2 communique ! avec le groupe 1 call MPI_INTERCOMM_CREATE (IntraComm. & code) ! InterCommunicateur CommVisuAtmosphere pour que le groupe 1 communique ! avec le groupe 2 call MPI_INTERCOMM_CREATE (IntraComm.0.CommVisuAtmosphere.CommOceanAtmosphere) case(1) ! InterCommunicateur OceanAtmosphere pour que le groupe 1 communique ! avec le groupe 0 call MPI_INTERCOMM_CREATE (IntraComm.2. D.

3. Chergui.parameter real.code. I. & CommOceanAtmosphere.code) ! Le modèle océanographique tient compte des valeurs atmosphériques a(:) = b(:) * c(:) end subroutine ocean INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J.CommOceanAtmosphere) use mpi implicit none integer.IntraComm.code) ! Échange de messages avec les processus associés au modèle atmosphérique call MPI_SENDRECV_REPLACE (c. Lavallée. Lecas.IntraComm.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.rang.dimension(n) integer integer.c.rang.-F. D.n.tag1. Wautelet .4 – Communicateurs subroutine ocean(IntraComm. MPI_SUM .germe(1).dimension( MPI_STATUS_SIZE ) integer.rang.n.c rang. P. D.CommOceanAtmosphere statut irtc ! Les processus 0.code) ! Rang du processus dans IntraComm call MPI_COMM_RANK (IntraComm.b. MPI_REAL .intrinsic :: :: :: :: :: n=1024. Dupays.statut. P.tag1. 6 dédiés au modèle océanographique 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 impliqués dans le modèle océan effectuent une opération collective call MPI_ALLREDUCE (a. Girou. MPI_REAL .tag1=3333 a.

IntraComm. P. & CommOceanAtmosphere.CommVisuAtmosphere) use mpi implicit none integer.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. D. Dupays.277/326 11 – Annexes 11. P.dimension( MPI_STATUS_SIZE ) :: statut integer.b.dimension(n) integer :: n=1024. Lecas.CommOceanAtmosphere. Wautelet . 4.-F.c :: rang.CommVisuAtmosphere integer.intrinsic :: irtc ! Les processus 1. Chergui.parameter real.code. Girou.germe(1).tag2=4444 :: a. D. 7 dédiés au modèle atmosphérique 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(:) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.1 – Avril 2012 J. I.tag1=3333. Lavallée.

1 – Avril 2012 J. & CommOceanAtmosphere.tag2. Lecas.code) ! Rang du processus dans IntraComm call MPI_COMM_RANK (IntraComm.rang.rang.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 dédiés au modèle atmosphère effectuent une opération collective call MPI_ALLREDUCE (a.code) ! Échange de messages avec les processus dédiés au modèle océanographique call MPI_SENDRECV_REPLACE (c.c. Girou. D. Wautelet .code) end if end subroutine atmosphere INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.statut. Dupays.tag1. MPI_REAL .CommVisuAtmosphere.n.rang.tag1. P.or.n. MPI_REAL . Chergui. MPI_REAL . D. MPI_MAX .n. Lavallée. P.rang. rang == 1) then call MPI_SSEND (a.code) ! Le modèle atmosphère tient compte des valeurs océanographiques a(:) = b(:) * c(:) ! Envoi des résultats aux processus dédiés à la visualisation if (rang == 0 .IntraComm.-F. I.

IntraComm.-F.parameter real.rang. Girou.a(:) end subroutine visualisation INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I. Dupays.n.code) print*.1 – Avril 2012 J.statut.dimension( MPI_STATUS_SIZE ) :: :: :: :: n=1024. Chergui.rang.CommVisuAtmosphere.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. MPI_REAL .’Moi.tag2. processus ’.c rang. Lecas.rang.CommVisuAtmosphere statut ! Les processus 2 et 5 sont chargés de la visualisation call MPI_COMM_RANK (IntraComm. Wautelet .279/326 11 – Annexes 11. D.dimension(n) integer integer. D. P.’ je trace mon champ A : ’.b.tag2=4444 a.code) ! Réception des valeurs du champ à tracer call MPI_RECV (a. Lavallée.code. P.

Chergui.intent(in) intent(in) :: :: :: :: comm_ancien. intent(out) :: comm_nouveau. D.280/326 11 – Annexes 11.4 – Communicateurs 11 – Annexes 11.poids reorganisation integer.reorganisation.intent(in) dimension(nb_voisins_max).2 – Graphe de processus Il arrive cependant que dans certaines applications (géométries complexes). D. Lecas. P. Lavallée.degres liste_voisins.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Le sous-programme MPI_DIST_GRAPH_CREATE() permet alors de définir une topologie de type graphe. 1 2 3 4 5 6 7 8 9 integer.n.liste_voisins.-F. comm_nouveau.& info.4.sources. P. logical. intent(in) dimension(:). Wautelet . Dupays.1 – Avril 2012 J.info source. I.n. la décomposition de domaine ne soit plus une grille régulière mais un graphe dans lequel un sous-domaine peut avoir un ou plusieurs voisins quelconques. integer.degres. Girou. integer.poids. code call MPI_DIST_GRAPH_CREATE (comm_ancien.4 – Communicateurs 11.

1 – Avril 2012 J.3 1. 1.4 1. P.2. 3 0 1 5 2 4 Numéro de processus 0 1 2 3 4 5 liste_voisins 1 0. 3.3. I.-F. Dupays.5.5. Girou. P. 0.3.4 3. Lavallée. 1.4 Figure 74 – Graphe de processus poids (:) = 1.2.2. D. Wautelet .2.4.4.4 /) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.2.2. Chergui.281/326 11 – Annexes 11. 1.4 – Communicateurs Les tableaux d’entiers poids et liste_voisins permettent de définir le poids attribué et la liste des voisins ceci pour chacun des nœuds. D.3.liste_voisins = (/ 1.5.5 1. Lecas.

integer. Lavallée. integer. D.1 – Avril 2012 J. P.282/326 11 – Annexes 11. integer. Wautelet . P. Girou. D. integer.-F. Dupays.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. intent(out) :: intent(out) :: comm_nouveau rang nb_voisins voisins code call MPI_GRAPH_NEIGHBORS (comm_nouveau. Chergui.nb_voisins.rang. integer. integer. integer. Lecas.code) ☞ la liste des voisins pour un processus donné : integer. intent(in) :: intent(in) :: intent(in) :: dimension(nb_voisins_max).nb_voisins. I. intent(in) intent(in) intent(out) intent(out) :: :: :: :: comm_nouveau rang nb_voisins code call MPI_GRAPH_NEIGHBORS_COUNT (comm_nouveau.voisins.rang.4 – Communicateurs Deux autres fonctions sont utiles pour connaître : ☞ le nombre de voisins pour un processus donné : integer.

iteration=0 etiquette=100 liste_voisins. Lecas.dimension(:) :: dimension( MPI_STATUS_SIZE ):: :: call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD .sources.code) allocate(sources(0:nb_processus-1).code. P.nb_processus.nb_processus. Girou. & ! Propagation du feu ! depuis les voisins feu=0. real :: rang.degres(0:nb_processus-1)) if (rang_monde==0) then n=nb_processus else n=0 end if INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.poids voisins. & ! Valeur du feu bois=1. Dupays.comm_graphe. integer.rang_monde.rang_monde. Lavallée.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.-F.code) call MPI_COMM_RANK ( MPI_COMM_WORLD ..1 – Avril 2012 J.283/326 11 – Annexes 11.i. P.01 parameter :: dimension(16) :: allocatable. & ! Rien n’a encore brûlé arret=1.degres statut propagation. Wautelet . ! Tout a brûlé si arret <= 0. I. integer. nb_voisins. integer. D.. Chergui. D.& n.

I.5.3. D.4.degres. Dupays.poids.3.code) allocate(voisins(nb_voisins)) ! Allocation du tableau voisins call MPI_GRAPH_NEIGHBORS (comm_graphe. Wautelet .3. Chergui.1.false.rang.2.4 /) poids(:) = 1 call MPI_DIST_GRAPH_CREATE ( MPI_COMM_WORLD . P.2 /) liste_voisins(:)= (/ 1.comm_graphe. D.0.4.2. P.1.1 – Avril 2012 J.n.2. & MPI_INFO_NULL .rang.3.nb_voisins.rang.code) INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.3.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.sources.1.liste_voisins. Lecas.-F.nb_voisins.4. ! Le feu se déclare arbitrairement sur la parcelle 2 call MPI_GRAPH_NEIGHBORS_COUNT (comm_graphe..284/326 11 – Annexes 11. Girou.5..code) if (rang == 2) feu=1. Lavallée.nb_processus-1 sources(i)=i end do degres(:)= (/ 1.code) call MPI_COMM_RANK (comm_graphe.voisins.3.

code) iteration=iteration+1 print ’("Itération ". & comm_graphe.etiquette. Chergui. P.iteration.f5. Dupays.code) if (rang == 0) print ’("--")’ end do deallocate(voisins) call MPI_FINALIZE (code) end program graphe INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. I.1. MPI_REAL .2*feu + 0.code) ! Le feu se développe en local sous l’influence des voisins feu=1. P. D.3)’. Lecas.comm_graphe.-F.i2..1 – Avril 2012 J.statut.i2." bois=".2*propagation*bois bois=bois/(1.rang. 1. & propagation.feu/)). MPI_REAL .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 while (arret > 0. MPI_SUM .bois call MPI_BARRIER (comm_graphe.nb_voisins ! On propage le feu aux voisins call MPI_SENDRECV (minval((/1.285/326 11 – Annexes 11. Girou.01) ! On arrête dès qu’il n’y a plus rien à brûler do i=1.voisins(i).etiquette. Lavallée.1." parcelle ". Wautelet . D.+feu) ! On calcule ce qui reste de bois sur la parcelle end do call MPI_ALLREDUCE (bois. MPI_REAL .arret.voisins(i).

.589 Iteration 1 parcelle 1 bois=0.........672 Iteration 1 parcelle 2 bois=0..4 – Communicateurs > mpiexec -n 6 graphe Iteration 1 parcelle 0 bois=1.. Lecas.286/326 11 – Annexes 11. P. D.000 Iteration 10 parcelle 4 bois=0.... I..000 Iteration 10 parcelle 2 bois=0. Chergui...000 Iteration 10 parcelle 3 bois=0..000 Iteration 10 parcelle 5 bois=0.. Iteration 10 parcelle 0 bois=0. Girou.068 -...602 Iteration 1 parcelle 5 bois=0... Lavallée. Wautelet . Dupays.1 – Avril 2012 J......953 Iteration 1 parcelle 4 bois=0.000 Iteration 1 parcelle 3 bois=0...008 Iteration 10 parcelle 1 bois=0...-F.. D. P.000 -- INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4..

Lavallée. Dupays.4 – Communicateurs 2 1 3 4 1 2 3 4 1 2 3 4 0 0 0 5 5 5 (a) Itération 0 (b) Itération 1 (c) Itération 2 2 1 3 4 1 2 3 4 1 2 3 4 0 0 0 5 5 5 (d) Itération 3 (e) Itération 4 (f) Itération 10 Figure 75 – Définition d’une topologie quelconque via un graphe — Exemple de la propagation d’un feu de forêt INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Girou. Lecas. D.-F. D.1 – Avril 2012 J.287/326 11 – Annexes 11. P. Wautelet . I. Chergui.

5 – Gestion de processus 11. Girou. Lecas.1 – Avril 2012 J.5. Dupays. D.288/326 11 – Annexes 11. P. I. Lavallée.-F.5 – Gestion de processus 11 – Annexes 11. Wautelet .1 – Introduction ☞ La gestion dynamique des processus a été l’un des apports majeurs de MPI-2 ☞ C’est la possibilité de créer (et dans certaines conditions de supprimer) des processus durant l’exécution de l’application ☞ Le démarrage d’une application reste dépendant de l’environnement d’exécution qui sera défini par le constructeur INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. P. Chergui. D.

D.5 – Gestion de processus L’activation d’un ou plusieurs processus peut se faire selon deux modes bien distincts : ➊ Le mode maître-ouvriers : l’un au moins des processus d’une application active un ou plusieurs autres processus. Lecas. D.1 – Avril 2012 J. P. I. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. ➋ Le mode client-serveur : un ou plusieurs processus d’une application serveur (lancée au préalable) sont en attente de connexion d’un ou plusieurs processus d’une application cliente (lancée plus tard). un lien de communication est établi entre les processus des deux applications. Chergui. Wautelet . Dupays. Girou. P. Une fois la connexion effectuée. Lavallée.289/326 11 – Annexes 11. Les processus ouvriers ainsi activés dynamiquement exécutent un code soit identique (modèle SPMD) soit différent (modèle MPMD) du processus maître qui les a généré.-F.

5 – Gestion de processus 11. celui qui active réellement les processus ouvriers. Il est bloquant pour tous les processus appartenant au communicateur incluant le processus « maître ».1 – Avril 2012 J. Nous aurons également besoin du sous-programme MPI_INTERCOMM_MERGE() qui permet de fusionner dans un même intracommunicateur deux communicateurs liés par un intercommunicateur donné. I.290/326 11 – Annexes 11. P. P. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Lavallée. Girou. Dupays. Chergui. Wautelet .2 – Mode maître-ouvriers Activation d’un programme unique Dans l’exemple que nous allons décrire. avec le sous-programme MPI_COMM_SPAWN(). D.-F. Lecas.5 – Gestion de processus 11 – Annexes 11. plusieurs copies d’un programme parallèle unique « ouvriers ». nous suivons le modèle MPMD où un programme parallèle « maître » active.5. Ce sous-programme est collectif.

P. P.5 – Gestion de processus > mpiexec -n 3 -max_np 7 maitre 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(. Dupays. Chergui... D.1 – Avril 2012 J.) g6 Figure 76 – Utilisation de MPI_COMM_SPAWN() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet .291/326 11 – Annexes 11..) intra_comm b1 c2 e4 d 3 f CALL MPI_INTERCOMM_MERGE(.-F. Girou. I. Lecas. D.. Lavallée.

rang. P. MPI_INFO_NULL . Lavallée.nb_procs. Dans intra_comm. Girou. intra_comm de taille ".1 – Avril 2012 J. mon MPI_COMM_WORLD de taille ".intra_comm.code integer :: inter_comm. drapeau.5 – Gestion de processus 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 . D. les rangs ! des processus seront ordonnés selon la valeur de l’argument drapeau call MPI_INTERCOMM_MERGE (inter_comm.false.nb_procs_ouvriers=4. code) call MPI_COMM_RANK (intra_comm. ". call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . code) print *. intra_comm . MPI_ARGV_NULL . Lecas.nb_procs. code) call MPI_COMM_SIZE (intra_comm.rang_maitre=1 logical :: drapeau=. D. Chergui. I. nb_procs_ouvriers. Wautelet . MPI_COMM_WORLD . P. & rang_maitre. nb_procs_maitres .code) ! Fusion des communicateurs associés à inter_comm. inter_comm ."maitre de rang ". MPI_ERRCODES_IGNORE . rang .292/326 11 – Annexes 11. & ". Dupays. nb_procs_maitres call MPI_FINALIZE (code) end program maitre INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. rang. code) ! Activation des processus ouvriers call MPI_COMM_SPAWN ("ouvriers".-F.

nb_procs .293/326 11 – Annexes 11. Lavallée. & ". P. code) call MPI_COMM_RANK (intra_comm. D. intra_comm . nb_procs_ouvriers . nb_procs_ouvriers call MPI_FINALIZE (code) end program ouvriers INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. code) print *. Lecas. P."ouvrier de rang ". call MPI_INIT (code) call MPI_COMM_SIZE ( MPI_COMM_WORLD . ".-F. rang. code) if (inter_comm == MPI_COMM_NULL ) then print *.1 – Avril 2012 J.5 – Gestion de processus 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. les rangs ! des processus seront ordonnés selon la valeur de l’argument drapeau call MPI_INTERCOMM_MERGE (inter_comm. D. drapeau. intra_comm logical :: drapeau=. code) ! Ai-je un processus maître ? call MPI_COMM_GET_PARENT ( inter_comm . nb_procs. rang.’Pas de processus maître’ call MPI_FINALIZE (code) stop end if ! Fusion des communicateurs associés à inter_comm. I. intra_comm de taille ". Dupays. rang .true. mon MPI_COMM_WORLD de taille : ". Girou. code) call MPI_COMM_SIZE (intra_comm.nb_procs. Dans intra_comm. code integer :: inter_comm. Wautelet .

Girou. Chergui. intra_comm ouvrier de rang 5 . Wautelet . mon mon mon mon mon mon mon MPI_COMM_WORLD MPI_COMM_WORLD MPI_COMM_WORLD MPI_COMM_WORLD MPI_COMM_WORLD MPI_COMM_WORLD MPI_COMM_WORLD de de de de de de de taille taille taille taille taille taille taille 3 3 4 4 4 3 4 Noter que. . I. . P. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.294/326 11 – Annexes 11. D. P. intra_comm ouvrier de rang 3 . Dupays. . . D. . intra_comm ouvrier de rang 6 . . intra_comm maitre de rang 1 . intra_comm maitre de rang 2 . intra_comm de de de de de de de taille taille taille taille taille taille taille 7 7 7 7 7 7 7 . Lecas. dans ce cas.-F.5 – Gestion de processus > mpiexec -n 3 -max_np 7 maitre maitre de rang 0 . intra_comm ouvrier de rang 4 . la fusion des communicateurs ne modifie pas le rang des processus associés au programme maître.1 – Avril 2012 J. Lavallée.

. Dupays. MPI_COMM_SELF . Ce processus est celui qui active les processus ouvriers.. nb_procs_ouvriers. . Chergui. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Wautelet . À l’appel de MPI_COMM_SPAWN(). P. Lavallée. D.. MPI_ERRCODES_IGNORE . D. MPI_COMM_SELF n’incluera donc que le processus maître. I.5 – Gestion de processus Signification de MPI_COMM_SELF MPI_COMM_SELF est un communicateur prédéfini par MPI. Lecas. MPI_ARGV_NULL . ! Activation des processus ouvriers rang_maitre=1 nb_procs_ouvriers=4 call MPI_COMM_SPAWN ("ouvriers".295/326 11 – Annexes 11. P.-F. MPI_INFO_NULL . Girou. & rang_maitre.1 – Avril 2012 J. inter_comm .code) .. ce communicateur inclut un et un seul processus.

.296/326 11 – Annexes 11.-F. Chergui.) intra_comm b0 e2 d1 f 3 g4 CALL MPI_INTERCOMM_MERGE(.. Lavallée.5 – Gestion de processus > mpiexec -n 3 -max_np 7 maitre MPI_COMM_WORLD (maitre) a0 c2 b1 inter_comm MPI_COMM_WORLD (ouvriers) CALL MPI_INIT(code) MPI_COMM_WORLD (maitre) a 0 b1 0 c2 e1 d0 MPI_COMM_SELF f2 g 3 CALL MPI_COMM_SPAWN(. Dupays. P...1 – Avril 2012 J. P. Wautelet . I. Girou. D.) Figure 77 – Signification de MPI_COMM_SELF INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. Lecas.

MPI_INFO_SET() et MPI_INFO_FREE() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Chergui. P. I. Dupays. notamment dans les entrées/sorties parallèles avec MPI-IO que l’on verra dans le chapitre 9 ☞ S’il est spécifié à l’appel du sous-programme MPI_COMM_SPAWN() (ou bien MPI_COMM_SPAWN_MULTIPLE() que l’on introduira par la suite). ☞ Le mode de recherche par défaut voudra dire généralement que les programmes « ouvriers » se trouvent sur la machine locale et dans le même répertoire que le programme « maître » ☞ Pour modifier ces valeurs par défaut.-F. il indique le mode de recherche par défaut des programmes « ouvriers ». P. D.297/326 11 – Annexes 11.5 – Gestion de processus Signification de MPI_INFO_NULL ☞ Ce paramètre est aussi utilisé dans d’autres contextes. Les constructeurs peuvent toutefois définir d’autres valeurs plus spécifiques à leur environnement. Lavallée. D. Lecas.1 – Avril 2012 J. Girou. il faut utiliser les sous-programmes MPI_INFO_CREATE(). Wautelet .

MPI_ARGV_NULL . Dupays. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée. I. D. "/workdir/idris/rech/rgrp001". info_spawn .idris.. Wautelet . "host". D.5 – Gestion de processus integer :: rang_maitre=1. Lecas. "aleph. code) call MPI_INFO_SET ( info_spawn . nb_procs_ouvriers=4. "wdir". nb_procs_ouvriers. & rang_maitre..298/326 11 – Annexes 11. ! Redéfinition du mode de recherche des programmes ouvriers call MPI_INFO_CREATE ( info_spawn . inter_comm.. code) .fr".. info_spawn . code) ! Activation des processus ouvriers call MPI_COMM_SPAWN ("ouvriers".-F. MPI_COMM_SELF . Girou. P.1 – Avril 2012 J. Chergui. code) call MPI_INFO_SET ( info_spawn . P. MPI_ERRCODES_IGNORE .code) ! Libération du paramètre info_spawn call MPI_INFO_FREE ( info_spawn .

Lecas. nb_procs_total . MPI_ARGV_NULL .299/326 11 – Annexes 11. inter_comm . MPI_INFO_NULL . Girou. Lavallée. I.code) if (logique) then ! Ici nb_procs_ouvriers vaudra 7-3=4 nb_procs_ouvriers = nb_procs_total . & rang_maitre. Chergui. P. D. P. MPI_COMM_WORLD ."MPI_UNIVERSE_SIZE n’’est pas supporté" nb_procs_ouvriers = 4 end if ! Activation des processus ouvriers rang_maitre=1 call MPI_COMM_SPAWN ("ouvriers". INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_UNIVERSE_SIZE .. logique .nb_procs_maitres else print *. il est associé au nombre total de processus qu’un utilisateur peut activer.5 – Gestion de processus Signification de MPI_UNIVERSE_SIZE MPI_UNIVERSE_SIZE est une clef MPI dont on peut connaître la valeur grâce au sous-programme MPI_COMM_GET_ATTR().1 – Avril 2012 J. Dupays. MPI_ERRCODES_IGNORE . Wautelet .-F.. Si la version de MPI utilisée l’implémente.. ! Nombre de processus maximum que l’on peut activer call MPI_COMM_GET_ATTR ( MPI_COMM_WORLD .. . nb_procs_ouvriers. D.code) .

Lecas. Lavallée. Chergui. celui qui active réellement l’ensemble des processus ouvriers. . Dupays. « ouvriers4 ». INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.. D. I.1 – Avril 2012 J. P. P.-F. D. Girou.. nous suivons le modèle MPMD où un programme parallèle « maître » active avec le sous-programme MPI_COMM_SPAWN_MULTIPLE() plusieurs copies de 4 programmes parallèles différents « ouvriers1 ». il est conseillé de ne pas appeler le sous-programme MPI_COMM_SPAWN() autant de fois qu’il y a de programmes ouvriers mais plutôt d’appeler le sous-programme MPI_COMM_SPAWN_MULTIPLE() une seule fois pour activer l’ensemble des programmes ouvriers. Il est bloquant pour tous les processus appartenant au communicateur incluant le processus « maître ». Wautelet .. Dans ce cas.5 – Gestion de processus Activation de programmes multiples Dans ce second exemple. pour des raisons de performance.300/326 11 – Annexes 11. Ce sous-programme est collectif.

drapeau. dimension(nb_prog_ouvriers) :: ouvriers integer. les rangs ! des processus seront ordonnés selon la valeur de l’argument drapeau call MPI_INTERCOMM_MERGE (inter_comm. P. Girou.-F. dimension(8) :: codes_erreurs ! 8=3+2+1+2 call MPI_INIT (code) ouvriers(:) = (/"ouvriers1". Chergui. D. "ouvriers2". MPI_ARGVS_NULL .2. P. Lecas. ! On souhaite activer 4 programmes ouvriers integer. dimension(nb_prog_ouvriers) :: nb_procs_ouvriers=(/3. I.false. rang_maitre=1.1 – Avril 2012 J. Wautelet . "ouvriers3". intra_comm . & nb_procs_ouvriers.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 11.rang_maitre.2/). "ouvriers4"/) infos(:) = MPI_INFO_NULL codes_erreurs(:) = MPI_ERRCODES_IGNORE ! Activation de plusieurs programmes ouvriers call MPI_COMM_SPAWN_MULTIPLE (nb_prog_ouvriers.code logical :: drapeau=.codes_erreurs. call MPI_FINALIZE (code) end program maitre INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.5 – Gestion de processus program maitre use mpi implicit none integer :: inter_comm.infos ! Un code d’erreur par programme et par processus activé integer. code) ! Inclure ici le code correspondant aux calculs à faire par les processus maîtres . Dupays.. MPI_COMM_WORLD . parameter :: nb_prog_ouvriers=4 character(len=12). Dans intra_comm.infos.ouvriers.intra_comm. Lavallée.code) ! Fusion des communicateurs associés à inter_comm.1.. & inter_comm . D.

D.302/326 11 – Annexes 11. I. D. Wautelet .) Figure 78 – Utilisation de MPI_COMM_SPAWN_MULTIPLE() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.. Dupays. Girou. Chergui.. Lavallée. Lecas. P.1 – Avril 2012 J.-F. P.5 – Gestion de processus > mpiexec -n 3 -max_np 11 maitre 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 a 0 g3 h4 b1 c 2 i5 j 6 k7 CALL MPI_COMM_SPAWN_MULTIPLE() ouvriers3 inter_comm intra_comm ouvriers4 a0 b 1 c2 e4 f5 d 3 g6 h7 i8 j 9 k10 CALL MPI_INTERCOMM_MERGE(.

303/326 11 – Annexes 11. les variables MPI_INFO_NULL.1 – Avril 2012 J. P.5 – Gestion de processus Remarques ☞ MPI_COMM_SPAWN() et MPI_COMM_SPAWN_MULTIPLE() sont des sous-programmes collectifs qui doivent être appelés par l’ensemble des processus du communicateur incluant le processus maître ☞ Attention à l’ordre des processus dans le nouvel intracommunicateur issu de la fusion des deux communicateurs associés à l’intercommunicateur renvoyé par MPI_COMM_SPAWN() ou MPI_COMM_SPAWN_MULTIPLE() ☞ Contrairement à ce que l’on aurait obtenu si MPI_COMM_SPAWN() avait été utilisé pour activer plusieurs programmes. P. Girou. Dupays. certains arguments sont toutefois transformés en tableaux du fait de la multiplicité des programmes ouvriers à activer ☞ Avec MPI_COMM_SPAWN_MULTIPLE(). Wautelet . Chergui. MPI_COMM_SELF et MPI_UNIVERSE_SIZE conservent les mêmes caractéristiques que celles que l’on a vues avec MPI_COMM_SPAWN() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.-F. Lavallée. D. Lecas. I. MPI_COMM_SPAWN_MULTIPLE() inclut tous les processus de tous les programmes ouvriers dans le même communicateur MPI_COMM_WORLD ☞ Tous les arguments de MPI_COMM_SPAWN_MULTIPLE() ont la même signification que ceux de MPI_COMM_SPAWN() ☞ Dans MPI_COMM_SPAWN_MULTIPLE(). D.

systèmes d’exploitation. à un moment de leur vie. etc. ☞ lorsqu’une application parallèle serveur accepte des connexions de plusieurs applications parallèles clientes .3 – Mode client-serveur Deux programmes indépendants peuvent établir entre eux un lien de communication alors que leurs processus ne partagent aucun communicateur. échanger des informations .5. P.5 – Gestion de processus 11.1 – Avril 2012 J. Girou.) dans lequel s’exécute l’application serveur peut être différent de celui des applications clientes.-F.304/326 11 – Annexes 11. Dupays. ☞ lorsqu’un outil de visualisation veut s’attacher à un processus en cours d’exécution pour extraire certaines informations. Cette situation peut se produire : ☞ lorsque deux parties d’une application démarrent indépendamment l’une de l’autre et veulent. D. I. L’environnement (machines. Wautelet . Chergui.5 – Gestion de processus 11 – Annexes 11. Lavallée. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lecas. P. D.

Wautelet .5 – Gestion de processus Machine A MPI_COMM_WORLD (serveur) Machine B MPI_COMM_WORLD (client) à l’instant t Machine A MPI_COMM_WORLD (serveur) Machine B MPI_COMM_WORLD (client) à l’instant t + ∆t lien de communication (intercommunicateur) Figure 79 – Schéma d’application client-serveur INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. Lavallée.1 – Avril 2012 J. P. Chergui. Lecas. I.-F. D. P. Dupays. Girou.305/326 11 – Annexes 11. D.

le processus serveur passe par trois étapes : ➊ ouverture d’un port de communication : MPI_OPEN_PORT() . ➋ retrait du nom de connexion : MPI_UNPUBLISH_NAME() . Lecas. de même : ➊ fermeture de la connexion avec le processus client : MPI_COMM_DISCONNECT() . Girou. I. Dupays. D.-F. P.5 – Gestion de processus Processus serveur Pour accepter un lien de communication avec le processus client. Chergui.1 – Avril 2012 J. D. ➌ fermeture du port de communication : MPI_CLOSE_PORT(). ➋ publication d’un nom arbitraire de connexion : MPI_PUBLISH_NAME() .306/326 11 – Annexes 11. ➌ acceptation de la connexion : MPI_COMM_ACCEPT() Pour fermer ce lien de communication. Lavallée. P. Wautelet . INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.

P. Lecas. Wautelet ... D. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. MPI_INFO_NULL . code) ! Inclure ici le code du serveur . & inter_comm. if ( rang == rang_serveur ) then call MPI_OPEN_PORT ( MPI_INFO_NULL . code) call MPI_CLOSE_PORT (nom_de_port.. code) end if . MPI_COMM_WORLD . Chergui.. I.307/326 11 – Annexes 11. Dupays. integer :: rang_serveur=2.5 – Gestion de processus Le processus serveur exécutera la séquence de code suivante : . D. code character(len= MPI_MAX_PORT_NAME ) :: nom_de_port . P. code) if ( rang == rang_serveur ) then call MPI_UNPUBLISH_NAME ("nom_de_connexion".1 – Avril 2012 J. Lavallée.. nom_de_port . code) end if call MPI_COMM_ACCEPT (nom_de_port.-F... nom_de_port.code) call MPI_PUBLISH_NAME ("nom_de_connexion". call MPI_COMM_DISCONNECT (inter_comm.. inter_comm. MPI_INFO_NULL . rang_serveur. nom_de_port. Girou. MPI_INFO_NULL .

integer :: rang_client=1. P. Lavallée. pour interrompre la connexion avec le serveur.. code) ! Inclure ici le code du client . inter_comm. I. le client devra obligatoirement appeler le sous-programme MPI_COMM_DISCONNECT(). . call MPI_COMM_DISCONNECT (inter_comm. ce qui se réalise en deux étapes : ➊ recherche du port de communication associé au nom publié par le serveur : MPI_LOOKUP_NAME() . P. MPI_COMM_WORLD .. code) call MPI_COMM_CONNECT (nom_de_port. Wautelet . nom_de_port .5 – Gestion de processus Processus client Le client doit tout d’abord se connecter au port de communication du serveur. Chergui. code character(len= MPI_MAX_PORT_NAME ) :: nom_de_port . MPI_INFO_NULL . MPI_INFO_NULL . & inter_comm.308/326 11 – Annexes 11. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. rang_client.1 – Avril 2012 J. Dupays.-F.. if ( rang == rang_client ) & call MPI_LOOKUP_NAME ("nom_de_connexion". D. Lecas... Girou.. ➋ connexion avec le serveur : MPI_COMM_CONNECT().. code) .. D. Ensuite.

1 – Avril 2012 J. I. bien qu’un seul processus participe à la connexion de part et d’autre ☞ MPI_CLOSE_PORT() libère 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 qu’éventuellement un autre lien puisse s’établir sur le même 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(). P.-F. le nom du port de communication renvoyé par le processus serveur INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.309/326 11 – Annexes 11. on aurait été amené à préciser explicitement au processus client par un moyen quelconque (sur l’entrée standard ou par l’intermédiaire d’un fichier). Lecas. D. MPI_COMM_ACCEPT() et MPI_COMM_DISCONNECT() sont des sous-programmes collectifs (donc bloquants). Dupays. P. Dans ce cas. la connexion s’établit entre deux intracommunicateurs ne contenant chacun que le processus appelant l’un ou l’autre sous-programme. Chergui. Girou.5 – Gestion de processus Remarques ☞ MPI_COMM_CONNECT(). Wautelet . D. Lavallée. ☞ Sans le mécanisme des sous-programmes MPI_PUBLISH_NAME() et MPI_LOOKUP_NAME().

Wautelet INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE . on devrait pouvoir les supprimer ☞ Or. Girou. Chergui. I. MPI – Version 4.5 – Gestion de processus 11. Dupays.-F. ➋ il ne doit exister aucun lien de communication (intercommunicateur) entre le communicateur MPI_COMM_WORLD contenant le processus père (ou serveur) et celui contenant le processus fils (ou client) à supprimer .1 – Avril 2012 J. Lecas. P. ➌ tout intracommunicateur contenant le processus à détruire doit être invalidé avant la terminaison du processus fils (ou client).4 – Suppression de processus ☞ S’il est possible de créer des processus. Lavallée. D. il est toujours possible de diriger (ex. P. il n’existe pas de sous-programme MPI spécifique pour supprimer un processus généré en cours d’exécution ☞ En revanche. D.5. par échange de messages) l’exécution de ce processus vers une « terminaison normale » ☞ Un processus MPI se termine normalement à l’appel du sous-programme MPI_FINALIZE() et à la fin de l’exécution du programme principal ☞ Il existe trois contraintes : ➊ le nouveau communicateur MPI_COMM_WORLD généré ne doit contenir que le processus dont on veut se débarrasser .5 – Gestion de processus 11 – Annexes 11.310/326 11 – Annexes 11.

-F. Wautelet . P. Dupays. D. Lavallée.311/326 11 – Annexes 11. Girou. Chergui. Lecas.1 – Avril 2012 J. I.5 – Gestion de processus ☞ Il faut également noter que ➳ il n’est pas possible de se débarrasser d’un seul processus « ouvrier » si son communicateur MPI_COMM_WORLD inclut d’autres processus . P. INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. D. la terminaison ne s’effectue « proprement » que si tous les processus de MPI_COMM_WORLD appellent le sous-programme MPI_FINALIZE() et atteignent normalement la fin de l’exécution. ➳ dans ce cas.

5 – Gestion de processus 11 – Annexes 11.312/326 11 – Annexes 11. Girou. intent(out) :: comm clef valeur code call MPI_COMM_SET_ATTR (comm. code) ☞ On peut cependant modifier la valeur associée à une clef définie au préalable. intent(out) :: code call MPI_COMM_GET_ATTR (comm. Wautelet .5. on peut définir un couple (clef. Lecas. intent(in) :: integer. valeur. valeur. intent(inout) :: integer. en utilisant le sous-programme : integer. comme celui de MPI_UNIVERSE_SIZE. Lavallée.-F. intent(in) :: integer(kind= MPI_ADDRESS_KIND ).5 – Gestion de processus 11. P. clef. logique. clef integer(kind= MPI_ADDRESS_KIND ). P. I.5 – Compléments ☞ Dans certains cas. intent(out) :: valeur logical. intent(in) :: comm. les implémentations ont des clefs spécifiques dont la valeur peut être connue grâce au sous-programme : integer. intent(out) :: logique integer. Dupays. valeur) spécifique à son application par l’intermédiaire des sous-programmes MPI_COMM_CREATE_KEYVAL() et MPI_COMM_SET_ATTR() INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. code) ☞ Plus généralement. D.1 – Avril 2012 J. clef. Chergui. D.

code) call MPI_FILE_GET_INFO (descripteur. Lavallée.attribut.1 – Avril 2012 J.defini.-F. D.defini. I.6 – MPI-IO Il est possible d’obtenir certaines informations spécifiques sur un fichier. Dupays.libelle(1:longueur). D.descripteur.rang. MPI_MODE_RDWR + MPI_MODE_CREATE ."cb_nodes".attribut. P. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 program open02 use mpi implicit none integer :: rang.code) call MPI_FINALIZE (code) end program open02 > mpiexec -n 2 open02 Fichier ‘fichier.code) if (defini) then call MPI_INFO_GET (attribut. Girou. Lecas.descripteur.code) call MPI_FILE_OPEN ( MPI_COMM_WORLD .313/326 11 – Annexes 11.code) call MPI_FILE_CLOSE (descripteur. Chergui.txt’ sur 2 processus INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4.libelle.code character(len=80) :: libelle logical :: defini call MPI_INIT (code) call MPI_COMM_RANK ( MPI_COMM_WORLD ."Fichier ‘fichier." processus" end if call MPI_INFO_FREE (attribut.txt". & MPI_INFO_NULL ."fichier.longueur.6 – MPI-IO 11 – Annexes 11.txt’ sur ".longueur.code) call MPI_INFO_GET_VALUELEN (attribut."cb_nodes".code) if (rang==0) print *.longueur. P. Wautelet .

. . 317 12. . Wautelet INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE . . . . . . . Lecas. . . . . . . . . . . . Girou. . . . P. . . Lavallée.-F.1 Index des concepts . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . . . 315 12. . .320 MPI – Version 4. . . . . . . . . Chergui. . . . . . . . . . . . . . . . . . . .3 Index des sous-programmes MPI. . . . . . . . . . . . . I. . . . . . . . . D. . . . . . . .1 – Avril 2012 J. . . . . . . . . . . . . . . . . . . . . . . . . Dupays. .2 Index des constantes MPI . . . . . . . . . . .314/326 12 – Index 1 Introduction 2 Environnement 3 Communications point à point 4 Communications collectives 5 Copies de mémoire à mémoire 6 Types de données dérivés 7 Optimisations 8 Communicateurs 9 MPI-IO 10 Conclusion 11 Annexes 12 Index 12. . . . . . . .

P. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160. . . . . . . . . . 28. . . .-F. . . . . . . . . . . . . . 39 non-bloquantes (communications) . . . . . 155 intercommunicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . 154. . . . . . . . . . . . . . . . . . . 10. . . . . . . . . . . . . . . . . . . . . . . . . . 272 intracommunicateur . . . 44. . . . . 46 bloquantes (communications) . 14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 intracommunicateur . . . . . . 271 collectives (communications) . . . . . . . . . . . . 149. . . . . . . . . 23. . . . . . . . . . . 268. . . . . 152 MPMD . . 28. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dupays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12–14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . . . . Lecas. . . . . . . . . .315/326 12 – Index 12. . . . . . . . . . 149. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chergui. . . . . . . . . . . . 272 message . . . . . . . . . . . . . . . . . . . . 28. . . . 34. . . . 272 communication . . . . . . . . . . . . . . . . . . 61. . . . . . . . . . . . . . I. . . . . . . . . . . . . . . . . . . . . . . . 268 étiquette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 envoi . . . . . . . . . . . . . . . . . . . 154–157. . . . . . . . . . . . . . . . . . . . .1 – Avril 2012 J. . . . 11 optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . 28. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14. . . . . . . . . . . . . . . . . . . . 44 groupe . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . 131. . . . Wautelet INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE . . . . . . . . . . . . . . . . . 150. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 contexte de communication . . . . Girou. . . . . . . . . . . 14 communicateur . . . . . . . . . 154. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152. . . . . 131 MPI – Version 4. . . . . . . 150. . . . . . . . 271. . . . . . . . . . . . . . . .1 – Index des concepts barrière . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24. . . . . . . . . . . . . . . . . . . . . . . . . 175 intercommunicateur . . . . . . . . . . . . . .

. . . . . . Lavallée. . . . 110. . . . . . . . . . . . D. 154–156. . .1 – Avril 2012 J. . . . . . . . . .9 processus . . . . . . . . . . . . . . Dupays. . . . . . . . . 271 SPMD . . . . . . . . . . . . . . . 155. . . . . 156. 11 topologie . . . . . . . . . . . . . . . . . . . . D. . 268. . . . . 268 requête . . . . . . . . . . . . . . .1 – Index des concepts performances . . . . . . . . . . . . . . . . . . . . . . . . 155 persistantes (communications) . . 128. . . . . . . . . . . . . . . . Chergui. . . . . . . . . . . . . . 168. . . . 61. . . . . . . 166. . . . 28. . . . . . . . . . . . 14. . . . . . . . . . . . . . . 32. . . . 160. . . .316/326 12 – Index 12. 170. . . . . . . . . . . . 10–14. . . . . . . . . . . . . . . . . . . . . . . I. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lecas. . . . . . . . . . 40. . . . . . 68. 44. . . . . . . . . 149. . . 152. . . . . . . . . . . . . . . . . . . . Girou. . . . . . . . . . . . . . . . . . . . 160. . . . . . . . . . . . . . . . . . . . . . . . . 159. 166. . . . . . . . 159. . . . . 128 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 165. . . .-F. . . 168. . . . . . . 168. . . . . 268. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27. . . 28. . . . . . . . . . 170 réception . . . . . . . . . . 175. . . . . . . . . . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128. . . . 177 types derivés . . . . 23. . . . . . . 128 processeur . . . . . 271 portabilité . . . . . . . . . . . . . . 24. . . . . . 39. . . . . . 272 rang . . . . . . . 166. . . . . . . . . . . . 32. . . . . . . . . P. . . . . . . . . . . . 24. Wautelet . . . . . . . . . . 170. . . . . . . . . . . . . . . . . . . . . . . . . . 165. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I. . 259. . . . . . . . . . . . . . 255. . . . . . . . . . . . . . . . . . . . . 226. . . . . . . 292. . . . 66. . . . 36 MPI_ARGV_NULL . . 301. . 237. . . . . . . . . . . . . . . . . . . . . . . . . 221. . . . . . . . . . . . . 258. . . . . . . . . . D. . . . . . . . . . . 158. . . 274. . . 122. . . . . 179. . . . . . . 22 MPI_ADDRESS_KIND . . . . . . . . . . . 295. . . . . 212. . . 292. . 39. . . . . . . . . . . 298. . . . . . . . 299. 242. . 102. . . . . . Dupays. . . . . . . . . . 56. . 204. . . . . . 295. 127. . . 46. . . . . . . . . . . . . . . . . . . . . . . . . . . Wautelet . . . 22 mpi. . . . . . . 252. . . . . . . . . . . . . . . . . . . . . 104–109. . . . 270. .1 – Avril 2012 J. . . . . . . . . . . . . . P. . 57. . . . . . 216. . . . . . . 313 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . 284. . . . . . . . . . . 32. . . . . . . . . . . . . . . . 303. . . . . . . . . . . . . . . . 292–294. . . . . . . . . . . . . . . . . . . 283. . . . . . 77. . . 48. . . . . . . . . . . . . . . 126. . . . 263 MPI_DISTRIBUTE_NONE . . 221. . . 299. 307. . . . . . . . . . . . . . . 263 MPI_DOUBLE_PRECISION . . . . . . . . . 80. . .-F. . . 173. . . . . . . . . 94. . . . . . . . . 191. 161. 249 MPI_DISTRIBUTE_BLOCK . 87. . . . . 87. . . 269. . . . . . . 295. . . . . . . . . . . . . . . . . . . . . 232. . . . . . . . . . . 218. . . 230. . . . 125. . P. . 124. 298. . . . . . . . . . . . . . . . . . . . . . . . . . . . 50. . . . . . . . . . . . . . . . 224 MPI_CHARACTER . . . 210. . 227. . . . . . . . . . . . . . . 298. . . . . 123 MPI_COMM_NULL . . . . . . . . 252. 260. . . . . 252–255. . . . 233. . 249. 299 MPI_ARGVS_NULL . . . . . . . . . . . 301 MPI_BSEND_OVERHEAD . . 236. . . 191. . . . 227. . 202. . . . .h . . . . 52. . . . 126. . . 301. . 199. . Lavallée. . . . 197. . . . D. . . 77. . . . . 256. . . . . . 239. . . . . . . . . . . 120. . . . . . . . . . . . 54. . . . . 32. . . 204. . . . . . . 135 MPI_BYTE . . 36 MPI_ANY_TAG . . . 295. . . . . . . . . . . . . 275. . . . . . . . . . . . . . 303. . . . . . . . . . . . . . . . . 214. . 230. . . . . . . . 87–89 MPI_ERRCODES_IGNORE . . . . . 308. . . . . . . . . . . . . . . . . . 312 MPI_ANY_SOURCE . 59. . . . . . .317/326 12 – Index 12. . . . . . . . . . . . . . 216. . . . . 202. . . . . . . . . . . . . . . 237. . . . . . . . 207. . . . . . . . . . 163. . . . 309 MPI_COMM_WORLD 23–25. . . . . . 296. . . . . . . . 301 MPI_INFO_NULL . . . . . . . 232. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253. . . . 262 MPI_DISTRIBUTE_CYCLIC . . . .2 – Index des constantes MPI mpi . Girou. 123. 299. . . . . . . . . 218. . . . . . . 284. . . 210. . . . . 77. . 64. . 307–311. . . . . . . . . . 174. . . . 87. . . . . . . . . . . . . . . . . . . . . . . . . 239. . . . . . 77. . . Chergui. . . . 112. . . . . . . . . . . 214. . . . . . 313 MPI_COMPLEX . . . . . . . . . . . . . . . . . . . 150. . . . . . 259. . . . . . . . . . . Lecas. . . . . . . . . . . . . . . . . . 293 MPI_COMM_SELF . . . 33–36. . . . . . . 98. . 207. . . . . 155. . . . 119. . 29. . . . . . . . . . . . 242. . . . . 292. 199. . . 303. . . . . . . . . . . 197. . . . . 123. . . . . 41. . . . . . . . . 212. . . . . . . . . . 115. . . . 266. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . 102. . . . . . . . 146. . . . . . . . . . . 233. . . . 230. . . . . . . . . . . . . . 278 MPI_MAX_PORT_NAME . . . . . . . . . . . . . . 93. . . . . 216. . . 239. . . . . . . . . . . . . . . . 227. . . . . . . . . . . . . Girou. . . . . . . . . . . . . . . . . 210. . . . . . . . . . . . . . . 54. . . . . . . . . . . . . 221. . 210. . . 237. 242. . . . . 221. . . 197. . . . 117. . . . . . . . . 115. . . . . . . . . 207. . . . . . . . 218. . . 29. . . . . . . . . . . . . 278. 207. . . . . . . . . . . . . . . . . . . . . 199. . 204. . . . . . . . . . . 256. . . . . . 120. . . . . . . 230. . . . . . . . Chergui. . . . 39. . . . . . 94 MPI_LOGICAL . . . . . . . . .117 MPI_ORDER_FORTRAN . 123. . . . . . . . 59. . 226. . 232. . . 83 MPI_MODE_NOPUT . 307. . . . . . . . . . 214. . . 48. . . . . . . . . . . Lecas. . . . . . . . . . 269. . . . . . . .318/326 12 – Index 12. . 221. . . . 155. . . . . . . . 279. . 202. 199. . . . . . . . . . . . 260 MPI_PROC_NULL . . 50. 308 MPI_MODE_CREATE . . . . . . . . . . . . . . . . . . . 313 MPI_MODE_SEQUENTIAL . . 98. . . . . . . . . . . . 34. . . . . . . . . 212. . Lavallée. . . . . . . . . . . . . . . . . . . 197 MPI_OFFSET_KIND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196. . . . . . . . . . . . . . . . . . . . . . . . . 64. 199. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57. . . . 239. . . . . . . . . . . . . . 212. . . . . 33. 218. . . . . 81. . . . . . . . . . . . . . . . D. . 110. . P. . . . . . . . . 120. . . . . . . . . . 229. . I. . . . . . . . . . 106. 242 MPI_MODE_RDWR . . . . . . . . 179. . . . . . . . . . 32. . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127. . . . . . 81 MPI_REAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110. . . . . 158. . . . . . . . . . . 260 MPI_LOCK_EXCLUSIVE . . . .2 – Index des constantes MPI MPI_INTEGER . . . 270. . . . Dupays. . . . . . 216. . . . . . . . . . . . . . . . 237. . . . . . . . . . . . . . . 230.1 – Avril 2012 J. . . . . . . . . . . . . . . . 66. . . . . . . . . . 123 MPI_MAX . . . . . . . . 214. . . . . . . . 126. . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 MPI_PROD . 232. . . . . . . 204. . . P. . . . . . . . 201 MPI_MODE_WRONLY . . . 233. . . . . . . . . . . . . . . . . 93 MPI_LOCK_SHARED . . . . . . . . . . . . . 98. . . . . . . . . 36. . . . . . . . . . 256. . . . 285 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 123. . . 80. . . . . . . . . .-F. . . . 100–102. . 191. . . . 83 MPI_MODE_RDONLY . . . . . . 66. . . . . . . . . . . . . . 197. . . . . . . . . . . . . . . . . 52. . . . 191. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210. . . . . . . . . . . . . . . . . . . . . . . . . 236 MPI_ORDER_C . . . . . . . . . . . . . . . . . 108. . . . . 104. . . . . . 313 MPI_MODE_NOPRECEDE . 83 MPI_MODE_NOSTORE . . . . Wautelet . . . . . . . 197. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227. . . . . . . 41. . . . . . . . . . . . . . . . . . . . . . . . 83 MPI_MODE_NOSUCCEED . . . 276. . . . . . . . . 202. . . . . . .

. . . . . . 216. .1 – Avril 2012 J. . . . . . . . . . . . . . . . Girou. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32. . . . . . . 204. . . . . . . . . . 299. . . . . . . . . 220. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 MPI_SEEK_CUR . . . . . . . . . . 202. . . . . . 266 MPI_UNIVERSE_SIZE . . . . . . . . . . . . . . 212. . . . . . D. . . . . . . . . . . 35. . . . . . . . . . . I. . . 36 MPI_STATUS_IGNORE .319/326 12 – Index 12. . . . . . . . 221. . . . 115. . . . . . . . . . . . . . . . 126. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226. . . . . . . . . . . . . 276. . . . . . . . . Lavallée. . . . . . . . . . . 220. . . . . . . . . . . . 277. . . . . . . Wautelet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 MPI_STATUSES_IGNORE . . . D. . . 41. . 218. . . . . . . . . . . . 229. . . 89. . . . . . . . . . . . . . . 232. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76. . . . . 199. . . . . . 33 MPI_STATUS_SIZE . . . . 29. . . . . . Chergui. . . . . . . . . . 156. . . . . . . . . . . 76. . . . . . . . . . . . . . . . . . 76. . . . . . .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 MPI_WIN_SIZE . . . . . 239. . . . . . . . . . . . . . . 77 MPI_WIN_DISP_UNIT . . . . . . . . . . . . . . . . . . . Lecas. . . . . . . . . . . . . 221 MPI_SEEK_END . . . . 242. . . 146 MPI_SUCCESS . . . . . . . . . . . . . . . . . . 220 MPI_SEEK_SET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 MPI_TAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214. . . . . . . . . . . . . . . . . . . . . . . . . . 81. . . . . . . . . 221 MPI_SOURCE . . . 108. . Dupays. . . . . . 210. . . . . . . 279. . . . . . . .-F. . . . . . . . . . . . . . 207. . . . . . . . . . . . . . . . . . . 303. . . . . . . . 123. 77 mpif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104. . . . . . . . . 255. . . . 22 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 MPI_UNDEFINED . . . . . . . . . . . . . 106. . 312 MPI_WIN_BASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . . . . . .64. . . . . . . . . . . . . . . . . . . 119. . . . . . . . . . . . . . . . . . . . . . . 132 MPI_SUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197.2 – Index des constantes MPI MPI_REPLACE . 276. . . . 32. . . . . . . . . . . . . . 236. . . . . . . . 259. . . . . . . . . . . . . . . . . . . .

. . . . . . D.308. . . . . . . . . . . . . . . . 68 MPI_ALLGATHERV . . . . . . 59. 66. . . . 179 MPI_CART_RANK . .320/326 12 – Index 12. 179 MPI_CART_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 MPI_CLOSE_PORT . . . . . . . . . . . . . . . I. . . . . . 81. . . . . . . . . . . . . Lecas. . . . . . . . . . . . . . . . . . . 45. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 MPI_ALLTOALLV . . . . . . . 285 MPI_ALLTOALL . . . . . . . . . . . . . 276. . . . . . . . . . . . . 309 MPI_COMM_CREATE . . . . . . . . . . . . . Dupays. . . . 167 MPI_CART_SHIFT . . . . . 54. 131. . . . . . . . . . . . . . . . . . . . . . . . . . . . 45. . . . . . . . Chergui. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 MPI_CART_SUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . . . . . . . . . . 160. . . . 95 MPI_ALLREDUCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278. . . . . . . . . . . . . . . . . . . . . . . . . . .78. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wautelet . . . . . 307. . . . . . . . . . . . . 68 MPI_ATTACH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174. . . . . . . . . . . 285 MPI_BCAST . . . . . . . . . . . . . . . . . . . . . 174. . . 68 MPI_ALLTOALLW . . . . . . . . . . . . . . . . . . . . 309 MPI_COMM_ACCEPT . . . . . . . . . . . . . . . . . 46. . . . . . 135 MPI_BARRIER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45. . . . . . . . . . . . . . . . . . . . . . . 266 MPI_BSEND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312 MPI_COMM_DISCONNECT . . . . . . . . .154. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 MPI_COMM_FREE . . . . . . . . . 33 MPI_ACCUMULATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155. . . . . . . . . . . . . . . . . . . . . . . . . . 177. . . . . . . . P. . P. . 169. . . . . . . . . . . . 68 MPI_ALLOC_MEM . . . . . . . . 45. . . . . . . . . . . . . . . . 61. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Girou. . . . . . . 166. . . . 154. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306–309 MPI_COMM_DUP . . . . . . . . . . . 163. . . . . . . 48. . . . . . . . . . . . . . . . . . . . . . .-F. . . . . 61. . . . . . . . . . . . . 135–138 MPI_CART_COORDS . . . . . . . . . . . . . . . . . . . . . . . . . . . 306. . . . . . . . . . . . . . . . . . . . . . . . 170–172. . . 158. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 MPI_COMM_CREATE_KEYVAL . . .1 – Avril 2012 J. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168. . . . . . . . 309 MPI_COMM_CONNECT . . . . . . . . . . . .3 – Index des sous-programmes MPI MPI_ABORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154. . . . . . . . . . . 85. . . . . 161. . . . . . . . . . . . . . . . . . . . . . . . . . 306. . 307. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45. . . . 89–91 MPI_ALLGATHER . . . . . . . . . . . . . . . . . . . . . .

. . . . . . 220 MPI_FILE_GET_POSITION_SHARED . . . . . 218. . . . 197. . . . . 59. . . . . . . . . 249. 312 MPI_COMM_GET_PARENT . . . . . . . . . . . . . . . . . . . 24. . . . . 218. . . . . . 197. . . . 237 MPI_FILE_IREAD_SHARED . . . . . . . . . . . 41. . . . . . . . . 135 MPI_DIMS_CREATE . . . . . . . . . . . 204. 35. 25. . . . . . 303 MPI_COMM_SPAWN_MULTIPLE . . 52. . . . . . . . . . . . . . . . . . . . . . Wautelet . . . 292. . . . . . 212. . . . . . 313 MPI_FILE_GET_INFO . . . . . . . . . . . . . . 274. . 237. . . . . . . . . . 193. . . . . . . . . . . . . . . . . . . . . . . 29. . . . . . . . . 56. . . . . . . . . . . .193 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . 239. 174. . . . . . . . . . . . . . . . . . . . 52. . . . 255. . . 312 MPI_COMM_SIZE . . 204. 284. . 33. . . . Lecas. . . . . . . . . . 104. . . . . . . . . . . . . . . . . . . 64. . 56. . . . 280. 194 MPI_FILE_IWRITE_AT . . . . . . . . . . 35. . 214. . . . . . . . . 221. . . . . . . . . . . . . . . . 165. . . . . . 126. . . . . . . . . 202. 278. . . 210. . . . . . 64. . . . . . . . 293. . 239 MPI_FILE_IREAD_AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41. . . . . . . . . . . . . . .3 – Index des sous-programmes MPI MPI_COMM_GET_ATTR . Chergui. . . . . . . . . . 194. . . 292. . . . . . . . . . . . 230. . . . . 154. . . . . . . . . . . . 54. . . . . . . . . . . . . . 66. 293 MPI_COMM_SPAWN . . . . . . . . 279. . . . . . . . . . . . . . . 313 MPI_FILE_GET_POSITION . Lavallée. . 227. . . . . . . . . 68 MPI_FILE_CLOSE 191. . . . . . . . . . . 284 MPI_EXSCAN . . . . . . . . . . . . . . 283. . . . . 207. . . 115. . . 274 MPI_DETACH . . . . . . . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297. 177. . . .1 – Avril 2012 J. . . . . . . . . . 50. . . . . . . . . 106. . . . . . . 242. . . . . . . . . . . . . 66. . . . . . . 54. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232. . . . 297–300. . . . . . . . . . . . . . 216. . . . . . 220 MPI_FILE_IREAD . . . . . . . 236. . . . . . . . 214. 199. . . . . . . . . . . . . . 207. . . . . . . . . . . . . 227. . . . . 239. . . 173 MPI_DIST_GRAPH_CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Girou. . . . . . . . . . . . . 290–292. P. 25. . . . 210. . . . . . . . . . . . . . . . . . . . . . . 255. . . . . . . . . . 199. . . . . . . . . . . . . 48. . . . . . . . . . . . . . . . 233. . . 194 MPI_FILE_IWRITE . . 156–158. I. 173. . . . . . . . . . . . . . . 293 MPI_COMM_RANK . . . . . . . . . . . . . . . . . . . . . 158. . . . . . . . . . . . Dupays. 50. . . . . 123. . . . . . . . . . . . . . . . . . . . . 313 MPI_COMM_SET_ATTR . . 283. . . . . . . . . 259. . . . . . . 230. . . . . . D. . . . . . . . . . . .-F. . . . . . . . . 59. . . . . . . . . . . 202. . . . . . . . . 300–303 MPI_COMM_SPLIT . 77. . . D. . . . . . . . . . . 119. . . . . . . . . 216. . . 24. . . . . 179. 221. . . . . . . . .321/326 12 – Index 12. 108. . . . 276. . . 212. . 266. . . . . . . . . . . 299. . . . . . . . . 295. . . 242. . . 87. . . . . . . . . 259. . . . . .

. . . . . . . 221 MPI_FILE_SEEK_SHARED . . . . . 212. . . . . . . . . . . . . . .3 – Index des sous-programmes MPI MPI_FILE_IWRITE_SHARED . . . . . . . . . . . . . . . . . 191. . . . . . . . . . . . 194 MPI_FILE_OPEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193. . . . . 197 MPI_FILE_WRITE_AT_ALL . . . . . . . . . . . . . . . . . . 204. . 216 MPI_FILE_READ_ALL_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230. . . . . . . . . . . . 202. . . . . . . . . . . . . . 220 MPI_FILE_SET_INFO . . . . . . . . . . . . . . . . . . P. . . . . . . . . . . . . 189 MPI_FILE_SET_VIEW . . . . . . . . 220. . 193 MPI_FILE_READ_ORDERED . . . 202. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 MPI_FILE_SEEK . . . . . . . . . . . . . . . . . . . . . . . . . . 204. . . . . . . . . . . . . . 199. . . . . . . . . . . 233 MPI_FILE_WRITE . . . . . . . . . . . . I. . . . . . . . . . . . . . . . . . . . . . . 194. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 MPI_FILE_READ_ORDERED_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . 194. .-F. . . . . . . . . . . 227. . . . . . . . . . . . . . . 194. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_AT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 MPI_FILE_READ_AT_ALL_BEGIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_READ_AT . . . . . . . . . . . . . . . . 214. . . . . . . . . . . . . . . . 193 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . 207. . . . . . . . . . . . . . . . . . . . . . . 193. . . . . . . . 194 MPI_FILE_WRITE_ALL_END . . . . 239. . . . . . . 194. . . . . . . . Chergui. . . . . . . . . 221. . . . . . . . . . . . . . . . . . 227. . 237. . . . . . . . . . . . . . . . . . . . . . 193 MPI_FILE_READ_AT_ALL_END . . . . Wautelet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . 194. . . . . . . 242 MPI_FILE_READ_SHARED . 193. . 194 MPI_FILE_WRITE_ALL_BEGIN . . . . . . . . . 212. . . . . 197. . . . . . 233 MPI_FILE_READ_ALL . . . . . . . . . . . . . . . . . . . . . . 232. . . . . . . . . . . . . . . . . . . 216. . . . . . . . . . . . . . . . . . . . . . . 242. . . D.1 – Avril 2012 J. Girou. . . . . . . . . 218. . . . . . . . 230. . . . . . . . . . . . Lecas. . . . . . . . . . . 221. . . . . . . . . . . . . . . . . 227. . . . . 210. . . . . . . . . . . . . . . Dupays. . 313 MPI_FILE_READ . . . 242 MPI_FILE_READ_ORDERED_END . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ALL . . . . . . . . . . . 194 MPI_FILE_READ_ALL_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .322/326 12 – Index 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194. . . . . . . . . . . 214. . . . . . . 199 MPI_FILE_READ_AT_ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . 197. . . . . . . . . . . . . . . . . . 313 MPI_GATHER . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66. . . . . 179. 120. . . . . . 239. . . 199. 207. . . . . . 298 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . 260. . . . . . 214. . . . . . . . . . . . . . . . . . . . . . . 136. . . . . . 216. . . . . Lavallée. . . . . . . . . . . . . .-F. . . 48. . . . . . . . . . . . . . . . . . . . . . . . . 221. . . . . . . 25. 50. 313 MPI_INFO_GET . 124 MPI_GET_ELEMENTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29. 218. .57. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chergui. . . . D. . . . . . . . . . 52. . . . . . . . . . . . . . . . . . . . .1 – Avril 2012 J. . . . . . 266. . . . . . 45. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 – Index des sous-programmes MPI MPI_FILE_WRITE_AT_ALL_BEGIN . . 150. . . . . . . . . . . . . . . 81. . . . . . . . . . 131. . . . . . . . 115. . . . . . . . . . . . . . . . . . 194 MPI_FINALIZE . . I. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33. 194 MPI_FILE_WRITE_ORDERED_END . . . . . . . . . 91. 298. . . 36 MPI_GRAPH_NEIGHBORS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77. . . . . . . . . . . . . . . 94 MPI_GET_ADDRESS . . . . . . . 41. . . 174. . . . . . . . . . . . . . . . . . . 202. 297. 64. 233. . . 282. . . 193 MPI_FILE_WRITE_ORDERED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210. . . . . . 284 MPI_GRAPH_NEIGHBORS_COUNT . . . . . . . . . . 36. . . . . . 242. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124. . . 249. . . . . . . . . . . . . . . 68 MPI_GET . . . . . . . . . . . . . . . . . . . . . . 237. . . . 88. . . . . . . . . . . . . . . 122. . . . . . 22. . . . . . 285. . . . . . . . . . . . . . . . . . . . . . 310. . . P. . . . . . . 204. . . . . . . . . . . . . . . . . . 193 MPI_FILE_WRITE_AT_ALL_END . . . Girou. . . 256. . . . Wautelet . . . . . . . . . . . . . 121. . . . . . . . . . . . . . . . 293. . . . . . . . . . . .282. . . . . . . . . 313 MPI_INFO_SET . . . . D. . . . 212. . . . . 311. 127. . . . . . . . . 297. 194 MPI_FILE_WRITE_SHARED . . . . . . . . 89. . . . . . 230. . . . . . . . . . . 301. . . . . . . . 105. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. . . . . . . 57. . 284 MPI_IBSEND . . . . . . 158. . . . . . . . 313 MPI_INFO_GET_VALUELEN . . Lecas. . . . . . . . . 78. . . . . . . . . . . . . . . . . . . . . . 68 MPI_GATHERV . . . . . . . . . . . . 298 MPI_INFO_FREE . . .297. . . . . . . . . . . . . . . . . . . . . . . 194 MPI_FILE_WRITE_ORDERED_BEGIN .323/326 12 – Index 12. . . . . . . . . 54. . . . . . . . 292. . . . . . . . . . 138 MPI_INFO_CREATE . . . . . . . . . . . . . . . . . . . . . . . 59. . . . . . . . . . . . . . . 227. . . . . . . . . . . . . . . . . . 109. Dupays. 107. . . . . . . . . . . . . . 52. . . 191. . . . . . . . . . . .

45. . . . . . . 313 MPI_INTERCOMM_CREATE . . . . . . . . . . . 34. . 78. . . . . . . . . . . . . . . 54. . . . . . . D. . . .3 – Index des sous-programmes MPI MPI_INIT 22. . . 45. . . . . . . . . . . . . . . . . . . . . . . . 283. . . 41. . . . . . . . . . . . . . . . . . . . . . . . . . . . 34. . . . . . . . 308. . . . . . . . . . . . . . . . . . 309 MPI_PUT . . . 36 MPI_PUBLISH_NAME .61. . . . . 39. 39. . 218. . . 85. . . . . 179 MPI_SCATTERV . . . . . . . . . . . . . . Wautelet . . 61 MPI_OPEN_PORT . . . . 266. . . . . 230. . . . . . . . . . . . . . . . . . . .324/326 12 – Index 12. . . . 105. . . . . 256. . . . . . . . . . . . . . . . . . . . . . . . . . 232. . 52. . . . . . . . 107. . . . . . . . . . . . . . . . . . . . . . 269 MPI_LOOKUP_NAME . . 124. . . . . . . . . . . . . . . . . . . . . . . . . . . 249 MPI_REQUEST_FREE . . . . . . . . . . 131. . . . . . . 249 MPI_OP_FREE . . . . . . . 64. . . . . . . . . 272. . . . . . . . . . . . . . . . . 239. . . . . . . . . . . . . . . 109. . . . 109. . . . . 107. . . . . . . 25. . 127. . . . . . . 36. 61. . . . . . . . . . . . . . . . . . . . . . . . . 275 MPI_INTERCOMM_MERGE . . . 309 MPI_OP_CREATE . . . . . . . . . . . . . . . . . . . I. P. . . . 33. . . . . . . 119. . . . . . . . . . . . . . 255. . 131. . . . 140 MPI_ISEND . . . . . . . . 292. . . 207. . . . . . . . . . . . . . . . . . . . . . . . 140 MPI_SCAN . . . . . . .-F. . . 139. . . . . . . . . . . . . . . . . . . . . . . . . 131. . . . 105. . . . 68 MPI_SEND . . . . . . . 80–82. . . . . . . . . . . . . . . . 131. . 90. . . . . . . . . . . . . . 306. . . . 41. . . . . . . 221. . . 35. . . 307. . . . . . . . . . . . . . 260. . 29. 270 MPI_REDUCE . . . . . . . . 216. Dupays. . . . . . . . . . . . 88. . . . . . . . . . . . . . 77. . . . . . . . . . . . 108. . . . . . . . . 131. . . . . . . 145. . 66. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 MPI_RECV . . . . . . . . . . . . . 197. . . . . . . . . . . . 146 MPI_ISSEND . . . . . 124. . . . . . . . 126. . . 139. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61. . 41. . . . . . . . . . . . . . . . . . . . . . 87. 145. . . . . . . . . . . . . . . . . . 212. . . . . . . . . . . . . . . . . . . . . . 227. . . . 68 MPI_SCATTER . . . . . 150. . . . . . . . . . . . . . . . . . . . . . . . . 293. . . . . . . . . . . . 236. . 50. . . Lecas. . 269 MPI_IRSEND . . . . . . . 48. . . . . . . . . . 146. . . . . . . . . . 214. . . . . . 106. . . . . . 173. . . . . . . . . 202. . . . 279 MPI_RECV_INIT . . . . . . . . . . . . . . . . . . . . . . . . 274. . . . . . . 29. . . . . . . . . . . . . . . . . . . . . . . . . 104. 259. . . . . . . . . . . . . . . . . . . . . . . . 115. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Girou. . . . .1 – Avril 2012 J. . 29. . . . . . . . . 301. . . . . . . . . . . . . . . . . . . 301 MPI_IRECV . . 123. . . . . . . . . . . . . . . . . . 179. . . . . . . . . . . . . . . . . . . . 307 MPI_PROBE . . . . 158. . . . . . . . . . . . . 290. 142. 131. . . . . . . . . . . . . . . . 68. 59. . . . . 36. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210. . . D. . . . . . . . . . . . . 127. . . . . . . . . . . . 191. . . . . . . . . . . . . . . . . . . . . 242. . . . . 204. 56. P. . . 260 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. 256. Chergui. Lavallée. . 133. . . . . . . 292. 249. . 50. . . . . . . . 131. . . . 142. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199. . . . . . . 293. . . . . . . 64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 MPI_RSEND . .

. . . 87. 256. 109. . Chergui. 264 MPI_TYPE_CREATE_F90_REAL . . . . 227 MPI_TYPE_SIZE . . . . . . . 110. . . . . . . . . . . . 233. . . . . . . . . . . 227. . . . . . . 306. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230. . . . . 101. . . . . . . . . . . . . . . . . . . . 251. . . . . . . . . . . . . . Lavallée. . . 260. . . . 98. . . . . . . . . . 233 MPI_TYPE_FREE . . . . . . . . . . . . . . . . . . . . . . . . 144. . . . 127. 120. . . . . . . . . . 103. . . 104 MPI_TYPE_CREATE_DARRAY . . . 264 MPI_TYPE_CREATE_HINDEXED . . . . . . . . . . . . . . P. 239. . . . . . . . 120. 227 MPI_TYPE_INDEXED . . . . 266 MPI_TYPE_CREATE_F90_INTEGER . . . . . . . . . . . . . . . 121. . 264. . . . . . . 121. . . . . . . 103. 125. . . . . . . . . . . . . . 112 MPI_TYPE_CREATE_HVECTOR . . 124. . . . . . . 77. . . 126. . . . . . . . . . . . . . . . . . Girou. 221. . . . . . . . . . . . . . . 235. . . . . . . 32–34. . . . . . . . . . . 237 MPI_TYPE_COMMIT . . . . . . . . . . . . . . . .132. . . 98. . P. . . . . 76. . . . . . . . . . . . . . . . . . . . . . . . 100. . . . . . . . . . . . . 210. . 230. . . . . . . . . . .1 – Avril 2012 J. . . . . 120. . . Lecas. . . . . . 125. . . 271 MPI_TEST . . 270 MPI_START . . . . .-F. . . . . . . . . . . . . . . . . . . . 197. . . . . . 126. 102. 98. . . . . . 128. . . . . . . . 267 MPI_TYPE_CONTIGUOUS . . . . . . . . . . 124. . . 108. . . . . . . 115. . . . . . . . . . . . . . . . . . . . . . 256. . . 110. . . . . . . . . . . .110. . . 113. . . . . 269. . . . 110. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131. . . . . . . . . . . 98. 307 MPI_WAIT . . . . . . . 235. . . . I. . . 133. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122. . . 270 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . . . . . . . 237 MPI_TYPE_VECTOR . . . Wautelet . . 278 MPI_SSEND_INIT . . . . . . 106. . . . . . . . . . . . 124 MPI_TYPE_CREATE_SUBARRAY . . . . 285 MPI_SENDRECV_REPLACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 MPI_TYPE_CREATE_STRUCT . . . . . . . . 32. . D. . . . . . . . . . . . . . . . .325/326 12 – Index 12. 104. 199. . . 98. . . . . . . . . 126 MPI_UNPUBLISH_NAME . . . . . 267 MPI_TYPE_GET_EXTENT . . . . . . . . . . . . . 116. . . . . . 233. . . . . . . . . . . 278 MPI_SSEND . . . . . . . . . . . . . . . . . . . . . . . . . 115. . . . . . . . . . . . . . . . . . 125. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115. . . . . . . . 110 MPI_TYPE_CREATE_RESIZED . . . . . . . . . . . 105. . . 107. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115. 145. . 142. . . . . . . . . . . . . . . . . . . . . 120. . . . . . . . . .3 – Index des sous-programmes MPI MPI_SENDRECV . . . . . . . . . . . . . . . 276. . . 260 MPI_TYPE_CREATE_F90_COMPLEX . . . . . . . . D. . . . . . . . . . . . . Dupays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256. . . . . . . . . . . 270. . . . . . . . 111. . . . . . . . . . . . . . . . . 108. . . . . . . . . . .

. . . . . . .83. . . . . . . . . . . . . . . . . . . . . Wautelet . . . . . . . . . . . . . 76. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . P. 92–95 MPI_WIN_UNLOCK . . . . . Dupays. . . . . . . . . . . . . 146 MPI_WIN_CREATE . . . . . . 89 MPI_WIN_GET_ATTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326/326 12 – Index 12. . . . . D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77. . . . . . . P. . . . . . . . . . .-F. . . . . . . 88–90. . . 85. . . . . . . . . . . . . . . . . . D. . . . . . . 87 MPI_WIN_FENCE . . . . . . . . . . . . . . . . . I. . . . . . . . . . . . . . . . . . . . . . . . 74. . . . . . . . . Lecas. . . . . . . . . . . . . Chergui. . . . . . . . . . . 92–95 INSTITUT DU DÉVELOPPEMENT ET DES RESSOURCES EN INFORMATIQUE SCIENTIFIQUE MPI – Version 4. . .1 – Avril 2012 J. . . Girou. . 76.3 – Index des sous-programmes MPI MPI_WAITALL . . . . . . 92 MPI_WIN_FREE . . . . . . . . . . . . . 77 MPI_WIN_LOCK . . . . 77. . . . . . . . . . . . . . . . . . . . . . . . . Lavallée. . . . . . . . . . . . . . . . . . .

Sign up to vote on this title
UsefulNot useful