Calcul parallèle avec MPI - Université de Nantes

56
Calcul parall` ele avec MPI Guy Moebs Laboratoire de Math´ ematiques Jean Leray, CNRS, Universit´ e de Nantes, ´ Ecole Centrale de Nantes Mars 2010 Guy Moebs (LMJL) Calcul parall` ele avec MPI Mars 2010 1 / 221 Plan de la formation Parall´ elisation Pr´ esentation, environnement MPI Communications point ` a point Communications collectives Types de donn´ ees d´ eriv´ es Communicateurs et topologies Entr´ ees / sorties collectives : MPI I/O Exemple r´ ecapitulatif : ´ equation de la Chaleur 1D Guy Moebs (LMJL) Calcul parall` ele avec MPI Mars 2010 2 / 221 Parall´ elisation Pr´ esentation, environnement MPI Communications point ` a point Communications collectives Types de donn´ ees d´ eriv´ es Communicateurs et topologies Entr´ ees / sorties collectives : MPI I/O Exemple r´ ecapitulatif : ´ equation de la Chaleur 1D Guy Moebs (LMJL) Calcul parall` ele avec MPI Mars 2010 3 / 221 Pourquoi parall´ eliser ? I La premi` ere question ` a se poser, c’est savoir si la parall´ elisation de l’application est n´ ecessaire I Ecrire un programme s´ equentiel est d´ ej` a du travail, souvent difficile ; la parall´ elisation le rendra encore plus dur I Il y a eu beaucoup de progr` es technologique dans le mat´ eriel informatique (processeurs ` a 3 GHz, bus m´ emoire, ...) mais il ne faut pas compter sur des avanc´ ees au mˆ eme rythme I Pourtant il existe toujours des applications scientifiques qui consomment ”trop” de ressources en temps de processeur ou en m´ emoire I Pour celles-ci, la seule solution, pour des raisons techniques ou ´ economiques, reste la parall´ elisation Guy Moebs (LMJL) Calcul parall` ele avec MPI Mars 2010 4 / 221

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