Académique Documents
Professionnel Documents
Culture Documents
Fichiers d’entête (Header files) En C rien n’empêche d’appeler une fonction comme si c’était une procédure.
Par ex: printf retourne la valeur 0 si tout s’est bien passé, et une valeur > 0 sinon.
❑ Pour le langage C : inclure le fichier mpi.h
#include <mpi.h> Mais personne (sauf les ecrivains de système) se préoccupe du code de retour...
❑ Pour Fortran : include ‘mpif.h’ (ou use mpi pour F90) En Fortran, on n’a que des subroutine. Le code retourné l’est dans la variable
spécifiée après le dernier paramètre de la routime MPI.
Fonctions MPI En Fortran pas de distinctions entre majuscules et minuscules. En C les fonctions
❑ C: MPI commencent toujours par MPI_ et la première lettre du nom de la fonction en
error = MPI_Xxxxx ( paramètre, ...); majuscule (ex : MPI_Init, MPI_Sendrecv_replace, ...)
ou MPI_Xxxxx ( paramètre, ... );
En C, les constantes prédéfinies sont toutes en majuscules (ex : MPI_SUCCESS)
❑ Fortran : Pour le support de C++, il faudra utiliser une implémentation de MPI-2. Mais ce
CALL MPI_XXXXX ( paramètre, ..., IERROR) support C++ est juste un enrobage de fonctions C...
Hugues Leroy Cours de DEA CH 3.2 / 1 Hugues Leroy Cours de DEA CH 3.2 / 2
Initialisation de l’environnement
La fonction MPI_INIT() permet au processus appelant d’initialiser l’environnement Attention dans tous les transparents on indique le prototype des fonctions C. Elles
nécessaire. ont la même “tête” que les entêtes de fonction définies dans un autre module (fich-
ier).
❑ C
Ici je dis que MPI_Init a deux paramètres de type adresse :
int MPI_Init ( int *argc, char ***argv )
le premier est l’adresse de argc et le deuxième l’adresse de argv
❑ Fortran
Hugues Leroy Cours de DEA CH 3.2 / 3 Hugues Leroy Cours de DEA CH 3.2 / 4
Désactivation de l’environnement MPI
❑ C
int MPI_Finalize() Avec MPICH s’il reste des messages non traités lorsque tous les processus ont fait
MPI_Finalize, une trace apparait à l’écran.
❑ Fortran
Attention : un processus MPI se terminant normalement doit faire Finalize().
MPI_FINALIZE(IERROR)
INTEGER IERROR On ne peut pas faire simplement exit() (ou STOP en Fortran)
❑ Doit être la dernière fonction MPI appelée par TOUS les processus.
Clarification: Chaque processus doit s’assurer que toutes les communications non
bloquantes sont localement terminées. De plus, au moment où le dernier proces-
sus appelle MPI_Finalize() tous les send() pendants doivent correspondre à un recv()
et tous les recv() pendants doivent correspondre à un send(). (matching send/recv)
MPI_Finalize est souvent implémenté comme une barrière de synchronisation...
Hugues Leroy Cours de DEA CH 3.2 / 5 Hugues Leroy Cours de DEA CH 3.2 / 6
Hugues Leroy Cours de DEA CH 3.2 / 7 Hugues Leroy Cours de DEA CH 3.2 / 8
Le communicateur MPI_COMM_WORLD
Toutes les opérations effectuées par MPI portent sur des communicateurs. Après MPI_Init tous les processus sont dans le même communicateur par défaut
Par défaut MPI_COMM_WORLD comprend tous les processus MPI lancés (on dit aussi le même contexte de communication).
par l’application. Nous verrons dans la suite comment changer de contexte de Ce communicateur par défaut est nommé MPI_COMM_WORLD (constante définie
communication. dans le fichier d’entête mpi.h). Il est de type MPI_Comm .
MPI_COMM_WORLD
0 1
2 3 4
5
6
Hugues Leroy Cours de DEA CH 3.2 / 9 Hugues Leroy Cours de DEA CH 3.2 / 10
Hugues Leroy Cours de DEA CH 3.2 / 11 Hugues Leroy Cours de DEA CH 3.2 / 12
Nombre de processus
❑ Combien y a-t-il de processus dans un communicateur ?
Hugues Leroy Cours de DEA CH 3.2 / 13 Hugues Leroy Cours de DEA CH 3.2 / 14
Hugues Leroy Cours de DEA CH 3.2 / 15 Hugues Leroy Cours de DEA CH 3.2 / 16
La gestion des erreurs
/* DEUXIEME POSSIBILITE ( version plus élégante ) , le 1ère version ne traitant pas de façon équitable tous
les producteurs car il y a une séquentialisation dans le traitement */
❑ La couche de transport est réputée fiable, mais l’utilisateur peut se tromper de On i=0;
ne traitera pas ces primitives dans ce cours. L’essentiel de l’effort porte sur
☛
paramètre, provoquer une saturation de l’espace mémoire, ... d’autres fonctions.
while (1) { Par contre l’utilisateur averti pourra consulter le manuel MPI cor-
Il est possible d’associer une fonction de traitement des erreurs à un respondantfor (flag=0; ! flag; i=(i+1)%(size-1) ) MPI_Test(&(buffer[i].req), &flag, &status);
à ces fonctions.
communicateur. Les fonctions MPI concernées sont : MPI_Get_count ( &status, MPI_CHAR, &(buffer[i].datasize));
consommer ( buffer[i].data, buffer[i]->datasize);
MPI_Errhandler_create, MPI_Errhandler_set, MPI_Errhandler_free Sous Unix, taper
MPI_Irecv la commande
(buffer[i].data, MAXSIZE,man MPI_Errhandler_create
MPI_CHAR, i, tag, comm, &(buffer[i].req)); par exemple.
}
❑ Pour obtenir un libellé d’erreur explicite, on utilisera MPI_Error_string. }
exemple :
remarquez comment la boucle sur MPI_Test permet de sélectionner une requête ! (on sort lorsque
char buf [ MPI_MAX_ERROR_STRING ] ; int class, err, rlen ; flag vaut vrai)
err = MPI_Recv(...) ;
if ( err != MPI_SUCCESS ) {
MPI_Error_class (err, &class);
MPI_Error_string (err, buf, &rlen );
printf( “je viens d’avoir une erreur non attendue ! %d : %s\n”, class, buf );
}
Hugues Leroy Cours de DEA CH 3.2 / 17 Hugues Leroy Cours de DEA CH 3.2 / 18
Hugues Leroy Cours de DEA CH 3.2 / 19 Hugues Leroy Cours de DEA CH 3.2 / 20