Calcul parallèle avec MPI - Université de Nantes
Transcript of Calcul parallèle avec MPI - Université de Nantes
Calcul parallele avec MPI
Guy Moebs
Laboratoire de Mathematiques Jean Leray,CNRS, Universite de Nantes, Ecole Centrale de Nantes
Mars 2010
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 1 / 221
Plan de la formation
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1DGuy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 2 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 3 / 221
Pourquoi paralleliser ?
I La premiere question a se poser, c’est savoir si laparallelisation de l’application est necessaire
I Ecrire un programme sequentiel est deja du travail, souventdifficile ; la parallelisation le rendra encore plus dur
I Il y a eu beaucoup de progres technologique dans le materielinformatique (processeurs a 3 GHz, bus memoire, ...) mais ilne faut pas compter sur des avancees au meme rythme
I Pourtant il existe toujours des applications scientifiques quiconsomment ”trop” de ressources en temps de processeur ouen memoire
I Pour celles-ci, la seule solution, pour des raisons techniques oueconomiques, reste la parallelisation
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 4 / 221
But de la parallelisation
Qu’est-ce que la parallelisation ?
Ensemble de techniques logicielles et materielles permettantl’execution simultanee de sequences d’instructions independantes,sur des processeurs differents
Benefice de la parallelisation ?
I Execution plus rapide du programme (gain en temps derestitution) en distribuant le travail
I Resolution de problemes plus gros (plus de ressourcematerielle accessible, notamment la memoire)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 5 / 221
But de la parallelisation
1 processeur
4 processeurs
Temps d'execution
I Diminution du temps d’execution – le but
I (Faible) augmentation du temps CPU total - effet de bord
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 6 / 221
Exemple : differences finies
I Probleme de differences finies 1D
I On dispose du vecteur X (0) de taille N et on doit calculerX (T ) selon :
0 < i < N − 1, 0 ≤ t < T : X(t+1)i =
X(t)i−1 + 2X
(t)i + X
(t)i+1
4
Xi
gauche droite
X X X X X X X X0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
N=8
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 7 / 221
Exemple
Algorithme parallele :
I creation de N taches, une par valeur de X
I la tache i dispose de X(0)i et doit calculer X
(1)i , X
(2)i , ..., X
(T )i
I A chaque etape elle doit disposer de X(t)i−1 et X
(t)i+1 en
provenance des taches i − 1 et i + 1 (attention a i = 0 eti = N)
I Travail en 3 etapes pour la tache i :
1. “envoie” sa donnee X(t)i a ces voisines, gauche et droite (si
elles existent)
2. “recoit” X(t)i−1 et X
(t)i+1 en provenance des taches i − 1 et
i + 1 (attention a i = 0 et i = N)
3. utilise ces donnees pour calculer X(t+1)i
I Les N taches travaillent independamment
I Seule contrainte : synchronisation lors des receptions poureffectuer l’etape 3
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 8 / 221
Optimisation de la parallelisation
Execution sur 1 processeur
Execution sur 4 processeurs
Communications inter-processeurs
Temps
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 9 / 221
Optimisation de la parallelisation
Execution sur 1 processeur
Execution sur 4 processeurs
Communications inter-processeurs
Temps
Une parallelisation efficaceminimise les communications
A additionner au temps CPU total
+Temps CPU total =
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 10 / 221
Acceleration et efficacite
I Les deux sont une mesure de la qualite de la parallelisation
I Soit T(p) le temps d’execution sur p processeurs
I L’Acceleration A(p) et l’Efficacite E(p) sont definies commeetant :
A(p) = T(1) / T(p) (p=1, 2, 3, ...)E(p) = A(p) / p
I Pour une acceleration parallele parfaite on obtient :
T(p) = T(1) / pA(p) = T(1) / T(p) = T(1) / ( T(1) / p) = pE(p) = A(p) / p = p / p = 100%
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 11 / 221
Acceleration et efficacite
Accélération
Nombre de processeurs
Courbe
idéale
En pratique
Courbe idéale : 100%
En pratique
Nombre de processeurs
Efficacité
I Les programmes scalables demeurent efficaces pour un grandnombre de processeurs(scalables = passage a l’echelle)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 12 / 221
Scalabilite
⇒ Propriete d’une application a etre executee efficacement sur untres grand nombre de processeurs
⇒ Raisons possibles d’une faible scalabilite :
I La “machine” parallele employee : architecture inadaptee,charge, ...
I Le programme parallelise : analyser le comportement,ameliorer les performances
I un peu des deux ...
Loi d’Amdahl
I Plus une regle qu’une loi
I Principe :
La partie non parallele d’un programmelimite les performances et fixe
une borne superieure a la scalabilite
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 13 / 221
Loi d’Amdahl
I Prenons un exemple avec une parallelisation de l’ordre de 80%du code :
T(1) = T(parallele) + T(sequentiel) = 80 + 20
I Sur p processeurs, on obtient : T(p) = 80 / p + 20
I Quel que soit p, T(p) > 20
I A(p) = T(1) / T(p) = 100 / ( 80 / p + 20 ) < 5
E(p) = ( A(p) / p ) < ( 5 / p )p→+∞−−−−→ 0 !
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 14 / 221
Loi d’Amdahl
0,0 20,0 40,0 60,0 80,0 100,0Pourcentage de code parallelise
1,0
2,0
3,0
4,0
5,0
6,0
7,0
8,0
Acce
lerati
on
P = 2P = 4P = 8
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 15 / 221
Interconnexion
I Pour un programmeur, un point essentiel reside dans le typede memoire de l’architecture cible : memoire partagee oumemoire distribuee
I L’interconnexion a un grand impact sur :- le choix de l’implementation de la parallelisation- la performance parallele- la facilite d’utilisation
I L’application elle-meme, va influer sur la relative importancede ces facteurs
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 16 / 221
Ordinateur a memoire distribuee
I Le systeme est programme en utilisant l’echange de messages
I protocole reseau
envoie
les interconnexion
déplace les donnéesreçoit les
données
dépaquète
les données
données
empaquète
les données
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 17 / 221
Ordinateur a memoire partagee
I Le mouvement des donnees est transparent pour l’utilisateur
I transfert memoire
interconnexion
les
déplace
données
S.M.P. = Symmetric Multi-Processor
(tous les processeurs sont egaux)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 18 / 221
Types de parallelisme
I Parallelisme de tachesPlusieurs traitementsTraitements independants⇒ Echanges de donnees, directives de controleLe parallelisme decoule de la realisation simultanee dedifferents traitements sur les donnees
I Parallelisme de donneesDonnees regulieres et en grand nombreTraitement identique sur chaque donnee⇒ Programmation Data-paralleleLe parallelisme decoule de l’application simultanee dumeme traitement sur des donnees differentes
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 19 / 221
Modeles de programmation : passage de messages
I Les communications sont effectuees en envoyant et enrecevant explicitement les messages
I Les synchronisations sont aussi gerees explicitement
I Le programmeur est completement responsable del’implementation de la parallelisation
I Cela signifie prendre soin de :- la gestion des processus,- l’envoi, la reception des messages,- les synchronisations (e.g. les barrieres)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 20 / 221
Exemple de passage de messages
B C A
Temps
+ =
+
+
+
+
=
=
=
+ =
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 21 / 221
Exemple de passage de messages
MAITRE ESCLAVEcreation des esclaves
(partage B et C)
pour chaque esclaveenvoi (B,C)
fin boucle−→ reception (B,C)
A = B + C
pour chaque esclavereception (A)
fin boucle←− envoi (A)
(assemblage A)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 22 / 221
Passage de messages
⇒ Il existe des bibliotheques pour implementer le passage demessages :
I Message Passing Interface (MPI) (www.mpi-forum.org)⇒ Le standard de facto
I Parallel Virtual Machine (PVM)⇒ Etait la librairie la plus utilisee
⇒ Que peut-on en dire ?
I MPI et PVM sont disponibles gratuitement
I MPI evolue, PVM est figee
I Implementation domaine public
I Les vendeurs de solutions HPC proposent souvent des versionsoptimisees
I De telles versions tirent partie des fonctionnalites desarchitectures
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 23 / 221
Modeles de programmation : memoire partagee
I Les communications sont effectuees de maniere transparente
I Certaines synchronisations sont aussi gerees de manieretransparente
I C’est un tres mauvais synonyme pour parallelisationautomatique faite par le compilateur
I Le but est d’utiliser le compilateur pour implementer leparallelisme decrit a l’aide de directives (encore fournies par leprogrammeur)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 24 / 221
Exemple pour memoire partagee
Un exemple trivial :DO I = 1, N
A(I) = B(I) + C(I)END DO
Le compilateur va effectuer le travail suivant (sur 4 processeurs) :
=+
B C A
Processeur 1
Processeur 2
Processeur 3
Processeur 4
N / 4
N / 4
N / 4
N / 4
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 25 / 221
Memoire partagee
I Ce n’est pas non plus un monde parfait ...
I Les compilateurs ont encore besoin de directives pour les aidermais aussi assurer la portabilite
I OpenMP est un effort pour definir un standard(www.openmp.org)
I En general les compilateurs parallelisent au niveau de la boucle
I Pour assurer des resultats corrects, une analyse fine desdependances des donnees est requise
I Deux problemes majeurs pour les compilateurs :- obtenir toujours la bonne valeur- toute l’information n’est pas connue a la compilation :⇒ considerer l’hypothese la plus defavorable
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 26 / 221
Passage de messages ou memoire partagee ?
⇒ quelques observations ...
Passage de Messages Memoire partagee
Plus long a implementer Plus facile a implementer
Plus de details a prendre en compte Moins de details a gerer
Augmente la taille du code Faible hausse de la taille du code
Plus de maintenance Peu de maintenance
Complexe a deboguer et optimiser Plus facile a deboguer et optimiser
Augmente le volume memoire Usage efficace de la memoire
Offre une scalabilite optimale Scalable, mais ....
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 27 / 221
Modele de programmation hybride
noeud 1 noeud 2
noeud 4noeud 3
noeud 2noeud 1
noeud 3 noeud 4
séquentiel
passage de messages+ mémoire partagée
passage de messages
Performance
Modèle de programmation
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 28 / 221
Modele de programmation hybride
⇒ Deux types de parallelisme :- parallelisme a gros grains (passage de messages)- parallelisme a grains fins (memoire partagee)
communications
mémoire partagée
Programmation parallèle à un niveau Programmation parallèle hybride
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 29 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 30 / 221
Passage de messages : qu’est-ce que c’est ?
I Plusieurs processus executent le meme programme (mais pasforcement les memes parties) ;
0 1 2 3
I Chaque processus dispose de ses propres donnees et n’a pasd’acces direct aux donnees des autres processus ;
I Les donnees du programme sont stockees dans la memoire duprocesseur sur lequel s’execute le processus ;
I Une donnee est echangee entre deux ou plusieurs processusvia un appel a des routines particulieres et specialisees
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 31 / 221
MPI : qu’est-ce que c’est ?
I Message Passing Interface : bibliotheque de passage demessages
I Debut des annees 1990 : chaque constructeur dispose de sapropre implementation de l’echange de messages
I Besoin d’unifier ces modeles pour parvenir a un ensemble deroutines couvrant un large spectre de machines etefficacement implementable
I “Brouillon” presente en Novembre 1993 (Supercomputing ’93)
I ...
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 32 / 221
MPI : qu’est-ce que c’est ?
L’interface avec ces routines definit un standard pratique, portable,efficace, et flexible :
I utilisable par des programmes ecrits en C et Fortran,
I gestion efficace : evite les recopies en memoire et permet lerecouvrement communications / calcul,
I interface supportee par les machines de nombreuxconstructeurs,
I interface proche de l’existant (PVM, ...),
I semantique independante du langage,
I interface concue pour etre thread-safe
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 33 / 221
Passage de messages avec MPI
I Il repose sur l’echange de messages entre les processus pour letransfert de donnees, les synchronisations, les operationsglobales
I La gestion de ces echanges est realisee par MPI (MessagePassing Interface)
I Cet ensemble repose sur le principe du SPMD (SingleProgram Multiple Data)
I Chaque processus dispose de ses propres donnees, sans accesdirect a celles des autres
I Explicite, cette technique est entierement a la charge dudeveloppeur
I Ces echanges qui impliquent deux ou plusieurs processus sefont dans un communicateur
I Chaque processus est identifie par son rang, au sein du groupe
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 34 / 221
Passage de messages avec MPI
On classe les routines de la bibliotheque en plusieurs categories,decrites par la suite ; celles qui traitent de
1. l’environnement MPI ;
2. des communications point a point ;
3. des communications collectives ;
4. des types de donnees derives ;
5. des communicateurs ;
6. des entrees / sorties.
Voyons cela en details ...
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 35 / 221
Environnement MPI
I Initialisation en debut de programme (MPI INIT)INTEGER :: ierr = 0CALL MPI INIT (ierr)
I MPI cree alors un communicateur qui regroupe tous lesprocessus actifs et va gerer leurs echanges de donnees.Le communicateur par defaut s’appelle MPI COMM WORLD
0
1
2
3
45
I Finalisation en fin de programmme (MPI FINALIZE)INTEGER :: ierr = 0CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 36 / 221
Environnement MPI
I Le nombre de processus geres par un communicateur estconnu avec la routine MPI COMM SIZE :INTEGER :: ierr = 0INTEGER :: nbprocsCALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)
I Chaque processus est identifie par son rang, un entier entre 0et la valeur retournee par MPI COMM SIZE -1, fourni par laroutine MPI COMM RANK :INTEGER :: ierr = 0INTEGER :: monrangCALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
I les routines suivantes sont ainsi presentes dans tous lesprogrammes MPI :- MPI INIT ;- MPI FINALIZE ;- MPI COMM SIZE ;- MPI COMM RANK
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 37 / 221
Fichiers d’en-tete
I Un fichier d’entete est toujours necessaire (mpif.h, mpi.h)
I La norme MPI 2 cree des interfaces pour le Fortran 95, leC/C++.
I En Fortran, on dispose dorenavant d’un module quiencapsule :- la declaration des constantes,- la definition des sous-programmes MPI.
I Ce module s’utilise de maniere analogue a tout module, avecl’instruction USE :USE mpi
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 38 / 221
Environnement MPI : TP 1PROGRAM helloUSE mpiIMPLICIT NONE
INTEGER :: nbprocs, monrang, ierr = 0
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
WRITE (6,*) ’Bonjour, je suis le processus de rang ’, &monrang, ’ parmi ’, nbprocs, ’ processus.’
CALL MPI FINALIZE (ierr)END PROGRAM hello
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 39 / 221
Environnement MPI : TP 1
Compilation : (plate-forme dependant !)ifort -O3 tp1.f90 -o tp1.out -lmpi
Execution :mpirun -np 3 ./tp1.out
Bonjour, je suis le processus de rang 2 parmi 3 processus.Bonjour, je suis le processus de rang 0 parmi 3 processus.Bonjour, je suis le processus de rang 1 parmi 3 processus.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 40 / 221
Communications
I Pour realiser des operations impliquant des donnees d’autresprocessus, il est necessaire d’echanger ces informations auxtravers de messages
I Ces messages se font sous la forme de communicationsimpliquant au moins deux processus
I On peut faire une analogie avec le courrier electronique
0
1
2
3
45
Destinataire
Expediteur
DonneeCollecte
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 41 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 42 / 221
Communications point a point
I La communication point a point est une communication entredeux processus :⇒ expediteur et destinataire
I Elle comprend deux operations elementaires : l’envoi et lareception
I Differents ingredients sont necessaires pour composer unmessage- le communicateur- l’identifiant du processus expediteur- l’identifiant du processus destinataire- une etiquette (tag) qui permet au programme de distinguerdifferents messages⇒ ils forment l’enveloppe du message
I Les donnees envoyees sont typees, le message contient aussi :- la donnee a transmettre,- son type, intrinseque ou derive,- sa taille
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 43 / 221
Communications point a pointUSE mpiINTEGER :: monrang, ierr = 0CHARACTER(10) :: messageINTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)IF (monrang == 0) THEN
message = "Salut"CALL MPI SEND (message, len(message), MPI CHARACTER,&
1, 99, MPI COMM WORLD, ierr)ELSE
CALL MPI RECV (message, len(message), MPI CHARACTER,&0, 99, MPI COMM WORLD, status, ierr)
WRITE (6,’(A)’) messageEND IF
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 44 / 221
Communications point a point
I Le processus 0 (monrang = 0) envoie un message auprocessus de rang 1 (monrang = 1) avec l’operation d’envoi :CALL MPI SEND (buf, count, datatype, dest, tag, &
comm, ierr)
I buf, count et datatype constituent le message
I L’enveloppe specifie le destinataire et inclut des informationsutilisables par le destinataire pour selectionner un messageparticulier
I Ainsi c’est l’envoi :- d’un message identifie par tag,- de longueur count,- de type datatype,- a partir de l’adresse buf,- au processus dest,- dans le communicateur comm.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 45 / 221
Communications point a point
I Le processus 1 (monrang = 1) receptionne un message avecl’operation MPI RECV :CALL MPI RECV (buf, count, datatype, src, tag,
comm, status, ierr)I Les trois premiers arguments decrivent le buffer de receptionI Les trois suivants permettent de choisir le message vouluI Le dernier (hors code d’erreur) contient des informations sur
le message juste recuI Important : l’etiquette doit etre la meme pour les deux
processusI Ainsi c’est la reception :
- d’un message identifie par tag,- de longueur count,- de type datatype,- a partir de l’adresse buf,- en provenance du processus src,- dans le communicateur comm
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 46 / 221
I CALL MPI SEND (buf, count, datatype, dest, tag,comm, ierr)
buf IN au choixcount IN entier non negatifdatatype IN objet MPIdest IN entiertag IN entiercomm IN objet MPIierr OUT entier
I CALL MPI RECV (buf, count, datatype, src, tag,comm, status, ierr)
buf OUT au choixcount IN entier non negatifdatatype IN objet MPIsrc IN entiertag IN entiercomm IN objet MPIstatus OUT tableau d’entiersierr OUT entier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 47 / 221
Communications point a point : TP 2
I Taper le programme precedent
I Le compiler
I L’executer sur 2 processus
I L’executer sur 4 processus
I Remarques / Conclusions ?
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 48 / 221
Communications point a point : premier bilan
I MPI SEND (buf,count,datatype,dest,tag,comm,ierr)
I INTEGER, DIMENSION(MPI STATUS SIZE) :: statusMPI RECV (buf, count, datatype, src, tag, comm,
status, ierr)
I Envoi et reception d’une donnee vers un destinataire avecattente de la fin de la communication avant de continuerl’execution
I Un message peut etre recu si on a la correspondance surl’enveloppe (source, tag, comm)
I Securite : on a la donnee envoyee ou recue (resp.) avant dela modifier / l’employer (resp.)
I Inconvenient : attente de la fin de l’operation, voire del’operation elle-meme pour continuer les calculs
I Autres possibilites .... a suivreGuy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 49 / 221
Principaux types de donnees intrinseques : Fortran
I Les types des donnees sont transmis a MPI au travers deconstantes
Type de donnees MPI Type de donnees FortranMPI INTEGER INTEGER
MPI REAL REAL
MPI DOUBLE PRECISION DOUBLE PRECISION
MPI COMPLEX COMPLEX
MPI LOGICAL LOGICAL
MPI CHARACTER CHARACTER(1)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 50 / 221
Principaux types de donnees intrinseques : C
I Les types des donnees sont transmis a MPI au travers deconstantes
Type de donnees MPI Type de donnees CMPI CHAR signed char
MPI SHORT signed short int
MPI INT signed int
MPI LONG signed long int
MPI UNSIGNED CHAR unsigned char
MPI UNSIGNED SHORT unsigned short int
MPI UNSIGNED unsigned int
MPI UNSIGNED LONG unsigned long int
MPI FLOAT float
MPI DOUBLE double
MPI LONG DOUBLE long double
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 51 / 221
Communications point a point : autres possibilites
I On peut recevoir un message de n’importe quelle source :MPI ANY SOURCE⇒ On ne connait pas forcement a la compilation le processusqui va envoyer le message
I On peut recevoir un message muni de n’importe quelleetiquette : MPI ANY TAG⇒ On ne connait pas forcement a la compilation l’ordred’arrivee des messages
I L’argument status des receptions contient la bonne etiquetteet le rang de l’expediteur
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 52 / 221
Communications point a point : autres possibilites
I On peut envoyer un message a un processus n’existant pas :MPI PROC NULL⇒ Cela permet d’eviter des tests fastidieux (conditions auxlimites, ...)
I On peut envoyer des messages dont le contenu n’est pas unedonnee de type intrinseque, on utilise les types derives (voirplus loin)
I On peut effectuer un envoi et une reception en une seulecommunication : MPI SENDRECV
I On peut echanger des donnees en une seule communication :MPI SENDRECV REPLACE
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 53 / 221
Communications point a point : echanges
I L’echange combine l’envoi d’un message vers un processus etla reception d’un autre message d’un autre processus
I Ces deux processus peuvent etre les memes
I Les buffers et les types peuvent etre differents
I MPI SENDRECV ( &sendbuf, sendcount, sendtype, dest, sendtag, &recvbuf, recvcount, recvtype, src , recvtag, &comm, status, ierr)
I Fonction tres utile pour des operations dans une chaıne deprocessus
I Attention a l’usage : envoi et reception bloquants
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 54 / 221
Communications point a point : echanges
I Remplacement des contenus des buffers entre deux processus :
I MPI SENDRECV REPLACE ( &buf, count, datatype, dest, &sendtag, src, recvtag, &comm, status, ierr)
I Le meme buffer est employe pour l’envoi et la reception
I L’implementation gere le stockage intermediaire additionnel
I Attention a l’usage : envoi et reception bloquants
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 55 / 221
Communications point a point : TP 3USE mpiINTEGER, DIMENSION(MPI STATUS SIZE) :: statusINTEGER, PARAMETER :: tag = 100INTEGER :: ierr = 0INTEGER :: u, v, monrang, nbprocs, suiv, precCALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)suiv = mod (monrang+1, nbprocs)prec = mod (nbprocs+monrang-1,nbprocs)v = 0u = 100 + monrangCALL MPI SENDRECV (u, 1, MPI INTEGER, suiv, tag, &
v, 1, MPI INTEGER, prec, tag, &MPI COMM WORLD, status, ierr)
write (6,*) ’processus ’, monrang, ’ u = ’, u, ’ v = ’, vCALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 56 / 221
Communications point a point : TP 3
I Taper le programme precedent
I Le compiler
I L’executer sur 2 processus
I L’executer sur 4 processus
I Remarques / Conclusions ?
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 57 / 221
Communications point a point
I Toutes les communications se font simultanement
I Attention : tous les processus commencent par envoyer,aucun n’est en reception !
I Risque de blocage (deadlock) selon l’implementationsous-jacente de MPI SEND !
I Selon les cas, on peut etre amene a privilegier les routinesMPI SEND et MPI RECV
I TP 4 : ecrire un programme analogue au precedent a l’aidedes deux routines MPI SEND et MPI RECV sans risque dedeadlock
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 58 / 221
Optimisation des communications point a point
I Important d’optimiser les communications : gain en perf.⇒ Minimiser le temps passe a faire autre chose que descalculs (i.e. l’overhead)
I Differentes possibilites :- recouvrir les communications par des calculs- eviter la recopie du message dans une zone memoiretemporaire- minimiser les surcouts dus aux appels repetes aux routinesde communications
I Differents types de communication :- communications standards- communications synchrones- communications bufferisees- communications persistantes.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 59 / 221
Communications standards
I CALL MPI SEND (buf, count, datatype, dest, tag, &comm, ierr)
I CALL MPI RECV (buf, count, datatype, src, tag, &comm, status, ierr)
I Communication telle que la reception n’a lieu que si lemessage envoye est arrive (communication bloquante)
I Ceci est assure (pour l’expediteur) soit :- par bufferisation : recopie du message dans un buffer ;- par synchronisation : avant de continuer le calcul apres unenvoi, on attend que la reception correspondante soitinitialisee
I C’est le cas des routines MPI SEND et MPI RECVI Le MPI SEND devient bloquant lorsque le message est trop
gros pour le bufferiser.Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 60 / 221
Communications synchrones
I Communication synchrone :avant de continuer le calcul apres un envoi, on attend que lareception correspondante soit initialisee ; il n’y a pas de“bufferisation”
I CALL MPI SSEND (buf, count, datatype, dest, tag,&comm, ierr)
I La completion ne peut se faire que si la reception a ete postee(i.e. prete)
I La completion d’un MPI SSEND indique donc que :- la donnee envoyee est a nouveau disponible (i.e. modifiable),- la reception a commence
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 61 / 221
Communications bufferisees
I Le message est recopie dans un buffer avant d’etre envoye
I Cette operation peut etre commencee (et terminee) sans quela reception correspondante ne soit prete
I CALL MPI BSEND (buf, count, datatype, dest, tag,&comm, ierr)
I Les allocations des buffers memoire MPI sont gerees avecMPI BUFFER ATTACH (buffer, size, ierr)MPI BUFFER DETACH (buffer, size, ierr)
I Le buffer est alloue dans la memoire locale du processusexpediteur
I Le buffer est uniquement utilisable pour les messagesbufferises
I Un seul buffer alloue a la fois par processusGuy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 62 / 221
Communications persistantes
I Dans le cas de boucles contenant des communications avec lameme liste d’arguments :⇒ repetition des communications
I Lier cette liste d’arguments a une operation decommunication une seule fois
I Utiliser et re-utiliser cette operation pour initier et effectuerles communications
I Permet de reduire la latence (temps pris pour initialiser unecommunication) ; cela depend de l’implementation et del’interconnexion sous-jacente
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 63 / 221
Communications persistantes
I Une routine pour initier l’envoi :CALL MPI SEND INIT (buf, count, datatype, dest, &
tag, comm, request, ierr)
I Une routine pour initier la reception :CALL MPI RECV INIT (buf, count, datatype, src , &
tag, comm, request, ierr)
I L’argument request identifie la communicationINTEGER :: request
I Une routine pour effectuer l’operation (dans la boucle) :CALL MPI START (request, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 64 / 221
Communications asynchrones
I Le programme continue avant l’initialisation de la receptioncorrespondante⇒ Cela permet de calculer pendant le transfert
I CALL MPI ISEND (buf, count, datatype, dest, tag,&comm, request, ierr)
I CALL MPI IRECV (buf, count, datatype, src , tag,&comm, request, ierr)
I L’argument request permet d’identifier les operations decommunications impliquees et de les faire correspondre
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 65 / 221
Communications asynchrones
I Les commandes associees pour tester :
I CALL MPI WAIT (request, status, ierr)⇒ Attendre jusqu’a la terminaison d’une requete
I CALL MPI TEST (request, flag, status, ierr)⇒ Verifier si une requete est terminee (flag = .TRUE.)
I CALL MPI PROBE (source, tag, status, comm, ierr)⇒ Controler avant reception si une requete est arriveeVersion non bloquante : MPI IPROBE
I Il existe des variantes des communications precedentes enmode asynchrone
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 66 / 221
Bilan des routines disponibles
I Communications usuelles
Envois
MPI SEND bloquant standard
MPI ISEND non bloquant standard
MPI SSEND bloquant synchroneMPI ISSEND non bloquant synchroneMPI BSEND bloquant bufferiseMPI IBSEND non bloquant bufferise
Receptions
MPI RECV bloquante standard
MPI IRECV non bloquante standard
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 67 / 221
Bilan des routines disponibles
I Communications persistantes
Envois
MPI SEND INIT bloquant standard
MPI SSEND INIT bloquant non bufferise
MPI BSEND INIT bloquant bufferise
Reception
MPI RECV INIT bloquante standard
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 68 / 221
Communications point a point : TP 5USE mpiINTEGER :: nprocs, rang, ierr = 0INTEGER, DIMENSION(MPI STATUS SIZE) :: statusINTEGER, PARAMETER :: na = 513, nb = 513INTEGER, PARAMETER :: m = 2049, tag = 100REAL*8, DIMENSION(na,na) :: aREAL*8, DIMENSION(nb,nb) :: b, dREAL*8, DIMENSION(na) :: pivotaREAL*8, DIMENSION(nb) :: pivotbREAL*8, DIMENSION(m,m) :: c
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, rang, ierr)CALL random number (a)CALL random number (b)CALL random number (c)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 69 / 221
Communications point a point : TP 5IF (rang == 0) THEN
! j’envoie un gros messageCALL MPI SEND (c(1,1), m*m, MPI DOUBLE PRECISION,&
1, tag, MPI COMM WORLD, ierr)
! je calcule la factorisation LU avec lapackCALL DGETRF (na, na, a, na, pivota, ierr)
! ce calcul modifie le contenu du tableau cc(1:nb,1:nb) = matmul (a(1:nb,1:nb), b)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 70 / 221
Communications point a point : TP 5ELSE IF (rang == 1) THEN
! je calculeCALL DGETRF (na, na, a, na, pivota, ierr)
! je recois le gros messageCALL MPI RECV (c(1,1), m*m, MPI DOUBLE PRECISION,&
0, tag, MPI COMM WORLD, status, ierr)
! ce calcul est independant du messageCALL DGETRF (nb, nb, b, nb, pivotb, ierr)
! ce calcul depend du message precedenta(:,:) = transpose ( c(1:na,1:na) ) + a(:,:)
END IFCALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 71 / 221
Communications point a point : TP 5
I Compiler le programme standardifort -xS -O3 tp5.f90 -Vaxlib -lmpi -lmkl intel lp64-lmkl sequential -lmkl core -o tp5.out
I L’executer sur 2 processus
I Mettre des communications synchrones
I L’executer sur 2 processus
I Mettre des communications asynchrones
I L’executer sur 2 processus
I Remarques / Conclusions ?
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 72 / 221
Quelques regles simples ... selon les situations
I Initier les receptions avant les envois⇒ En cas d’echange, mettre les appels a MPI IRECV avantles MPI SEND
I Eviter l’usage de bufffers temporaires⇒ Utiliser les routines synchrones MPI SSEND
I Recouvrir les communications par des calculs⇒ Utiliser des communications non bloquantes MPI ISENDet MPI IRECV
I Minimiser les surcouts lies a des appels repetes avec lesmemes arguments⇒ Utiliser des communications persistantes
N.B. : les performances des differents types de communicationpoint a point sont dependantes des implementations MPI.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 73 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 74 / 221
Communications collectives
I La communication collective est une communication quiimplique un ensemble de processus, tous ceux ducommunicateur fourni en argument⇒ C’est un argument essentiel
I En une seule operation, on effectue une serie decommunications point a point
I L’ensemble des processus effectuent le meme appel avec desarguments correspondants
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 75 / 221
Communications collectives
I La semantique et la syntaxe des operations collectives sontanalogues a celles des communications point a point
I Il n’y a pas d’etiquette dans les appels a ces routines
I Certaines routines ont un processus qui est seul expediteur ouseul destinataire :⇒ il s’appelle le processus root
I Certains arguments n’ont alors de sens que pour le processusroot
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 76 / 221
Communications collectives
Il existe differents types de communication collective :
Operations de diffusion / collecte de donnees
I Diffusion globale de donnees : MPI BCAST
I Distribution selective de donnees : MPI SCATTER
I Collecte de donnees reparties : MPI GATHER
I Collecte, par tous les processus, de donnees reparties :MPI ALLGATHER
I Distribution selective, par tous les processus, de donneesreparties : MPI ALLTOALL
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 77 / 221
Communications collectives
Operations prealables sur des donnees reparties
I Operation de reduction : MPI REDUCE
I Operation de reduction avec diffusion globale du resultat :MPI ALLREDUCE
Barrieres de synchronisation globale
I CALL MPI BARRIER (comm, ierr)
I Chaque processus appelant est bloque jusqu’a ce que tous lesprocessus du communicateur font l’appel
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 78 / 221
Diffusion globale de donnees
I CALL MPI BCAST(buf,count,datatype,root,comm,ierr)
I Le processus root envoie un message :a tous les processus du communicateur comm,de longueur count,de type datatype,a partir de l’adresse buf
P0
P1
P2
P3
P0
P1
P2
P3
A
A
A
A
A
MPI_BCAST
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 79 / 221
Diffusion globale de donnees
PROGRAM bcastUSE mpiIMPLICIT NONEINTEGER :: ierr = 0INTEGER :: u, monrang, nbprocs
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
IF (monrang == 0) READ (5,*) uCALL MPI BCAST(u, 1, MPI INTEGER, 0, MPI COMM WORLD,&
ierr)
write (6,*) ’processus ’, monrang, ’ u = ’, ucall MPI FINALIZE (ierr)END PROGRAM bcast
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 80 / 221
Diffusion globale de donnees
L’appel a la routine MPI BCAST permet d’eviter :
IF (monrang == 0) THENDO i = 0, nbprocs - 1
CALL MPI SEND (u, 1, MPI INTEGER, i, tag, &MPI COMM WORLD, ierr)
END DOEND IF
CALL MPI RECV (u, 1, MPI INTEGER, 0, tag, &MPI COMM WORLD, status, ierr)
Execution : echo 10 | mpirun -np 3 ./bcast.outprocessus 0 u = 10processus 2 u = 10processus 1 u = 10
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 81 / 221
Distribution selective de donnees
I CALL MPI SCATTER(sendbuf, sendcount, sendtype, &recvbuf, recvcount, recvtype, &root, comm, ierr)
I Le processus root envoie un message etant :de longueur sendcount,de type sendtype,a partir de l’adresse sendbuf,a chacun des processus du communicateur comm
I Chaque processus du communicateur comm (root inclus)indique recevoir un message :de longueur recvcount,de type recvtype,a partir de l’adresse recvbuf
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 82 / 221
Distribution selective de donnees
L’action de la routine MPI SCATTER peut etre vue comme
I La donnee initiale est partagee en n morceaux contigus detaille identique :⇒ le ieme morceau est envoye au ieme processus
I Les arguments relatifs a la donnee envoyee n’ont de sens quepour le processus root
P0
P1
P2
P3
P0
P1
P2
P3
A0 A3A2A1
A0
A1
A2
A3
MPI_SCATTER
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 83 / 221
Distribution selective de donnees
La routine MPI SCATTER peut etre vue comme
(i) le processus root effectue n envois :CALL MPI SEND(sendbuf+i.sendcount.extent(sendtype),&
sendcount, sendtype, i, ...)
(ii) et chaque processus (root inclus) du communicateur executela reception suivante :CALL MPI RECV (recvbuf, recvcount, recvtype, &
root, ...)
I extent(sendtype) = MPI TYPE EXTENT(sendtype) :le nombre d’octets en memoire
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 84 / 221
Distribution selective de donnees
USE mpiINTEGER, PARAMETER :: nb valeurs = 128INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0REAL(4),ALLOCATABLE,DIMENSION(:) :: valeurs,donnees
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
lbloc = nb valeurs / nbprocsALLOCATE (donnees(lbloc), STAT=ierr )IF (monrang == 3) THENALLOCATE (valeurs(nb valeurs), STAT=ierr )valeurs(:) = (/(1000.0 4+REAL(i,4),i=1,nb valeurs)/)END IF
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 85 / 221
Distribution selective de donnees
CALL MPI SCATTER (valeurs, lbloc, MPI REAL, &donnees, lbloc, MPI REAL, 3, &MPI COMM WORLD, ierr)
WRITE (6,*) ’processus ’, monrang, ’ a recu ’, &donnees(1), ’ a ’, donnees(lbloc), &’ du processus 3’
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 86 / 221
Distribution selective de donnees
ifort -O3 scatter.f90 -o scatter.out -lmpi
mpirun -np 4 ./scatter.outprocessus 3 a recu 1097. a 1128. du processus 3processus 1 a recu 1033. a 1064. du processus 3processus 2 a recu 1065. a 1096. du processus 3processus 0 a recu 1001. a 1032. du processus 3
mpirun -np 5 ./scatter.outprocessus 1 a recu 1026. a 1050. du processus 3processus 2 a recu 1051. a 1075. du processus 3processus 3 a recu 1076. a 1100. du processus 3processus 4 a recu 1101. a 1125. du processus 3processus 0 a recu 1001. a 1025. du processus 3
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 87 / 221
Distribution selective de donnees
I L’affichage ne se fait pas forcement dans l’ordre des rangs
I Attention : Toutes les valeurs ne sont pas distribuees si lenombre de destinataires n’est pas un diviseur du nombre dedonnees a envoyer : il faut gerer l’eventuel reliquat
I On peut etre amene a gerer des paquets de taille variable
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 88 / 221
Distribution selective de donnees
La routine MPI SCATTERV etend les possibilites aux distributionsnon uniformes.
I CALL MPI SCATTERV ( &sendbuf, sendcounts, displs, sendtype,&recvbuf, recvcount, recvtype, &root, comm, ierr)
I L’argument sendcounts est un tableau d’entiers avec lenombre d’elements par destinataire
I L’argument displs est un tableau d’entiers qui contient ledecalage a partir du debut du buffer pour chaque paquet (afournir en entree)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 89 / 221
Distribution selective de donnees
Ainsi l’action de la routine MPI SCATTERV peut etre vue comme
(i) le processus root effectue n envois :CALL MPI SEND(sendbuf+displs[i].extent(sendtype),&
sendcounts[i], sendtype, i, ...)
(ii) et chaque processus (root inclus) du communicateur executela reception suivante :CALL MPI RECV (recvbuf, recvcount, recvtype, &
root, ...)
I extent(sendtype) = MPI TYPE EXTENT(sendtype) :le nombre d’octets en memoire
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 90 / 221
Collecte de donnees reparties
Chaque processus envoie son buffer au processus root :⇒ operation inverse de MPI SCATTER
I CALL MPI GATHER (sendbuf, sendcount, sendtype, &recvbuf, recvcount, recvtype, &root, comm, ierr)
I Chaque processus (root inclus) du communicateur commindique envoyer un message :au processus root,de longueur sendcount, de type sendtype,a partir de l’adresse sendbuf
I Le processus root recoit ces messages et les concatene dansl’ordre des rangs, chacun etant :de longueur recvcount,de type recvtype,a partir de l’adresse recvbuf
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 91 / 221
Collecte de donnees reparties
L’action de la routine MPI GATHER peut etre vue commeI Chaque processus envoie un ensemble de donnees, de nature
compatibleI Le processus root effectue n receptions :⇒ Le morceau du ieme processus va en ieme position
I N.B. : les arguments relatifs a la donnee recue n’ont de sensque pour le processus root
P0
P1
P2
P3
P0
P1
P2
P3
MPI_GATHER
A0
A1
A2
A3
A1A0 A3A2
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 92 / 221
Collecte de donnees reparties
La routine MPI GATHER peut etre vue comme
(i) chaque processus (root inclus) du communicateur effectuel’envoi :CALL MPI SEND (sendbuf, sendcount, sendtype, &
root, ...)
(ii) et le processus root effectue n receptions :CALL MPI RECV(recvbuf+i.recvcount.extent(recvtype),&
recvcount, recvtype, i, ...)
I extent(recvtype) = MPI TYPE EXTENT(recvtype) :le nombre d’octets en memoire
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 93 / 221
Collecte de donnees reparties
USE mpiINTEGER, PARAMETER :: nb valeurs = 128INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0INTEGER, ALLOCATABLE,DIMENSION(:) :: valeurs, donnees
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
lbloc = nb valeurs / nbprocsALLOCATE (valeurs(lbloc), STAT=ierr )valeurs(:) = (/(1000+i+lbloc*monrang,i=1,lbloc)/)write (6,*) ’processus ’, monrang, ’ possede ’, &
valeurs(1), ’ a ’, valeurs(lbloc)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 94 / 221
Collecte de donnees reparties
IF (monrang == 2) &ALLOCATE (donnees(nb valeurs), STAT=ierr)
CALL MPI GATHER (valeurs, lbloc, MPI INTEGER, &donnees, lbloc, MPI INTEGER, 2, &MPI COMM WORLD, ierr)
IF (monrang == 2) &WRITE (6,*) ’processus 2 a recu ’, donnees(1), &
’...’, donnees(lbloc+1), ’...’, &donnees(nb valeurs)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 95 / 221
Collecte de donnees repartiesifort -O3 gather.f90 -o gather.out -lmpi
mpirun -np 4 ./gather.outprocessus 2 possede 1065 a 1096processus 1 possede 1033 a 1064processus 3 possede 1097 a 1128processus 0 possede 1001 a 1032processus 2 a recu 1001 ... 1033 ... 1128
mpirun -np 3 ./gather.outprocessus 0 possede 1001 a 1042processus 1 possede 1043 a 1084processus 2 possede 1085 a 1126processus 2 a recu 1001 ... 1043 ... -370086
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 96 / 221
Collecte de donnees reparties
I L’affichage ne se fait pas forcement dans l’ordre des rangs
I Attention : Toutes les valeurs ne sont pas initialisees ettransmises correctement si le nombre d’expediteurs n’est pasun diviseur du nombre de donnees a envoyer
I On peut etre amene a gerer des paquets de taille variable
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 97 / 221
Collecte de donnees reparties
La routine MPI GATHERV etend les possibilites aux collectes nonuniformes.
I CALL MPI GATHERV ( &sendbuf, sendcount, sendtype, &recvbuf, recvcounts, displs, recvtype,
&root, comm, ierr)
I L’argument recvcounts est un tableau d’entiers avec le nombred’elements par expediteur
I L’argument displs est un tableau d’entiers qui contient ledecalage a partir du debut du buffer pour placer chaquepaquet dans le buffer de root (a fournir en entree)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 98 / 221
Collecte de donnees reparties
Ainsi l’action de la routine MPI GATHERV peut etre vue comme
(i) chaque processus (root inclus) du communicateur effectuel’envoi :CALL MPI SEND (sendbuf, sendcount, sendtype,&
root, ...)
(ii) et le processus root execute n receptions :CALL MPI RECV(recvbuf+displs[i].extent(recvtype),&
recvcounts[i], recvtype, i, ...)
I extent(recvtype) = MPI TYPE EXTENT(recvtype) :le nombre d’octets en memoire
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 99 / 221
Collecte, par tous les processus, de donnees reparties
La routine MPI ALLGATHER peut etre vue comme MPI GATHERou tous les processus sont destinataires du resultat et non pasuniquement le processus root
I CALL MPI ALLGATHER(sendbuf, sendcount, sendtype,&recvbuf, recvcount, recvtype,&comm, ierr)
I Chaque processus du communicateur comm indique envoyerun message :de longueur sendcount, de type sendtype,a partir de l’adresse sendbuf
I Chaque processus recoit ces messages et les concatene dansl’ordre des rangs, chacun etant :de longueur recvcount, de type recvtype,a partir de l’adresse recvbuf
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 100 / 221
Collecte, par tous les processus, de donnees reparties
Un appel a la routine MPI ALLGATHER peut etre vu comme :
I Tous les processus effectuent un appel a MPI GATHERCALL MPI GATHER (sendbuf, sendcount, sendtype, &
recvbuf, recvcount, recvtype, &root, comm, ierr),
I Tous les processus effectuent un appel a MPI BCAST⇒ Meme processus root !CALL MPI BCAST (recvbuf, recvcount, recvtype, &
root, comm, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 101 / 221
Collecte, par tous les processus, de donnees reparties
P0
P1
P2
P3
P0
P1
P2
P3
A0
A1
A2
A3
A1A0 A3A2
A0
A0
A0
A1
A1
A1
A2
A2
A2
A3
A3
A3
MPI_ALLGATHER
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 102 / 221
Collecte, par tous les processus, de donnees reparties
USE mpiINTEGER, PARAMETER :: nb valeurs = 128INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0INTEGER,ALLOCATABLE,DIMENSION(:) :: valeurs, donnees
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
lbloc = nb valeurs / nbprocsALLOCATE (valeurs(lbloc), donnees(nb valeurs) )valeurs(:) = (/(1000+i+lbloc*monrang,i=1,lbloc)/)write (6,*) ’processus ’, monrang, ’ possede ’, &
valeurs(1), ’ a ’, valeurs(lbloc)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 103 / 221
Collecte, par tous les processus, de donnees reparties
CALL MPI ALLGATHER (valeurs, lbloc, MPI INTEGER, &donnees, lbloc, MPI INTEGER, &MPI COMM WORLD, ierr)
WRITE (6,*) ’processus ’, monrang, ’ a recu ’, &donnees(1), ’...’, donnees(lbloc+1), &’...’, donnees(nb valeurs)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 104 / 221
Collecte, par tous les processus, de donnees reparties
ifort -O3 allgather.f90 -o allgather.out -lmpi
mpirun -np 2 ./allgather.outprocessus 0 possede 1001 a 1064processus 0 a recu 1001 ... 1065 ... 1128processus 1 possede 1065 a 1128processus 1 a recu 1001 ... 1065 ... 1128
mpirun -np 3 ./allgather.outprocessus 0 possede 1001 a 1042processus 2 possede 1085 a 1126processus 1 possede 1043 a 1084processus 0 a recu 1001 ... 1043 ... -370086processus 1 a recu 1001 ... 1043 ... -370086processus 2 a recu 1001 ... 1043 ... -370086
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 105 / 221
Collecte, par tous les processus, de donnees reparties
I L’affichage ne se fait pas forcement dans l’ordre des rangs
I Attention : Toutes les valeurs ne sont pas initialisees ettransmises correctement si le nombre d’expediteurs n’est pasun diviseur du nombre de donnees a envoyer :il faut gerer l’eventuel reliquat
I On peut etre amene a gerer des paquets de taille variable
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 106 / 221
Collecte, par tous les processus, de donnees reparties
La routine MPI ALLGATHERV peut etre vue commeMPI GATHERV ou tous les processus sont destinataires duresultat et non pas que le processus root
I CALL MPI ALLGATHERV (&sendbuf, sendcount, sendtype, &recvbuf, recvcounts, displs, recvtype,&comm, ierr)
I L’argument recvcounts est un tableau d’entiers avec le nombred’elements par destinataire
I L’argument displs est un tableau d’entiers qui contient ledecalage a partir du debut du buffer pour placer chaquepaquet dans le buffer de root
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 107 / 221
Collecte, par tous les processus, de donnees reparties
Un appel a la routine MPI ALLGATHERV peut etre vu comme si :
I Tous les processus effectuent un appel a MPI GATHERVCALL MPI GATHERV (&
sendbuf, sendcount, sendtype, &recvbuf, recvcounts, displs, recvtype,&root, comm, ierr)
I Tous les processus effectuent un appel a MPI BCAST⇒ Meme processus root !CALL MPI BCAST (recvbuf, recvcount, datatype, &
root, comm, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 108 / 221
Distribution selective, par tous les processus, de donneesreparties
La routine MPI ALLTOALL est une extension deMPI ALLGATHER dans le cas ou chaque processus envoie desdonnees distinctes a chacun des destinataires
I CALL MPI ALLTOALL (sendbuf, sendcount, sendtype,&recvbuf, recvcount, recvtype,&comm, ierr)
I Chaque processus envoie un message etant :de longueur sendcount, de type sendtype,a partir de l’adresse sendbuf,a chacun des processus du communicateur comm
I Chaque processus du communicateur comm indique recevoirun message :de longueur recvcount, de type recvtype,a partir de l’adresse recvbuf,de chacun des processus du communicateur comm
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 109 / 221
Distribution selective, par tous les processus, de donneesreparties
I Tous les arguments sont significatifs pour tous les processus
Un appel a la routine MPI ALLTOALL peut etre vu comme si tousles processus effectuent n envois et n receptions distincts
CALL MPI SEND(sendbuf+i.sendcount.extent(sendtype),sendcount, sendtype, i, ...)
CALL MPI RECV(recvbuf+j.recvcount.extent(recvtype),recvcount, recvtype, j, ...)
Le jeme bloc du ieme processus est envoye au jeme processus etplace dans son ieme bloc
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 110 / 221
Distribution selective, par tous les processus, de donneesreparties
P0
P1
P2
P3
P0
P1
P2
P3
A0
MPI_ALLTOALL
A1 A2 A3
B0 B1 B2 B3
B0A0
A1
A2
A3
B1
B2
B3
C2
D2 D3
C0
C1
C2
C3D0 D1
C3C1C0
D0
D1
D2
D3
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 111 / 221
Distribution selective, par tous les processus, de donneesreparties
USE mpi
INTEGER, PARAMETER :: nb valeurs = 4INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0INTEGER, DIMENSION(nb valeurs) :: valeurs, donnees
CALL MPI INIT (ierr)CALL MPI COMM SIZE (MPI COMM WORLD, nbprocs, ierr)CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 112 / 221
Distribution selective, par tous les processus, de donneesreparties
lbloc = nb valeurs / nbprocsvaleurs(1:nb valeurs) = &(/(1000+i+lbloc*monrang*100, i=1,nb valeurs)/)
write (6,*) ’processus ’, monrang, ’ avant ’, &valeurs(1:nb valeurs)
CALL MPI ALLTOALL (valeurs, lbloc, MPI INTEGER, &donnees, lbloc, MPI INTEGER, &MPI COMM WORLD, ierr)
write (6,*) ’processus ’, monrang, ’ apres ’, &donnees(1:nb valeurs)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 113 / 221
Diffusion selective, par tous les processus, de donneesreparties
ifort -O3 alltoall.f90 -o alltoall.out -lmpi
mpirun -np 4 ./alltoall.out
processus 0 avant 1001, 1002, 1003, 1004processus 1 avant 1101, 1102, 1103, 1104processus 2 avant 1201, 1202, 1203, 1204processus 3 avant 1301, 1302, 1303, 1304
processus 0 apres 1001, 1101, 1201, 1301processus 1 apres 1002, 1102, 1202, 1302processus 2 apres 1003, 1103, 1203, 1303processus 3 apres 1004, 1104, 1204, 1304
I L’affichage ne se fait pas forcement dans l’ordre des rangs
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 114 / 221
Distribution selective, par tous les processus, de donneesreparties
La routine MPI ALLTOALLV ajoute de la flexibilite aMPI ALLTOALL dans les tailles et adresses de localisation dans lesbuffers d’envoi et de reception
I CALL MPI ALLTOALLV (&sendbuf, sendcounts, sdispls, sendtype, &recvbuf, recvcounts, rdispls, recvtype, &comm, ierr)
I Les arguments sendcounts et recvcounts sont des tableauxd’entiers contenant les nombres d’elements par expediteur etdestinataire
I Les arguments sdispls et rdispls sont des tableaux d’entiers quicontiennent les decalages a partir du debut du buffer pourplacer chaque paquet dans les buffers de chaque processus
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 115 / 221
Distribution selective, par tous les processus, de donneesreparties
Un appel a la routine MPI ALLTOALLV peut etre vu comme sitous les processus effectuent n envois et n receptions distincts avecdes blocs de taille differente :
CALL MPI SEND(sendbuf+i.sdispls[i].extent(sendtype),&sendcounts[i], sendtype, i, ...)
CALL MPI RECV(recvbuf+j.rdispls[j].extent(recvtype),&recvcounts[j], recvtype, j, ...)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 116 / 221
Operations prealables sur des donnees reparties
Ces fonctions realisent une operation globale de reduction, i.e.l’obtention d’un resultat a partir de donnees reparties
I CALL MPI REDUCE (sendbuf, recvbuf, count, &datatype, op, root, comm, ierr)
I Depuis tous les processus du communicateur comm, on envoieun message :de longueur count, de type datatype,a partir de l’adresse sendbuf,pour faire l’operation op sur ces valeurs.⇒ Reception du resultat a partir de l’adresse recvbuf duprocessus root
I Si le nombre de donnees envoyees est superieur a un,l’operation op est appliquee sur chacune des donnees
I l’operation op est supposee associativeGuy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 117 / 221
Operations prealables sur des donnees reparties
I Operations predefinies :MPI MAX : maximum MPI MIN : minimumMPI SUM : somme MPI PROD : produitMPI LAND : ET logique MPI LOR : OU logiqueMPI LXOR : OU exclusif logiqueMPI MAXLOC : maximum et positionMPI MINLOC : minimum et position
I Les operations MPI MAXLOC et MPI MINLOC necessitentun type de donnees valeur, indice pour etre utilisees⇒ Les types proposes par MPI : MPI INTEGER, MPI REAL,MPI DOUBLE PRECISION
I Operations de reductions personnelles :les operateurs MPI OP CREATE et MPI OP FREEpermettent de creer et detruire des operations personnalisees
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 118 / 221
Operations prealables sur des donnees reparties
USE mpiINTEGER, PARAMETER :: nb = 5INTEGER :: i, monrang, nbprocs, lbloc, ierr = 0REAL(8), DIMENSION(nb) :: ain, aout...IF (monrang == 0) THEN
ain(1:nb) = (/ (1000.0 8 + REAL(i,8), i=1,nb) /)ELSE
ain(1:nb) = (/ (monrang * 10.0 8, i=1,nb) /)END IFCALL MPI REDUCE(ain, aout, nb, MPI DOUBLE PRECISION,&
MPI SUM, 0, MPI COMM WORLD, ierr)IF (monrang == 0) &
write (6,’(A,I2,A,20E11.4)’) ’Rang ’, monrang, &’ somme = ’, aout(1 :nb)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 119 / 221
Operations prealables sur des donnees reparties
Compilation :ifort -O3 reduce.f90 -o reduce.out -lmpi
Execution :mpirun -np 4 ./reduce.out
Rang 0 somme = 0.1061E+04 0.1062E+04 0.1063E+040.1064E+04 0.1065E+04
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 120 / 221
Operations prealables sur des donnees reparties
I CALL MPI ALLREDUCE (sendbuf, recvbuf, count, &datatype, op, comm, ierr)
I Depuis tous les processus du communicateur comm, on envoieun message :de longueur count, de type datatype,a partir de l’adresse sendbuf,pour faire l’operation op sur ces valeurs.⇒ Reception du resultat a partir de l’adresse recvbufpour tous les processus
I Si le nombre de donnees envoyees est superieur a un,l’operation op est appliquee sur chacune des donnees
I L’operation op est supposee associative
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 121 / 221
Operations prealables sur des donnees reparties
USE mpiINTEGER, PARAMETER :: nb valeurs = 4INTEGER :: i, monrang, nbprocs, ierr = 0INTEGER, DIMENSION(nb valeurs) :: valeurs, donnees...valeurs(1:nb valeurs) = (/(1000+i+lbloc*monrang*100,&
i=1,nb valeurs)/)write (6,*) ’processus ’, monrang, ’ avant ’, &
valeurs(1:nb valeurs)
CALL MPI ALLREDUCE (valeurs, donnees, nb valeurs, &MPI INTEGER, MPI SUM, MPI COMM WORLD, ierr)
write (6,*) ’processus ’, monrang, ’ apres ’, &donnees(1:nb valeurs)
...
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 122 / 221
Communications collectives : TP 6
I Paralleliser le code sequentiel prod seq.f90 de telle sorte que :- la matrice soit partagee entre tous les processus par groupesde lignes contigues- le vecteur second membre soit initialise par tous les processus- le vecteur resultat soit distribue entre tous les processus- son calcul soit distribue- chaque processus recoit les morceaux des autres processuspour obtenir le vecteur resultat complet.
I L’executer sur differents nombres de processus
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 123 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 124 / 221
Types de donnees derives
I On peut envoyer autre chose que des buffers contigus dedonnees de meme type !
I Types simples : entiers, reels, ...MPI INTEGER MPI REALMPI DOUBLE PRECISION MPI COMPLEXMPI LOGICAL MPI CHARACTER
I Types complexes :- homogene : toutes les donnees sont de meme type (sectionsde tableau),- heterogene : les structures en C, les types derives en Fortran
I Il faut gerer ces types, au sens MPI :
creation : MPI TYPE xxx,validation : MPI TYPE COMMIT,destruction : MPI TYPE FREE
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 125 / 221
Validation - destruction des types crees
I Tout type cree par l’utilisateur doit etre valide par un appel aMPI TYPE COMMIT
I CALL MPI TYPE COMMIT (typename, ierr)INTEGER :: typename
I Cette validation ne concerne que le squelette de la structure,pas l’usage qui en est fait
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 126 / 221
Validation - destruction des types crees
I A la fin de l’execution, tout type cree par l’utilisateur doit etredetruit
I CALL MPI TYPE FREE (typename, ierr)
I Cela libere les ressources memoire occupees par ce type cree
I Cette liberation n’a aucun effet sur d’autres types crees apartir de celui qui est ainsi detruit :⇒ Un type A cree pour fabriquer un type B peut etre detruita l’issue de la creation du type B
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 127 / 221
Types homogenes : valeurs contigues
I CALL MPI TYPE CONTIGUOUS (count, oldtype, &newtype, ierr)
I Construction du type newtype,avec count elements du type oldtype
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 128 / 221
Types homogenes : valeurs contigues
10
18
17
16
19
2015
14
13
12
116
7
8
9
5
4
3
2
1
I CALL MPI TYPE CONTIGUOUS (5, MPI INTEGER, &colonne, ierr)
CALL MPI TYPE COMMIT (colonne, ierr)INTEGER :: colonne
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 129 / 221
Types homogenes : valeurs distantes d’un pas constant
I CALL MPI TYPE VECTOR(count, blocklength, stride,&oldtype, newtype, ierr)
I Construction du type newtype,avec count blocs,formes chacun de blocklength elements du type oldtypeet espaces d’un pas stride (exprime en nombre d’elements)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 130 / 221
Types homogenes : valeurs distantes d’un pas constant
10
18
17
16
19
2015
14
13
12
116
7
8
9
5
4
3
2
1
I CALL MPI TYPE VECTOR (4, 1, 5, MPI INTEGER, &ligne, ierr)
CALL MPI TYPE COMMIT (ligne, ierr)INTEGER :: ligne
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 131 / 221
Types homogenes : valeurs distantes d’un pas constantCALL MPI TYPE VECTOR (3, 2, 5, MPI INTEGER, &
type bloc, ierr)
CALL MPI TYPE COMMIT (type bloc, ierr)INTEGER :: type bloc
CALL MPI SEND (a(3,2), 1, type bloc,1, MPI COMM WORLD, ierr)
CALL MPI SEND (a(3:4,2:4), 6,MPI INTEGER, 1, MPI COMM WORLD, ierr)
10
18
17
16
19
2015
14
13
12
116
7
8
9
5
4
3
2
1
Ici c’est analogue mais faire attention aux communicationsasynchrones
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 132 / 221
Types homogenes : valeurs distantes d’un pas variable
I CALL MPI TYPE INDEXED (count, blocklengths, &displs, oldtype, newtype, ierr)
I Construction du type newtype, avec count blocs, formes deblocklengths[i] elements du type oldtype et decales chacund’un pas displs[i]
I L’argument blocklengths contient les longueurs des blocsexprimees en nombre d’elements de l’ancien type oldtype
I L’argument displs contient les distances a l’origine pourchaque bloc, exprimees en nombre d’elements de l’ancien typeoldtype
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 133 / 221
Types homogenes : valeurs distantes d’un pas variableAncien type : paire
Nouveau type : sparse
longueur = (2, 1, 3)
pas = (0, 3, 7)
I CALL MPI TYPE INDEXED (3, longueur, pas, paire, &sparse, ierr)
I CALL MPI TYPE COMMIT (sparse, ierr)INTEGER :: sparse
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 134 / 221
Types homogenes : sections de tableau
I Extraire une portion de tableau pour l’envoyer est utilenotamment en decomposition de domaine.
I La norme MPI2.0 fournit une nouvelle fonction qui s’inspiredu Fortran 90.
I Le sous-programme MPI TYPE CREATE SUBARRAY permet decreer un sous-tableau a partir d’un tableau.
I CALL MPI TYPE CREATE SUBARRAY &(rank, shape tab, shape subtab, &coord debut, ordre, oldtype, newtype, ierr)
I Construction du type newtype, de rang rank, de profilshape subtab, extrait a partir de l’element en coord debutselon le rangement memoire ordre.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 135 / 221
Types homogenes : sections de tableau, rappels Fortran90
I Un tableau est un ensemble d’elements du meme type :real(rp), DIMENSION(-1:3,2,0:5) :: tab
I Le rang (rank) d’un tableau est son nombre de dimensions
I L’etendue (extent) est le nombre d’elements dans unedimension d’un tableau
I Le profil (shape) d’un tableau est un vecteur dont chaqueelement est l’etendue de la dimension correspondante
I La taille (size) d’un tableau est le produit des elements duvecteur correspondant a son profil
I Deux tableaux sont dits conformants s’ils ont meme profil
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 136 / 221
Types homogenes : sections de tableau
On cree le type bloc :rank = 2shape tab = (/ nb lignes, nb colonnes /)shape subtab = (/ 2, 3 /)coord debut = (/ 2, 1 /)CALL MPI TYPE CREATE SUBARRAY (rank, shape tab, shape subtab,&
coord debut, mpi order fortran, mpi integer, block, ierr)CALL MPI TYPE COMMIT (block, ierr)
Le processus 0 envoie les donnees au 1 :CALL MPI SEND (a, 1, block, 1, 99,MPI COMM WORLD, ierr)
CALL MPI RECV (b, 1, block, 0, 99,MPI COMM WORLD, status, ierr)
10
18
17
16
19
2015
14
13
12
116
7
8
9
5
4
3
2
1
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 137 / 221
Types heterogenes
I CALL MPI TYPE STRUCT (count, blocklengths, &displs, oldtype, newtype, ierr)
I Construction du type newtype,avec count blocs,formes chacun de blocklengths[i] elements de type oldtype[i]et decales chacun d’un pas displs[i]
I L’argument blocklengths contient les longueurs des blocsexprimees en nombre d’elements
I L’argument displs contient les distances a l’origine pourchaque bloc exprimees en nombre d’octets
I L’argument oldtypes contient les differents types de donnees,un pour chaque bloc
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 138 / 221
Types heterogenes
I C’est le constructeur de type le plus general
I Il etend MPI TYPE INDEXED aux cas ou chaque bloc dedonnees, est de type quelconque
I Compte tenu de l’heterogeneite des donnees des blocs, lesdecalages se calculent en prenant les differences des adressesmemoires des elements avec MPI ADDRESS :- on stocke les adresses memoire des champs du type,- on calcule les decalages entre chaque adresse et l’adresse dupremier champ⇒ CALL MPI ADDRESS (location, adresse, ierr)
I Le calcul des adresses memoire depend de l’implementation !
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 139 / 221
Types heterogenes
Construction d’un type particule avec les coordonnees, la masse etl’espece chimique ...
TYPE particuleREAL :: masseINTEGER :: especeREAL, DIMENSION(3) :: coords
END TYPE particule
INTEGER, DIMENSION(3) :: oldtypes, blocklengthsINTEGER, DIMENSION(3) :: displs, adrs
INTEGER :: type p
TYPE (particule) :: p
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 140 / 221
Types heterogenes
oldtypes = (/ MPI REAL, MPI INTEGER, MPI REAL /)
blocklengths = (/ 1, 1, 3 /)
CALL MPI ADDRESS (p%masse , adrs(1), ierr)CALL MPI ADDRESS (p%espece, adrs(2), ierr)CALL MPI ADDRESS (p%coords, adrs(3), ierr)
DO i = 1, 3displs(i) = adrs(i) - adrs(1)
END DO
CALL MPI TYPE STRUCT (3, blocklengths, displs, &oldtypes, type p, ierr)
CALL MPI TYPE COMMIT (type p, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 141 / 221
Types derives : TP 7
Ecrire un programme MPI travaillant sur deux processus qui :
I verifie le nombre de processus
I lit un entier par un processus et le diffuse
I construit une matrice carree (pas trop grande !)
I cree un type bloc triangulaire inferieur (diagonale incluse)
I effectue l’echange des parties triangulaires inferieures et lesaffiche dans l’ordre des rangs
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 142 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 143 / 221
Communicateurs
I Le communicateur contient tout ce qui est necessaire pourfournir le cadre adapte aux operations de communication dansMPI
I MPI fournit un communicateur par defaut, MPI COMM WORLD,qui contient tous les processus de l’application
I On peut creer des communicateurs de deux manieres :- directement a partir d’un autre communicateur ;- a partir des groupes (au sens MPI) (non considere ici) ;
I Il y a deux sortes de communicateurs :- les intra-communicateurs : pour les operations sur un groupede processus au sein d’un communicateur ;- les inter-communicateurs : pour les communications entredeux groupes de processus
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 144 / 221
Communicateurs issus d’un autre communicateur
Cette technique permet de :I partitionner en une seule fois un communicateur ;
I donner le meme nom a tous les communicateurs crees ;
I ne pas manipuler des groupes.
I Il n’y a pas de recouvrement possible⇒ En un appel, chaque processus n’appartient qu’a un seulcommunicateur
I Les fonctions de gestion des communicateurs sont :MPI COMM SIZE : le nombre de processus du communicateurMPI COMM RANK : le rang au sein du communicateurMPI COMM SPLIT : le partitionnement d’un communicateurMPI COMM FREE : la destruction du communicateur...
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 145 / 221
Creation d’un communicateur a partir d’un autrecommunicateur
I La routine MPI COMM SPLIT permet de partitionner uncommunicateur :CALL MPI COMM SPLIT (comm, color, key, new comm,&
ierr)INTEGER :: color, key, new comm
I Tous les processus du communicateur doivent l’executer
I L’argument color (non negatif) permet de distinguer lesdifferents communicateurs crees :⇒ Tous les processus avec la meme valeur appartiendront aumeme nouveau communicateur
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 146 / 221
Creation d’un communicateur a partir d’un autrecommunicateur
I L’argument key permet d’ordonner (definir le rang) desprocessus au sein de leur nouveau communicateur
I Mettre key a zero comme valeur pour le processus qui seracelui de futur rang 0 (dans le nouveau communicateur) et desvaleurs strictement positives pour les autres
I Un processus qui ne fera partie d’aucun des nouveauxcommunicateurs affecte la valeur MPI UNDEFINED al’argument color⇒ La valeur en sortie de new comm sera alorsMPI COMM NULL
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 147 / 221
Communicateur pair / communicateur impair
INTEGER :: monrang, ierr = 0INTEGER :: color, key
CALL MPI COMM RANK (MPI COMM WORLD, monrang, ierr)
IF ( MOD(monrang,2) == 0 ) THENcolor = 0
IF (monrang == 4) THENkey = 0
ELSEkey = monrang + 10
END IF
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 148 / 221
Communicateur pair / communicateur impair
ELSEcolor = 1
IF (monrang == 1) THENkey = 0
ELSEkey = monrang + 10
END IFEND IF
CALL MPI COMM SPLIT(comm, color, key, new comm, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 149 / 221
Topologies
I Topologie = attribut supplementaire d’un communicateurpour mieux “coller” a la realite
I Numeroter les processus de 0 a (n-1) n’est pas toujours lameilleure logique de communication pour l’applicationparallele
I Grilles 2D, 3D de processus souvent mieux adaptees
I Possibilites de graphe de processus si la topologie est pluscomplexe
I Cela a aussi une action sur la distribution des processus MPIsur les processeurs sous-jacents grace a une renumerotationpossible des processus... et donc aussi des consequences sur les performances
I On ne considere ici que les topologies cartesiennes
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 150 / 221
Repartition des processus par dimension
I Nombre de processus par dimension : MPI DIMS CREATE
I CALL MPI DIMS CREATE (nbproc, nbdims, dims, ierr)
I L’argument nbdims : le nombre de dimensions de la grilleINTEGER :: nbdims
I L’argument dims : en sortie, le nombre de processus pardimensionINTEGER, DIMENSION(1:nbdims) :: dims
I L’argument dims peut etre “pre-rempli” pour imposer lenombre de processus dans une ou plusieurs dimensions :⇒ Attention, dans ce cas il faut que∏i ,dims(i)6=0
dims(i) | nbproc
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 151 / 221
Repartition des processus par dimension
Exemples :
dims avantl’appel
Appel a la fonction dims ensortie
(0,0) MPI DIMS CREATE (6, 2, dims, ierr) (3,2)
(0,0) MPI DIMS CREATE (7, 2, dims, ierr) (7,1)
(0,3,0) MPI DIMS CREATE (6, 3, dims, ierr) (2,3,1)
(0,3,0) MPI DIMS CREATE (7, 3, dims, ierr)erreur !
3 n’est pas un diviseur de 7 ....
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 152 / 221
Topologie cartesienne
I Creation de la grille cartesienne des processus :MPI CART CREATE⇒ creation d’un nouveau communicateur
I CALL MPI CART CREATE (MPI COMM WORLD, nbdims, &dims, period, reorg, newcomm, ierr)
I L’argument nbdims : le nombre de dimensions de la grilleINTEGER :: nbdims
I L’argument dims : le nombre de processus par dimensionINTEGER, DIMENSION(1:nbdims) :: dims
I L’argument period : la periodicite dans chaque dimensionLOGICAL, DIMENSION(1:nbdims) :: period
I L’argument reorg : reordonner les processus ?LOGICAL :: reorg
I L’argument newcomm : en sortie, le nouveau communicateurattache a la topologieINTEGER :: newcomm
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 153 / 221
Topologie cartesienne : exemple
I Topologie cartesienne 2D avec 8 processus, periodicite en y
I CALL MPI CART CREATE (MPI COMM WORLD, nbdim, &dims, period, reorg, comm2d, ierr)
nbdims = 2
dims = (/4, 2/)
period = (/.FALSE., .TRUE./)
reorg = .TRUE.0 1 2 3
4 5 6 7
0 1 2 3
x
y
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 154 / 221
Recherche des coordonnees
I Recherche des coordonnees, connaissant le rang dans lecommunicateur de la grille :
I CALL MPI CART COORDS(comm,rank,nbdims,coords,ierr)
I L’argument coords est un tableau d’etendue le nombre dedimensions de la grille (nbdims)INTEGER, DIMENSION(1:nbdims) :: coords
I Recherche du rang connaissant les coordonnees dans lecommunicateur de la grille :
I CALL MPI CART RANK (comm, coords, rank, ierr)INTEGER :: rank
x
y
0
4
0 1 2 3
7
321
5 6
(0,1)
(0,0) (1,0) (2,0) (3,0)
(3,1)(2,1)(1,1)
MPI_CART_RANK
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 155 / 221
Recherche des voisins
I Recherche des voisins dans chaque dimension :
I CALL MPI CART SHIFT (comm, direction, disp, &rank left, rank right, ierr)
I L’argument direction est la dimension concernee,⇒ i.e. la coordonnee modifiee par le dispINTEGER :: direction
I L’argument disp indique le deplacementINTEGER :: disp
I Les arguments rank left et rank right sont les rangs des voisinsINTEGER :: rank left, rank right
I En cas de “sortie” de la dimension, la valeur retournee estMPI PROC NULL
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 156 / 221
Recherche des voisins
I Recherche des voisins direct Gauche / Droite (ou Ouest / Est)par le processus 5
I CALL MPI CART SHIFT (comm2d, direction, disp, &rank left, rank right, ierr)
direction = 0disp = 1⇒ rank left = 4⇒ rank right = 6
0 1 2 3
4 5 6 7
0 1 2 3
x
y
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 157 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 158 / 221
Entrees / sorties collectives : MPI I/O (cours IDRIS)
I Un des gros apports de MPI 2
I Interface de haut niveau
I Operations collectives pour les operations courantes
I Nombreuses fonctionnalites
I On se limite aux principales ...
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 159 / 221
Un peu de vocabulaire
I fichier (file) : un ensemble ordonne de donnees typees.
I deplacement initial (displacement) : une adresse absolue, enoctets, par rapport au debut d’un fichier et a partir de laquelleune vue (view) commence.
I type elementaire (etype) : unite de donnee utilisee pourcalculer les positionnements et pour acceder aux donnees ;cela peut etre n’importe quel type de donnees, MPI ou derive.
I motif (filetype) : un masque qui constitue la base dupartitionnement du fichier entre les processus.
I vue (view) : une vue definit l’ensemble des donnees visiblesd’un fichier.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 160 / 221
Un peu de vocabulaire (suite)
I position (offset) : la position dans le fichier, exprimee ennombre de type elementaire, relativement a la vue courante.
I descripteur (file handle) : le descripteur est un objet cachecree a l’ouverture et detruit a la fermeture du fichier. Toutesles operations se font en specifiant comme reference sondescripteur (ce n’est pas une unite logique Fortran).
I pointeur (file pointer) : ils sont mis a jourautomatiquement par MPI et determinent des positions al’interieur du fichier.
I taille du fichier (file size) : la taille d’un fichier MPImesuree en nombre d’octets.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 161 / 221
Gestion des fichiers
I On donne les principaux sous-programmes (ouverture,fermeture, caracteristiques) mais d’autres sont disponibles(suppression, preallocation).
I Les attributs sont precises par des operations avec desconstantes entieres predefinies.
I Tous les processus d’un communicateur au sein duquel unfichier est ouvert participeront aux operations collectivesulterieures d’acces aux donnees.
I L’ouverture du fichier renvoie un descripteur.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 162 / 221
Attributs des fichiers
Attribut Signification
MPI MODE RDONLY seulement en lecture
MPI MODE RDWR en lecture et en ecriture
MPI MODE WRONLY seulement en ecriture
MPI MODE CREATE creation du fichier s’il n’existe pas
MPI MODE EXCL erreur si le fichier existe
MPI MODE UNIQUE OPEN erreur si le fichier est deja ouvertpar une autre application
MPI MODE SEQUENTIAL acces sequentiel(interdit les acces aleatoires)
MPI MODE APPEND pointeurs en fin de fichier (ajout)
MPI MODE DELETE ON CLOSE destruction apres la fermeture
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 163 / 221
Creation d’un fichier
PROGRAM open01USE mpiIMPLICIT NONEINTEGER :: descripteur, ierrCALL MPI INIT (ierr)CALL MPI FILE OPEN (MPI COMM WORLD, "fichier.txt", &
MPI MODE RDWR + MPI MODE CREATE, &MPI INFO NULL, descripteur, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)CALL MPI FINALIZE (ierr)END PROGRAM open01
I les attributs s’additionnent en Fortran ou se combinent (“&”)en C/C++
I On peut fournir d’autres informations (selon implementation !)sinon, une valeur nulle, MPI INFO NULL
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 164 / 221
Generalites
I Les transferts de donnees entre fichiers et zones memoire desprocessus se font via des appels explicites a dessous-programmes MPI de lecture et d’ecriture.
I On distingue 3 proprietes des acces aux fichiers :
I le positionnement, qui peut etre explicite ou implicite (viades pointeurs, individuels ou partages par tous les processus) ;
I la synchronisation, les acces pouvant etre bloquants ounon ;
I le regroupement, les acces pouvant etre collectifs (tous lesprocessus ayant ouvert le fichier) ou propres a un ou plusieursprocessus.
I Il y a de nombreuses variantes possibles ...
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 165 / 221
Types d’acces possibles (1/3)
Position- Synchro- Regroupementnement nisation individuel collectif
blo- mpi file read at mpi file read at alladresses quantes mpi file write at mpi file write at allexpli- non mpi file iread at mpi file read at all begincites blo- mpi file read at all end
quantes mpi file iwrite at mpi file write at all beginmpi file write at all end
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 166 / 221
Types d’acces possibles (2/3)
Position- Synchro- Regroupementnement nisation individuel collectif
pointeurs blo- mpi file read mpi file read allquantes mpi file write mpi file write all
implicites non mpi file iread mpi file read all beginblo- mpi file read all end
individuels quantes mpi file iwrite mpi file write all beginmpi file write all end
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 167 / 221
Types d’acces possibles (3/3)
Position- Synchro- Regroupementnement nisation individuel collectif
pointeurs blo- mpi file read shared mpi file read orderedquantes mpi file write shared mpi file write ordered
implicites non mpi file iread shared mpi file read ordered beginblo- mpi file read ordered end
partages quantes mpi file iwrite shared mpi file write ordered beginmpi file write ordered end
ORDERED signifie SHARED et ALL
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 168 / 221
Complements acces
I Il est possible de melanger les types d’acces effectues a unmeme fichier au sein d’une application.
I Les zones memoire accedees sont decrites par trois quantites :
I l’adresse initiale de la zone concernee ;I le nombre d’elements pris en compte ;I le type de donnees, qui doit correspondre a une suite de copies
contigue du type elementaire de donnee (etype) de la vuecourante.
I Un deplacement ne peut avoir une valeur negative.Pour mettre un pointeur implicite a une valeur inferieure a savaleur courante, il faut employer les sous-programmesMPI FILE SEEK ou MPI FILE SEEK SHARED, suivant qu’ils’agit d’un pointeur individuel ou partage.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 169 / 221
Positionnement explicite des pointeurs dans les fichiers
I Les sous-programmes MPI FILE GET POSITION etMPI FILE GET POSITION SHARED permettent de connaıtrerespectivement la valeur courante des pointeurs individuels etcelle du pointeur partage.
I Il est possible de positionner explicitement les pointeursindividuels a l’aide du sous-programme MPI FILE SEEK, et dememe le pointeur partage avec le sous-programmeMPI FILE SEEK SHARED.
I Il y a trois modes possibles pour fixer la valeur d’un pointeur :I MPI SEEK SET fixe une valeur absolue ;I MPI SEEK CUR fixe une valeur relative ;I MPI SEEK END positionne le pointeur a la fin du fichier, a
laquelle un deplacement eventuel est ajoute.
I Avec MPI SEEK CUR, on peut specifier une valeur negative, cequi permet de revenir en arriere dans le fichier.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 170 / 221
Positionnement explicite des pointeurs dans les fichiersINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: myrank, descripteur, nb octets entier, ierr
INTEGER(KIND=MPI OFFSET KIND) :: position fichier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY,&
MPI INFO NULL, descripteur, ierr)
CALL MPI FILE READ (descripteur, valeurs, 3, MPI INTEGER, status, ierr)
CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr)
position fichier = 8*nb octets entier
CALL MPI FILE SEEK (descripteur, position fichier, MPI SEEK CUR, ierr)
CALL MPI FILE READ (descripteur,valeurs(4), 3, MPI INTEGER, status,ierr)
position fichier = 4*nb octets entier
CALL MPI FILE SEEK (descripteur, position fichier, MPI SEEK SET, ierr)
CALL MPI FILE READ (descripteur, valeurs(7), 4, MPI INTEGER,status,ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 171 / 221
Utilisation de MPI FILE SEEK
1 2 31 2 31 2 31 2 31 2 31 2 3 1 2 3102
103
104
1 2 3102
103
104
5 6 7 8
1 2 3 1 2 3102
103
104
1 2 3102
103
104
5 6 7 8
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 172 / 221
Lectures/ecritures individuelles : deplacements explicites
I La position est exprimee en nombre d’occurrences d’un typede donnees, lequel doit etre un multiple du type elementairede donnee de la vue courante.
I Le fichier ne doit pas avoir ete ouvert avec l’attributMPI MODE SEQUENTIAL.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 173 / 221
Ecriture individuelle avec deplacement expliciteINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, i, myrank, nb octets entier
INTEGER(KIND=MPI OFFSET KIND) :: position fichier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
valeurs (:) = (/(i+myrank*100,i=1,nb valeurs) /)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE WRONLY + MPI MODE CREATE, MPI INFO NULL,&
descripteur, ierr)
CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr)
position fichier = myrank * nb valeurs * nb octets entier
CALL MPI FILE WRITE AT (descripteur, position fichier, valeurs, &
nb valeurs, MPI INTEGER, status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 174 / 221
Utilisation de MPI FILE WRITE AT
1 2 31 2 31 2 31 2 31 2 31 2 3 4 5 6 7 8 9 10
101 102 103 104 105 106 107 108 109 110
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 175 / 221
Lecture individuelle avec deplacement expliciteINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER(KIND=MPI OFFSET KIND) :: position fichier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr)
position fichier = myrank * nb valeurs * nb octets entier
CALL MPI FILE READ AT (descripteur, position fichier, valeurs, &
nb valeurs, MPI INTEGER, status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 176 / 221
Utilisation de MPI FILE READ AT
1 2 31 2 31 2 31 2 31 2 31 2 3 4 5 6 7 8 9 10
101 102 103 104 105 106 107 108 109 110
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 177 / 221
Lectures/ecritures individuelles : deplacements implicitesindividuels
I Un pointeur individuel est gere par le systeme, par fichier etpar processus.
I Pour un processus donne, deux acces consecutifs au memefichier permettent donc d’acceder automatiquement auxelements consecutifs de celui-ci.
I Les pointeurs partages (ci-apres) ne sont jamais accedes oumodifies.
I Apres chaque acces, le pointeur est positionne sur le typeelementaire de donnee suivant.
I Le fichier ne doit pas avoir ete ouvert avec l’attributMPI MODE SEQUENTIAL.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 178 / 221
Lecture individuelle avec deplacement impliciteINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI FILE READ (descripteur, valeurs, 6, MPI INTEGER, status, ierr)
CALL MPI FILE READ (descripteur, valeurs(7), 4, MPI INTEGER, status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 179 / 221
Utilisation de MPI FILE READ
1 2 31 2 31 2 31 2 31 2 31 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 180 / 221
Lecture individuelle avec deplacement impliciteINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
IF (myrank == 0) THEN
CALL MPI FILE READ (descripteur, valeurs, 5, MPI INTEGER, status,ierr)
ELSE
CALL MPI FILE READ (descripteur, valeurs, 8, MPI INTEGER, status,ierr)
CALL MPI FILE READ (descripteur, valeurs, 5, MPI INTEGER, status,ierr)
END IF
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 181 / 221
Utilisation de MPI FILE READ1 2 31 2 31 2 31 2 31 2 31 2 3 4 5 0 0 0 0 0
1 2 3 4 5 6 7 8 0 0
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
9 10 101 102 103 6 7 8 0 0
I On stocke les valeurs a partir du meme emplacement :ecrasement
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 182 / 221
Lectures/ecritures individuelles : deplacements implicitespartages
I Il existe un et un seul pointeur partage par fichier, commun atous les processus du communicateur dans lequel le fichier aete ouvert.
I Tous les processus qui font une operation d’entree-sortieutilisant le pointeur partage doivent employer la meme vue dufichier.
I L’usage des variantes non collectives des sous-programmesentraıne un ordre de lecture non deterministe.
I Apres chaque acces, le pointeur est positionne sur le typeelementaire de donnee suivant.
I Les pointeurs individuels ne sont jamais accedes ou modifiespar ces sous-programmes.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 183 / 221
Lecture individuelle, deplacement implicite partageINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI FILE READ SHARED (descripteur, valeurs, nb valeurs, &
MPI INTEGER, status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 184 / 221
Utilisation de MPI FILE READ SHARED1 2 31 2 31 2 31 2 31 2 3101 102 103 104 105 106 107 108 109 110
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
I Comportement non deterministe : 2 possibilites ! !
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 185 / 221
Lecture individuelle, deplacement implicite partageINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI FILE READ SHARED (descripteur, valeurs, 4, MPI INTEGER, &
status, ierr)
CALL MPI FILE READ SHARED (descripteur, valeurs(5), 6, MPI INTEGER, &
status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 186 / 221
Utilisation de MPI FILE READ SHARED1 2 31 2 31 2 31 2 31 2 31 2 3 4
5 6 7 8
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
1 2 3 4 9 10 101 102 103 104
5 6 7 8 105 106 107 108 109 110
I Comportement non deterministe : 4 possibilites ! !
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 187 / 221
Lectures/ecritures collectives
I Tous les processus du communicateur au sein duquel unfichier est ouvert participent aux operations collectives d’accesaux donnees.
I Les operations collectives sont generalement plusperformantes que les operations individuelles car ellesautorisent davantage de techniques d’optimisation mises enœuvre automatiquement.
I Les acces sont effectues dans l’ordre des rangs des processus ;le traitement est donc deterministe.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 188 / 221
Lectures/ecritures collectives : deplacements explicitesINTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER(KIND=MPI OFFSET KIND) :: position fichier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr)
position fichier = myrank * nb valeurs * nb octets entier
CALL MPI FILE READ AT ALL (descripteur, position fichier, valeurs, &
nb valeurs, MPI INTEGER, status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 189 / 221
Utilisation de MPI FILE READ AT ALL1 2 31 2 31 2 31 2 31 2 31 2 3 4 5 6 7 8 9 10
101 102 103 104 105 106 107 108 109 110
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
I Pas de difference entre MPI FILE READ AT ALL etMPI FILE READ AT ... mis a part l’efficacite du collectif.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 190 / 221
Lectures/ecritures collectives : deplacements implicitesindividuels
INTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI FILE READ ALL (descripteur, valeurs, 4, MPI INTEGER, &
status, ierr)
CALL MPI FILE READ ALL (descripteur, valeurs(5), 6, MPI INTEGER, &
status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 191 / 221
Utilisation de MPI FILE READ ALL1 2 31 2 31 2 31 2 31 2 31 2 3 4
1 2 3 4
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
I NB : chaque processus a son propre pointeur individuel, maisl’action est faite simultanement
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 192 / 221
Lectures/ecritures collectives : deplacements implicitesindividuels
INTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL, &
descripteur, ierr)
IF (myrank == 0) THEN
CALL MPI FILE READ ALL (descripteur, valeurs(3), 4, MPI INTEGER, &
status, ierr)
ELSE
CALL MPI FILE READ ALL (descripteur, valeurs(5), 5, MPI INTEGER, &
status, ierr)
END IF
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 193 / 221
Utilisation de MPI FILE READ ALL
1 2 31 2 31 2 31 2 31 2 30 0 1 2 3 4 0 0 0 0
0 0 0 0 1 2 3 4 5 0
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 194 / 221
Lectures/ecritures collectives : deplacements implicitespartages
INTEGER, PARAMETER :: nb valeurs=10
INTEGER :: descripteur, ierr, myrank, nb octets entier
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL, &
descripteur, ierr)
CALL MPI FILE READ ORDERED (descripteur, valeurs, 4, MPI INTEGER, &
status, ierr)
CALL MPI FILE READ ORDERED (descripteur, valeurs(5), 6, MPI INTEGER, &
status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 195 / 221
Utilisation de MPI FILE READ ORDERED1 2 31 2 31 2 31 2 31 2 31 2 3 4
5 6 7 8
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
1 2 3 4 9 10 101 102 103 104
5 6 7 8 105 106 107 108 109 110
I NB : comportement deterministe
I ALL + SHARED = ORDERED
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 196 / 221
Types derives : TP 8
Ecrire un programme MPI qui :
I lit un entier N (dimension) par un processus et le diffuse
I construit un vecteur d’entiers, distribue, de dimension totale Nle plus homogene possible
I lit le fichier vecteur.dat (fourni), rempli d’entiers avec lestrois routines : MPI FILE READ AT,MPI FILE READ AT ALL et MPI FILE READ ORDERED.
I chaque processus affiche les bornes et le contenu de sa portionde vecteur
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 197 / 221
Definition des vues
I Les vues sont un mecanisme souple et puissant pour decrireles zones accedees dans les fichiers.
I Les vues sont construites a l’aide de types derives MPI.
I Chaque processus a sa propre vue (ou ses propres vues) d’unfichier, definie par trois variables :- un deplacement initial,- un type elementaire de donnees,- un motif.Une vue est definie comme la repetition du motif, une fois ledeplacement initial effectue.
I Des processus differents peuvent avoir des vues differentesd’un meme fichier, de facon a acceder a des parties differentes.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 198 / 221
Definition de vues
I Si le fichier est ouvert en ecriture, les zones decrites par lestypes elementaires et les motifs ne peuvent pas se recouvrir,meme partiellement.
I La vue par defaut consiste en une simple suite d’octets(deplacement initial nul, etype et motifs egaux a MPI BYTE)
etype
fichier
motif
...
trous
déplacementinitial
données accessibles
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 199 / 221
Definition de motifs differents selon les processus
etype
fichier
motif proc 0
...
déplacementinitial
motif proc 1
motif proc 2
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 200 / 221
Utilisation d’une vue : exemple 1
etype
motif
déplacement initial : 2 entiers
MPI_INTEGER
PROGRAM read view01
USE mpi
IMPLICIT NONE
INTEGER, PARAMETER :: nb valeurs = 10
INTEGER(KIND=MPI OFFSET KIND) :: borne inf zero = 0
INTEGER :: myrank, descripteur, motif temp, motif, ierr
INTEGER(KIND=MPI OFFSET KIND) :: deplacement initial
INTEGER(KIND=MPI ADDRESS KIND) :: borne inf, taille
INTEGER, DIMENSION(2) :: longueurs, deplacements
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 201 / 221
Utilisation d’une vue : exemple 1 (suite)CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY, &
MPI INFO NULL, descripteur, ierr)
deplacements(1) = 1
deplacements(2) = 4
longueurs(1) = 2
longueurs(2) = 1
CALL MPI TYPE INDEXED (2, longueurs, deplacements, MPI INTEGER, &
motif temp, ierr)
CALL MPI TYPE GET EXTENT (motif temp, borne inf, taille, ierr)
CALL MPI TYPE CREATE RESIZED (motif temp, borne inf zero, &
borne inf+taille, motif, ierr)
CALL MPI TYPE COMMIT (motif, ierr)
deplacement initial = 0
CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, &
motif, "native", MPI INFO NULL, ierr)
CALL MPI FILE READ (descripteur, valeurs, 7, MPI INTEGER, status, ierr)
CALL MPI FILE READ (descripteur, valeurs(8), 3, MPI INTEGER,status,ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
END PROGRAM read view01
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 202 / 221
Utilisation d’une vue : exemple 1 (fin)
1 2 31 2 31 2 31 2 31 2 32 3 5 7 8 10 102
2 3 5 7 8 10 102
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
2 3 5 7 8 10 102 103 105 107
2 3 5 7 8 10 102 103 105 107
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 203 / 221
Utilisation d’une vue : exemple 2
etype
motif proc 0
déplacement initial : 0
MPI_INTEGER
motif proc 1
PROGRAM read view02
USE mpi
IMPLICIT NONE
INTEGER, PARAMETER :: nb valeurs = 10
INTEGER :: myrank, descripteur, coord, motif, ierr
INTEGER(KIND=MPI OFFSET KIND) :: deplacement initial
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 204 / 221
Utilisation d’une vue : exemple 2 (suite)CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY, &
MPI INFO NULL, descripteur, ierr)
IF (myrank == 0) THEN
coord = 1
ELSE
coord = 3
END IF
CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/2/), (/coord-1/), &
MPI ORDER FORTRAN, MPI INTEGER, &
motif, ierr)
CALL MPI TYPE COMMIT (motif, ierr)
deplacement initial = 0
CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, &
motif, "native", MPI INFO NULL, ierr)
CALL MPI FILE READ (descripteur, valeurs, nb valeurs, MPI INTEGER,
status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
END PROGRAM read view02
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 205 / 221
Utilisation d’une vue : exemple 2 (fin)
1 2 31 2 31 2 31 2 31 2 31 2 5 6 9 10 103 104 107 108
3 4 7 8 101 102 105 106 109 110
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 206 / 221
Utilisation d’une vue : exemple 3etype
motif_1
motif_2
motif_3
MPI_INTEGER
déplacement initial : 0
déplacement initial : 0
déplacement initial : 2 entiers
PROGRAM read view03
USE mpi
IMPLICIT NONE
INTEGER, PARAMETER :: nb valeurs = 10
INTEGER :: myrank, descripteur, motif 1, motif 2, motif 3
INTEGER :: ierr, nb octets entier
INTEGER(KIND=MPI OFFSET KIND) :: deplacement initial
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 207 / 221
Utilisation d’une vue : exemple 3CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", MPI MODE RDONLY, &
MPI INFO NULL, descripteur, ierr)
CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/2/), (/0/), &
MPI ORDER FORTRAN, MPI INTEGER, &
motif 1, ierr)
CALL MPI TYPE COMMIT (motif 1, ierr)
CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/2/), (/2/), &
MPI ORDER FORTRAN, MPI INTEGER, &
motif 2, ierr)
CALL MPI TYPE COMMIT (motif 2, ierr)
CALL MPI TYPE CREATE SUBARRAY (1, (/4/), (/1/), (/3/), &
MPI ORDER FORTRAN, MPI INTEGER, &
motif 3, ierr)
CALL MPI TYPE COMMIT (motif 3, ierr)
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 208 / 221
Utilisation d’une vue : exemple 3 (suite)deplacement initial = 0
CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, &
motif 1, "native", MPI INFO NULL, ierr)
CALL MPI FILE READ (descripteur, valeurs, 4, MPI INTEGER, status, ierr)
CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, &
motif 2, "native", MPI INFO NULL, ierr)
CALL MPI FILE READ (descripteur, valeurs(5), 3, MPI INTEGER,status,ierr)
CALL MPI TYPE SIZE (MPI INTEGER, nb octets entier, ierr)
deplacement initial = 2*nb octets entier
CALL MPI FILE SET VIEW (descripteur, deplacement initial, MPI INTEGER, &
motif 3, "native", MPI INFO NULL, ierr)
CALL MPI FILE READ (descripteur, valeurs(8), 3, MPI INTEGER,status,ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
END PROGRAM read view03
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 209 / 221
Utilisation d’une vue : exemple 3 (fin)
1 2 31 2 31 2 31 2 31 2 31 2 5 6 3 4 7 6 10 104
1 2 5 6 3 4 7 6 10 104
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 210 / 221
Types derives : TP 9
Ecrire un programme MPI qui :
I lit deux entiers nx et ny par un processus et les diffuse
I construit une topologie 2D, grille cartesienne
I distribue la matrice de dimensions globales nx x ny sur lagrille de processus, le plus homogene possible
I initialise le bloc matriciel de chaque processus avec des entierscroissants
I construit une vue pour generer un fichier contenant la matrice
I remplit le fichier
Dupliquer le programme mais en lectureGuy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 211 / 221
Lectures / ecritures non bloquantes
I Les entrees / sorties non bloquantes sont implementees selonle modele utilise pour les communications non bloquantes.
I Un acces asynchrone doit donner lieu ulterieurement a un testexplicite de completude ou a une mise en attente (viaMPI TEST, MPI WAIT, ...) de facon similaire a la gestion desmessages non bloquants.
I Il est possible d’effectuer des operations qui soient a la foiscollectives et non bloquantes.
I Celles-ci necessite un appel a deux sous-programmes distincts,l’un pour declencher l’operation, l’autre pour la terminer.
I On ne peut modifier la zone memoire concernee durantl’operation et il ne peut y avoir qu’une seule telle operationen cours a la fois par processus.
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 212 / 221
Utilisation de MPI FILE READ ORDERED BEGINPROGRAM READ ORDERED BEGIN END
USE mpi
IMPLICIT NONE
INTEGER :: descripteur, ierr, myrank
INTEGER, DIMENSION(nb valeurs) :: valeurs
INTEGER, DIMENSION(MPI STATUS SIZE) :: status
CALL MPI INIT (ierr)
CALL MPI COMM RANK (MPI COMM WORLD, myrank, ierr)
CALL MPI FILE OPEN (MPI COMM WORLD, "donnees.dat", &
MPI MODE RDONLY, MPI INFO NULL,&
descripteur, ierr)
CALL MPI FILE READ ORDERED BEGIN (descripteur, valeurs, 4, &
MPI INTEGER, ierr)
CALL MPI FILE READ ORDERED END (descripteur, valeurs, status, ierr)
CALL MPI FILE CLOSE (descripteur, ierr)
CALL MPI FINALIZE (ierr)
END PROGRAM READ ORDERED BEGIN END
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 213 / 221
Utilisation de MPI FILE READ ORDERED BEGIN
1 2 31 2 31 2 31 2 31 2 31 2 3 4
5 6 7 8
1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110
Processeur 0
Processeur 1
Fichier
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 214 / 221
Parallelisation
Presentation, environnement MPI
Communications point a point
Communications collectives
Types de donnees derives
Communicateurs et topologies
Entrees / sorties collectives : MPI I/O
Exemple recapitulatif : equation de la Chaleur 1D
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 215 / 221
Exemple recapitulatif : equation de la Chaleur 1D
I Les equations ...∂u∂t − λ
∂2u∂x2 = f dans Ω, avec Ω = [0, 1]
u = 0 sur Γ = ∂Ω
I La parallelisation est faite par decomposition de domaine
I La discretisation spatiale est faite par un schema auxdifferences finies d’ordre deux a trois points⇒ maillage uniforme indice i⇒ pas de discretisation spatiale hx .
I La discretisation temporelle est faite par le schema deCrank-Nicholson, ordre 2 semi-implicite etinconditionnellement stable dans notre cas, avec dt le pas dela discretisation.I − 0.5λdt∆ un+1 = I + 0.5λdt∆ un + 0.5dt
f n+1 + f n
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 216 / 221
Discretisation
I Le laplacien est ainsi discretise :
∆hu(i) =ui−1 − 2.ui + ui+1
hx2
+ termes d’erreurs en hx2
I Le systeme global s’ecrit alors sous la forme :
uin+1 − 0.5λdt
ui−1n+1 − 2ui
n+1 + ui+1n+1
hx2
= uin + 0.5λdt.
ui−1n − 2ui
n + ui+1n
hx2
+ 0.5dt
fin+1 + fi
n
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 217 / 221
Algorithme du gradient conjugue
I A matrice symetrique et definie positive — (Ax |x) ≥ 0
I La solution x de Ax = b minimise la fonctionnelleJ(x) = (Ax |x)− 2(b|x)
I Gradient conjugue = methode iterative, dite de descente,pour que J(xk+1) < J(xk)
Algorithme :x0 donnep0 = r0 = b − Ax0
Pour k = 0, 1, ...
αk =| rk |2
(Apk , pk)xk+1 = xk + αk pk
rk+1 = rk − αk A pk
βk =| rk+1 |2
| rk |2pk+1 = rk+1 + βk+1 pk
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 218 / 221
Algorithme sequentiel
I Initialisations :→ initialisations des vecteurs (fctfx)→ calcul des constantes (domaine)
I Boucle iterative en temps
1. construction du second membre (scdmb)
2. resolution du systeme lineaire (gradconj)⇒ boucle iterative de convergence comprenant :→ 1 produit matrice-vecteur (pmv)→ 2 produits scalaires (prodscal)→ 3 combinaisons lineaires de vecteurs (saxpy)
3. avancement en temps et calcul d’erreur (nrmerr)
I Finalisations
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 219 / 221
Au travail...
1. Analyser le code sequentiel (le faire “tourner”)
2. Analyser les algorithmes mis en œuvre
3. Effectuer le decoupage, construire la topologie (grille deprocessus, voisins, ...)
4. Determiner les dependances entre les donnees
5. Faire le bilan : qui a besoin de quoi, quand et ou !
6. Determiner les structures des donnees a echanger
7. Construire les types MPI ad hoc
8. Dupliquer et modifier le code sequentiel !
9. En bonus, utiliser MPI-I/O pour gerer les fichiers de reprise
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 220 / 221
Conclusions
I Le passage de messages est une technique de parallelisationportable
I Elle permet de travailler sur tout type d’architecture
I Elle est orientee parallelisme a gros grains
I Elle permet les echanges au sein de n’importe quel groupe deprocessus
I Elle permet les echanges de n’importe quel type de donnees
I Il est preferable d’utiliser les formes collectives des operationsd’entree/sortie
Guy Moebs (LMJL) Calcul parallele avec MPI Mars 2010 221 / 221