Algorithmes Parallèles et Distribués
MPI 1. Introduction à la programmation avec MPI
Camille Coti César Rodríguez Franck Butelle
LIPN, Université Paris 13 Formation Ingénieurs SupGalilée Info 3
04/2021
Transparents préparés par Camille Coti,
Plan
1 Modèle de mémoire Mémoire distribuée Exemples
2 Modèles de communications Passage de messages Mémoire Virtuelle RDMA
3 La norme MPI Introduction
Nommer les processus
Structure d’un programme MPI Un premier programme MPI Lancer l’exécution
Définir une liste de machines Deboguer un code MPI Sémantique
Communications Bloquantes point à point Communications non-bloquantes point à point
4 Documentation
Modèle de mémoire
Plan
1 Modèle de mémoire Mémoire distribuée Exemples
2 Modèles de communications Passage de messages Mémoire Virtuelle RDMA
3 La norme MPI Introduction
Nommer les processus
Structure d’un programme MPI Un premier programme MPI Lancer l’exécution
Définir une liste de machines Deboguer un code MPI Sémantique
Communications Bloquantes point à point
Modèle de mémoire Mémoire distribuée
Vision pratique du concept de Mémoire distribuée
Nœuds de calcul distribuésChaquenœudpossède unbanc mémoire Lui seul peut y accéder
Les nœuds sont reliés par unréseau
Mémoire CPU
NIC
Réseau Mémoire
CPU
NIC
Mémoire CPU
NIC
Mémoire CPU
NIC
Modèle de mémoire Mémoire distribuée
Mise en œuvre
Réseau d’interconnexionDans ce modèle, les nœuds ont accès à unréseau d’interconnexion Tous les nœuds y ont accès
Communications point-à-point sur ce réseau (peut être vu comme un graphe complet)
Espace d’adressage
Chaque processus a accès à sa mémoire propre etuniquement sa mémoire Il nepeut pasaccéder à la mémoire des autres processus
Échange des données : communications point-à-point
C’est au programmeur de gérer les mouvements de données entre les processus
Système d’exploitation
Chaque nœud exécute sa propre instance du système d’exploitation
Modèle de mémoire Mémoire distribuée
Avantages et inconvénients
Avantages
Modèle plus réaliste que PRAM
Meilleur «passage à l’échelle» des machines (plus facile à réaliser) Pas de problème de cohérence de la mémoire
Inconvénients
Plus complexe à programmer
Ï Intervention du programmeur dans le parallélisme Temps d’accès aux données distantes
Modèle de mémoire Exemples
Exemples d’architectures
Cluster of workstationsSolutionéconomique
Composants produits en masse
Ï PC utilisés pour les nœuds
Ï Réseau Ethernet ou haute vitesse (InfiniBand, Myrinet...) Longtemps appelé « le supercalculateur du pauvre »
Modèle de mémoire Exemples
Exemples d’architectures
Supercalculateur massivement parallèle (MPP : Massively Parallel Processor) Solution spécifique
Composants spécifiques
Ï CPU différent de ceux des PC
Ï Réseaux spécifique (parfois propriétaire)
Ï Parfois sans disque dur Coûteux
Modèle de mémoire Exemples
Exemples d’architectures
Exemple : Cray XT5mCPU : deux AMD Istanbul
Ï 6 cœurs chacun
Ï 2 puces par machine
Ï Empilées sur la même socket
Ï Bus : crossbar Pas de disque dur Réseau
Propriétaire : SeaStar Topologie : tore 2D
Connexion directe avec ses 4 voisins Environnement logiciel
OS : Cray Linux Environment Compilateurs, bibliothèques de calcul
Modèles de communications
Plan
1 Modèle de mémoire Mémoire distribuée Exemples
2 Modèles de communications Passage de messages Mémoire Virtuelle RDMA
3 La norme MPI Introduction
Nommer les processus
Structure d’un programme MPI Un premier programme MPI Lancer l’exécution
Définir une liste de machines Deboguer un code MPI Sémantique
Communications Bloquantes point à point Communications non-bloquantes point à point
4 Documentation
Modèles de communications Passage de messages
Implémentation de la communication inter-processus
Passage de messages
Envoi de messagesexpliciteentre deux processus Un processus A envoie à un processus B :
Ï A exécute la primitive :send( dest, &msgptr )
Ï B exécute la primitive :recv( dest, &msgptr )
Les processus émetteur et récepteur doivent exécuter une primitive : de réception pour le récepteur et d’envoi pour l’émetteur
Nommage des processus
On a besoin d’une façon unique de désigner les processus Association adresse / port→portabilité ?
On utilise un no derang de processus, unique, entre 0 et N-1
Modèles de communications Passage de messages
Gestion des données
Tampons des messages
Chaque processus (émetteur et récepteur) a un tampon (buffer) pour le message
La mémoire doit être allouée côté émetteuret côté récepteur
On n’envoie pas plus d’éléments que la taille disponible en émission
Linéarisation des données Les données doivent être sérialisées (marshalling)dans le tampon
On envoie un tampon, un tableau d’éléments, une suite d’octets...
send( P1, &addr )
recv( P0, &addr )
addr addr
P0
P1
Modèles de communications Passage de messages
Communications bilatérales
Communications bilatérales Primitivessend/recv
À toute primitive senddoit correspondre une primitiverecv, et réciproquement Conséquence : quand on échange des données entre deux processus, les deux processus participentactivementà l’échange.
P0
P1
a 2
b 4
a recv(&a,P0) send(&a,P1)
2
b
send(&b,P0) recv(&b,P1)
4
Modèles de communications Passage de messages
Communications bilatérales
Communications bilatérales Primitivessend/recv
À toute primitive senddoit correspondre une primitiverecv, et réciproquement Conséquence : quand on échange des données entre deux processus, les deux processus participentactivementà l’échange.
P0
P1
a 2
b 4 a
recv(&a,P0) send(&a,P1)
?
2
b
send(&b,P0) recv(&b,P1)
4
Modèles de communications Passage de messages
Communications bilatérales
Communications bilatérales Primitivessend/recv
À toute primitive senddoit correspondre une primitiverecv, et réciproquement Conséquence : quand on échange des données entre deux processus, les deux processus participentactivementà l’échange.
P0
P1
a 2
b 4 a
recv(&a,P0) send(&a,P1)
2
b
send(&b,P0) recv(&b,P1)
4
Modèles de communications Passage de messages
Communications bilatérales
Communications bilatérales Primitivessend/recv
À toute primitive senddoit correspondre une primitiverecv, et réciproquement Conséquence : quand on échange des données entre deux processus, les deux processus participentactivementà l’échange.
P0
P1
a 2
b 4 a
recv(&a,P0) send(&a,P1)
2
b
send(&b,P0) recv(&b,P1)
?
4
Modèles de communications Passage de messages
Communications bilatérales
Communications bilatérales Primitivessend/recv
À toute primitive senddoit correspondre une primitiverecv, et réciproquement Conséquence : quand on échange des données entre deux processus, les deux processus participentactivementà l’échange.
P0
P1
a 2
recv(&a,P0) send(&a,P1)
b
send(&b,P0) recv(&b,P1)
4
Modèles de communications Mémoire Virtuelle
Autre modèle : la mémoire virtuelle
Espace d’adressage global
Utilisation d’une mémoire partagée virtuelle : Virtuelle car elle est en fait distribuée ! Support d’uncompilateur spécifique
Ï Traduction des accès aux adresses distantes en communications
Ï Passage de message "caché" à l’utilisateur, géré de façon transparente par l’environnement d’exécution
Opération de transfert de mémoireimplicite(générée par le compilateur) Plus facile à programmer en apparence, maisdifficilesi on veut debonnes performances
Exemples : UPC, CoArray Fortran, Titanium...
Modèles de communications RDMA
Autre modèle : Accès direct à la Mémoire distante
Remote Direct Memory Access
Accès direct à la mémoire distante
Les processusaccèdent directement à la mémoireles unsdes autres
Les processus déposent des données dans la mémoire des autres processus ou vont lire dedans
Opération de transfert de mémoireexplicite(écrite par le programmeur) Nécessité d’un matériel particulier
Gestion de la cohérence mémoire (risque de race conditions) Exemples : InfiniBand, OpenSHMEM
NUMA en réseau
L’interconnexion entre les processeurs et les bancs de mémoire est fait par un réseau à faible latence
La norme MPI
Plan
1 Modèle de mémoire Mémoire distribuée Exemples
2 Modèles de communications Passage de messages Mémoire Virtuelle RDMA
3 La norme MPI Introduction
Nommer les processus
Structure d’un programme MPI Un premier programme MPI Lancer l’exécution
Définir une liste de machines Deboguer un code MPI Sémantique
Communications Bloquantes point à point Communications non-bloquantes point à point
4 Documentation
La norme MPI Introduction
La norme MPI
Message Passing InterfaceNormede factopour la programmation parallèle parpassage de messages Née d’un effort de standardisation
Ï Chaque fabriquant avait son propre langage
Ï Portabilité des applications !
Effort commun entre industriels et laboratoires de recherche (MPI Forum) But : être à la fois portable et offrir de bonnes performances
Implémentations
En C/C++ ou Fortran (mais aussi maintenant en Python, OCaml, Perl,Java,. . .) officielles (logiciels libres) : MPICH, OpenMPI
Fonctions MPI
Interface définie enC, C++, Fortran77 et 90 Listées et documentées dans la norme
La norme MPI Introduction
Historique de MPI
Évolution
Appel à contributions : SC 1992 1994 : MPI 1.0
Ï Communications point-à-point de base
Ï Communications collectives
1995 : MPI 1.1 (clarifications de MPI 1.0) 1997 : MPI 1.2 (clarifications et corrections) 1998 : MPI 2.0
Ï Gestion Dynamique des processus
Ï Accès distant à la mémoire des processus (RDMA) 2008 : MPI 2.1 (clarifications)
2009 : MPI 2.2 (corrections, peu d’additions) 2012 : MPI 3.0 (collectives non bloquantes) 2015 : MPI 3.1 (corrections)
En cours : MPI 4.0
Ï Modèles de programmation hybrides
Ï Tolérance aux pannes
La norme MPI Nommer les processus
Désignation des processus
Communicateur( = ensemble de processus = espace de communication) Les processus communiquant ensemble sont dans un«communicateur»
Ils sont tous dansMPI_COMM_WORLD
Chacun est tout seul dans sonMPI_COMM_SELF MPI_COMM_NULLne contient personne
. . .On peut aussi créer ses propres «communicateurs». . .
Rang ( = identifiant de processus) Les processus sont désignés par unrang
Unique dans un communicateur donné
Ï Rang dansMPI_COMM_WORLD= rang absolu dans l’application Utilisé pour les envois / réception de messages
La norme MPI Structure d’un programme MPI
Structure d’un programme MPI
Début / fin du programme
MPI_Init(&argc, &argv);// Initialisation de la bibliotheque MPI MPI_Finalize (); \ \ \// Terminaison du programme
Si un processus quitte avantMPI_Finalize(), ce sera considéré comme une erreur.
"Ces deux fonctions sontOBLIGATOIRES! ! !
Quelques fonctions utiles
MPI_Comm_size(MPI_COMM_WORLD, &size);//Nbre de ps dans l’application MPI_Comm_rank(MPI_COMM_WORLD, &rank);//Identité (rang) du ps courant
MPI_Get_processor_name(hostname, &len);//Nom de la machine sur laquelle est ce ps, attention réserverMPI_MAX_PROCESSOR_NAMEcaractères.
La norme MPI Un premier programme MPI
Hello World en MPI
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<mpi.h>
45 intmain (intargc,char∗∗ argv) { 6 intsize, rank;
7
8 MPI_Init(&argc, &argv); /∗ Obligatoire ! ∗/
109 MPI_Comm_size(MPI_COMM_WORLD, &size);
11 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
12 printf ("Hello world, I am rank %d in %d\n", rank, size);
13
14 MPI_Finalize(); /∗ Obligatoire ! ∗/
1516 returnEXIT_SUCCESS;
La norme MPI Un premier programme MPI
Hello World en MPI
Compilation : mpicc
Wrapperautour du compilateur C installé Fournit les chemins vers lempi.het la lib MPI
Équivalent à gcc -L/path/to/mpi/lib -lmpi -I/path/to/mpi/include Exemple : mpicc -Wall -o helloworld helloworld.c
La norme MPI Lancer l’exécution
Exécution de l’application MPI
Lancementmpiexec lance les processus sur les machines distantes
Lancement = exécution d’un programme sur la machine distante
Ï Lebinaire doit être accessible de la machine distante Possibilité d’exécuter un binaire différent suivant les rangs
Ï "vrai" MPMD
Transmission des paramètres de la ligne de commande
Redirections
Lesentrées-sortiessontredirigées
stderr, stdout, stdinsont redirigés vers le lanceur MPI-IO pour les I/O
Finalisation
La norme MPI Lancer l’exécution
Exécution de l’application MPI (suite)
Exécution : mpiexec ou mpirun
On fournit une liste de machines (par--hostfile fichierou par-H mach1,mach2,mach3)
Le nombre de processus à lancer (sinon c’est le nbre de machines de la liste)
Exemple ( mpiexec --hostfile ./hostfile -n 4 ./helloworld)
Hello, I am rank 1 in 4 Hello, I am rank 2 in 4 Hello, I am rank 0 in 4 Hello, I am rank 3 in 4
La norme MPI Définir une liste de machines
Définir une liste de machines pour l’application
--hostfile hostfileou--machinefile hostfile
Syntaxe
Si pas de liste fournie : exécution uniquement en local
Possibilité de citer deux fois la même machine pour avoir (au moins) 2 ps sur cette machine
Plus généralement préciser le nombre de slots parslots=
Par défaut (pas d’option slots) on autorise MPI à lancer plusieurs exécutions sur la même machine
Exemple (hostfile) mach1 slots=2 mach2 slots=3 localhost
La norme MPI Deboguer un code MPI
Comment déboguer un programme MPI ?
Séparer les affichages des différents ps dans différents xtermmpirun -n 3 --xterm -1\! monAppli
on peut préciser une liste d’intervalles derrière xterm ou juste -1 pour dire tous. le ! précise de ne pas fermer ces fenêtres même après la fin demonAppli
Enregistrer les affichages dans des fichiers différents (un par ps) mpirun -n 4 --output-filename monFic
Cela va créer monFic.0 monFic.1 monFic.2 et monFic.3
Solutions Open Source
par exemple avec le débogueurgdb(ouvre deux terminaux avec gdb dedans) : mpirun -n 2 xterm -e gdb monAppli
ou encore (un peu plus graphique grâce àddd:) mpirun -n 2 ddd monAppli
Solutions payantes
vrais débogueurs parallèles : ddt, TotalView
mpirun --debug -n 4 monAppli ; ddt -n 4 -start monAppli
La norme MPI Deboguer un code MPI
Comment déboguer un programme MPI ? (suite)
Où s’exécutent les processus ?
mpirun –hostfile hostfile hostname ou encore :
mpirun –report-bindings –hostfile hostfile -n 3 ./demoMPI
"Les contraintes de l’exécution distante
même version de MPI de préférence même user
même répertoire dans lequel se trouve les exécutables pas de parefeu
La norme MPI Sémantique
Terminologie officielle dans la norme
Tout dépends des buffers...
"Sémantique spécifique à MPI
Non bloquant(Immédiat) : une fonction est non bloquante si elle peut retourner avant la fin de l’opération associée et avant que l’utilisateur ne soit autorisé de réutiliser les ressources (buffers).
Bloquant: Une fonction est bloquante si quand elle est retourne l’utilisateur est autorisé à réutiliser les ressources (buffer) spécifiées dans l’appel.
Synchone: La fonction ne retourne que si le receveur commence à recopier le buffer et que l’émetteur peut commencer à réutiliser cebuffer.
Collective: Une fonction est dite collective si TOUS les ps du communicateur concerné doivent appeler cette fonction (peut ne pas être synchrone). Les appels des collectives doivent être faites dans le même ordre par TOUS les ps du groupe.
La norme MPI Communications Bloquantes point à point
Modes de communications Bloquantes dans MPI
Communications Bloquantes Mode standard (détail à suivre)
Mode bufferisé (Buffered) : copie du message dans un buffer qui doit être alloué par le programmeur, pas d’attente.
Mode synchrone (Synchronous) : bloquant et assure transmission faite dans le buffer de réception (mode rendez-vous forcé).
Mode prêt (Ready) : le programmeur doit s’assurer que recv est appelée avant send, évite le surcoût du rendez-vous mais dangereux.
Exemples
Les possibilités d’envoiBloquanten point à point :
MPI_Send() MPI_Bsend() MPI_Ssend() MPI_Rsend()
La norme MPI Communications Bloquantes point à point
Modes de Communication Bloquantes (suite)
Mode standard
Eager(«impatient», souvent pour des petits messages)
Ï L’émetteur envoie le message sur le réseau et retourne dès qu’il a fini (pas vraiment bloqué)
Ï Si le destinataire n’est pas dans unrecv, le message est copié dans un buffer système
Ï Quand le destinataire appellerecv, il commence par regarder dans ses buffers s’il n’a pas déjà reçu
Rendez-vous(souvent pour des gros messages, quasi synchrone)
Ï L’émetteur et le destinataire doivent être dans une communication
Ï Mécanisme de rendez-vous :
F Envoi d’un petit message F Le destinataire acquitte F Envoi du reste du message
Ï L’émetteur ne sort desendque s’il envoyé l’intégralité du mesg., donc que le destinataire est dans unrecv: pas de mise en buffer
C’est l’implémentation de MPI qui décide pour essayer de faire au mieux en terme de buffers. . .
Dans la documentation officielle de MPI ce mode est ditBloquant.
La norme MPI Communications Bloquantes point à point
Communications standard point-à-point
Communications standardBloquantes Envoi :
int MPI_Send(void∗buf,intcount,MPI_Datatypedatatype,intdest,inttag, MPI_Commcomm)
Réception :
int MPI_Recv(void∗buf,intcount,MPI_Datatypedatatype,intorig,inttag, MPI_Commcomm,MPI_Status∗status)
"En général, ces fonctions se comportent automatiquement en mode Eager dans le cas
de petits messages donc sont alors non bloquantes dans le sens commun !
La norme MPI Communications Bloquantes point à point
Communications bloquantes point-à-point standard
Prototypes
Données
buf : tampon d’envoi / réception
count : nombre d’éléments de typedatatype datatype : type de données
Ï Utilisation de types standard MPI ou définir de nouveaux
Ï Assure la portabilité (notamment 32/64 bits, environnements hétérogènes...)
Identification des processus
Utilisation du couple communicateur / rang
En réception : possibilité d’utilisation deMPI_ANY_SOURCE
Ï Après réception, l’émetteur du message est dans status.MPI_SOURCE
Identification de la communication Utilisation du tag
En réception : possibilité d’utilisation deMPI_ANY_TAG
Ï Après réception, le tag du message est dans status.MPI_TAG
La norme MPI Communications Bloquantes point à point
Récupération des informations en réception
Ignorer les infos
Si status pas utile on peut mettre dans l’appel de recvMPI_STATUS_IGNORE
Message trop long !
Si plus d’infos que attendues :MPI_ERR_TRUNCATEest retournée
Récupérer l’émetteur etc
status.MPI_SOURCEdonne le rang de l’émetteur, status.MPI_TAGdonne le Tag reçu,
status.MPI_ERRORl’éventuel code d’erreur.
Recevoir un nbre quelconque de données
int MPI_Probe(intsource,inttag, MPI_Commcomm,MPI_Status∗status)
La norme MPI Communications Bloquantes point à point
Exemple complet de code MPI
Ping-pong entre deux processus 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<mpi.h>
45 intmain(intargc,char∗∗argv ) { 6 intrang, vois;
7 intjeton = 17, recu, tag = 0;
89 MPI_Init( &argc, &argv );
10 MPI_Comm_rank(MPI_COMM_WORLD, &rang );
11 if( 0 == rang ) {
12 vois = 1;
13 // quoi, quelle taille, quel type, à qui, tag, communicateur 14 MPI_Send( &jeton, 1,MPI_INT, vois, tag,MPI_COMM_WORLD);
15 MPI_Recv( &recu, 1,MPI_INT, vois, tag,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
16 }else if( 1 == rang ) {
17 vois = 0;
18 MPI_Recv( &recu, 1,MPI_INT, vois, tag,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
19 MPI_Send( &recu, 1,MPI_INT, vois, tag,MPI_COMM_WORLD);
20 }
21 MPI_Finalize();
2223 returnEXIT_SUCCESS;
24 }
La norme MPI Communications Bloquantes point à point
Ping-pong entre deux processus
Remarques sur ce code
À un envoi correspond toujoursune réception
Ï Même communicateur, même tag
On utilise le rang pour déterminer ce que l’on fait
Ï Rang de l’émetteur et rang du destinataire On envoie des entiers →MPI_INT
Sources d’erreurs fréquentes
Ledatatypedoit êtreidentiqueen émission et en réception (sauf cas très particuliers) Lenombre d’élémentsen réception doit êtreau moinsle nombre en émission
Ï UtiliserMPI_Get_count(status,type,count) pour récupérer le nombre d’éléments reçus Attention à la correspondanceMPI_SendetMPI_Recv
Ï Deadlock si deux Send ou deux recv d’abord !
La norme MPI Communications non-bloquantes point à point
Communications non-bloquantes point-à-point
But
La communication a lieu pendant qu’on fait autre chose Superposition communication/calcul
Plusieurs communications simultanées sans risque de deadlock
Quand on a besoin des données, on attend que la communication soit effectuée complètement
Communications(I=Immediate) Envoi :
int MPI_Isend(void∗buf, int count, MPI_Datatypedatatype,intdest,int tag, MPI_Commcomm,MPI_Request∗request )
Réception :
int MPI_Irecv(void∗buf, int count, MPI_Datatypedatatype,intorig, int tag, MPI_Commcomm,MPI_Request∗request )
Remarque : le param.requestdoit être déclaré avant l’appel et sera utilisé en retour de l’appel pour tester/annuler la requête. . ..
La norme MPI Communications non-bloquantes point à point
Communications non-bloquantes point-à-point
Attente de réalisation de la communicationPour une communication :
int MPI_Wait(MPI_Request∗request,MPI_Status∗status ) Attendre plusieurs communications :MPI_{Waitall,Waitany,Waitsome}
Tester la réalisation Pour une communication :
int MPI_Test(MPI_Request∗request,int∗flag,MPI_Status∗status ) Tester plusieurs communications :MPI_{Testall,Testany,Testsome}
Annuler une communication en cours
Communication non-bloquante identifiée par sarequest int MPI_Cancel(MPI_Request∗request) Différences
La norme MPI Communications non-bloquantes point à point
Détails sur MPI_Waitall
int MPI_Waitall(intcount, MPI_RequesttabRequests[],MPI_Status∗tabStatus);
count: nbre de requêtes à attendre (taille des tableaux tabRequests et tabStatus) tabRequest: peut contenir des éléments àMPI_REQUEST_NULL(ignorés).
tabStatuscontiendra en sortie les résultats (on peut mettre MPI_STATUS_IGNOREà la place).
et les autres
Syntaxe similaire pour les tableaux de requêtes passées àMPI_Testall,MPI_Waitany,...
La commande en ligne man vous donnera toujours plus de détails. . .
La norme MPI Communications non-bloquantes point à point
Exemple d’envoi en non-bloquant
1 #defineMONTAG 1
2 intmain (intargc,char∗∗argv) { 3 intrank,vois;
4 inttoken = 42;
5 MPI_Requestrequest;
6 MPI_Init(&argc, &argv);
7 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
8 vois = 1−rank;
9 switch(rank) {
10 case0:
11 MPI_Isend(&token, 1,MPI_INT, vois, MONTAG,MPI_COMM_WORLD, &request);
12 MPI_Wait(&request,MPI_STATUS_IGNORE);
13 break;
14 case1:
15 token=17 ;/∗ Pour tester ∗/
16 MPI_Irecv(&token, 1,MPI_INT, vois, MONTAG,MPI_COMM_WORLD, &request);
17 printf("ps 1 : avant wait, token=%d\n",token);
18 MPI_Wait(&request,MPI_STATUS_IGNORE);
19 printf("ps 1 : après wait, token=%d\n",token);
20 break;
21 default:
22 break;
23 }
Documentation
Plan
1 Modèle de mémoire Mémoire distribuée Exemples
2 Modèles de communications Passage de messages Mémoire Virtuelle RDMA
3 La norme MPI Introduction
Nommer les processus
Structure d’un programme MPI Un premier programme MPI Lancer l’exécution
Définir une liste de machines Deboguer un code MPI Sémantique
Communications Bloquantes point à point Communications non-bloquantes point à point
4 Documentation
Documentation
Documentation
http ://www.mcs.anl.gov/research/projects/mpi/learning.html (tutoriels, perfs) http ://mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf (la version 3.1 de la norme MPI)