Vous êtes sur la page 1sur 5

MPI et l’environnement

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

MPI_INIT(IERROR) Si dans mon code j’ai écrit :


INTEGER IERROR
main (int argc, char ** argv)
❑ Ce doit être la 1ère routine appelée. (# de PVM)
je devrais donc appeler : MPI_Init (&argc, &argv);

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

Exemple de programme MPI

main ( int argc, char ** argv) {


int err;
err = MPI_Init ( &argc, &argv);
/* test éventuel de err */
if (err != MPI_SUCCESS) { printf(“C vraiment mal parti !\n”);
MPI_Abort(MPI_COMM_WORLD, 10); }
/* programme */
err = MPI_Finalize();
/* test éventuel de err */
}

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

Rang d’un processus


❑ Comment - dans un communicateur donné - identifier les divers processus de
l’application ?
Maintenant que je sais nommer les processus, je peux donc différencier leur
int MPI_Comm_rank (MPI_Comm comm, int *rank) comportement.
MPI_COMM_RANK (COMM, RANK, IERROR) Par exemple :
INTEGER COMM, RANK, IERROR
Si je suis le processus 0 alors je suis le chef, sinon j’attends que mon chef m’envoie
quelque chose pour commencer à travailler...

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 ?

int MPI_Comm_size(MPI_Comm comm, int *size)

MPI_COMM_SIZE(COMM, SIZE, IERROR)


INTEGER COMM, SIZE, IERROR

Hugues Leroy Cours de DEA CH 3.2 / 13 Hugues Leroy Cours de DEA CH 3.2 / 14

Terminaison brutale d’une application MPI


l’exit de C ou le STOP de Fortran, doivent être remplacés par : MPI_Abort a pour effet de terminer l’application en arrêtant aussi tous les autres
processus.
MPI_Abort (MPI_Comm comm, int errorcode) Si on fais seulement : printf(“message d’erreur...”); puis exit(100) par exemple, alors
seul le processus qui exécute le exit() se termine. Les autres continuent ou pire
MPI_ABORT (COMM, ERRCODE, IERROR) peuvent restent bloqués indéfiniment en attente d’un message du processus qui
INTEGER COMM, ERRCODE, IERROR
vient de mourir...
Cette fonction termine tous les processus du communicateur comm.

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

Exercice 1 : Hello World


ATTENTION ! écrire le code :
Notre premier programme MPI
main() {
■ Écrire un programme MPI qui imprime “hello world”. printf(“hello world\n”);
}
■ Compiler (cf annexe 1) puis lancer l’exécution d’un processus sur un seul
processeur. n’est pas écrire un programme MPI, car il manque en effet les appels aux fonctions
MPI_Init() et MPI_Finalize()
■ Lancer l’exécution de plusieurs processus sur plusieurs processeurs en
parallèle.
■ Modifier le programme pour que seul le processus de rang 0 dans
MPI_COMM_WORLD imprime le message.
■ Modifier le programme pour que le nombre de processus participant soit
aussi imprimé.
■ Modifier le programme pour que les processus de rang pair et ceux de
rang impair n’impriment pas le même message.

Hugues Leroy Cours de DEA CH 3.2 / 19 Hugues Leroy Cours de DEA CH 3.2 / 20