0% ont trouvé ce document utile (0 vote)
16 vues109 pages

Presentation Mpi

Transféré par

fibernity rss
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
16 vues109 pages

Presentation Mpi

Transféré par

fibernity rss
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Plan

Calcul parallèle – Librairie MPI

Xavier Juvigny

Calcul Haute Performance


ONERA

Mai-Juin 2007

Xavier Juvigny Calcul parallèle


Plan

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Plan

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Plan

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Plan

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Initialisation

Il s’agit de préciser que le programme qui s’éxécute n’est pas


une tâche isolée mais un processus d’une application parallèle
Initialisation ( des processus parallèles ) ;
Terminaison ( des processus parallèles ) ;
Cela a un impact sur l’environnement d’exécution du
processus.
On dispose de commandes spéciales pour lancer l’éxécution :

mpirun -np <nombre de processus>


-machinefile <nœuds où les processus sont exécutés>

nom du programme

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Initialisation ( programmation )

Toute unité doit include l’entète MPI ( mpif.h en fortran,


mpi.h en C/C++ ) ;
La routine MPI Init permet d’initialiser l’environnement
parallèle d’un processus :
En fortran
integer, intent(out) : : code erreur
call MPI INIT(code erreur)

En C/C++
int code erreur ;
code erreur=MPI Init(&argc,&argv) ;

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Terminaison

Réciproquement, la routine mpi finalize désactive


l’environnement parallèle :
En fortran
integer, intent(out) : : code erreur
call MPI FINALIZE(code erreur)

En C/C++
int code erreur ;
code erreur=MPI Finalize() ;

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Communicateurs

Toutes les opérations effectuées par MPI portent sur des


communicateurs. Le communicateur par défaut est
MPI COMM WORLD qui comprend tous les processus actifs.

0 4
1
2

5 3

Communicateur MPI COMM WORLD

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Interrogation de l’environnement

A tout instant, un processus doit pouvoir connaı̂tre le nombre


de processus gérés par un communicateur. On utilise pour celà
la routine mpi comm size :
En fortran
integer, intent(out) : : nb procs, code erreur
call
MPI COMM SIZE(MPI COMM WORLD,nb procs,code erreur)

En C/C++
int nb procs, code erreur ;
code erreur=MPI Comm size(MPI COMM WORLD,&nb procs) ;

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Interrogation de l’environnement ( suite )

De même, il est utile que le processus puisse obtenir son rang


dans l’environnement parallèle. On utilise pour celà la routine
mpi comm rank :
En fortran
integer, intent(out) : : rang, code erreur
call MPI COMM RANK(MPI COMM WORLD,rang,code erreur)

En C/C++
int rang, code erreur ;
code erreur=MPI Comm rank(MPI COMM WORLD,&rang) ;

Attention, le rang est comprise entre 0 et nb procs-1

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Exemple
Programme
program qui je suis

implicit none
include ’mpif.h’
integer : : nb procs,rang,code

call MPI INIT(code)


call MPI COMM SIZE(MPI COMM WORLD,nb procs,code)
call MPI COMM RANK(MPI COMM WORLD,rang,code)
print *,’Je suis le processus ’, rang,’ parmi ’, nb procs
call MPI FINALIZE(code)

end program qui je suis

Exécution
> mpirun -np 5 qui je suis

Je suis le processus 3 parmi 5


Je suis le processus 0 parmi 5
Je suis le processus 2 parmi 5
Je suis le processus 4 parmi 5
Je suis le processus 1 parmi 5

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Définition

Une communication est dite point à point si la communication a


lieu entre deux processus, l’un appelé émetteur et l’autre
processus récepteur ( ou destinataire ).

0 4
1
Émetteur
00

2
10

5 3
Récepteur

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Genèse d’un message

L’émetteur et le récepteur sont identifiés par leur rang dans


le communicateur ;
l’enveloppe d’un message est constituée :
1 du rang de l’émetteur ;
2 du rang du récepteur ;
3 de l’étiquette (tag) du message ;
4 du nom du communicateur qui définit le contexte de
communication
les données échangées sont typées ;
Il existe plusieurs modes de transfert ( protocoles )

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Exemple de communications point à point


Programme
program point a point
implicit none
include ’mpif.h’
integer status(MPI STATUS SIZE)
integer : : rang,valeur,code,etiquette
call MPI INIT(code)
call MPI COMM RANK(MPI COMM WORLD,rang,code)
etiquette = 100
if ( rang .EQ. 1 ) then
valeur = 1000
call MPI SEND(valeur,1,MPI INTEGER,3,etiquette, MPI COMM WORLD,code)
else if ( rang .EQ. 3 ) then
call MPI RECV(valeur,1,MPI INTEGER,1,etiquette, MPI COMM WORLD,status,code)
print *,’Moi, processus 3, j’ai reçu ’, valeur,’ du processus 1.’
end if
call MPI FINALIZE(code)
end program point a point

Exécution
> mpirun -np 5 point a point

Moi, processus 3, j’ai reçu 1000 du processus 1.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Même exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int etiquette = 100 ;
int rang, valeur, code ;
MPI Status status ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
if rang == 1
{
valeur = 1000 ;
code = MPI Send(&valeur,1,MPI INT,3,etiquette,MPI COMM WORLD) ;
}
else if rang == 3
{
code = MPI Recv(&valeur,1,MPI INT,1,etiquette,MPI COMM WORLD,&status) ;
printf("Moi, processus 3, j’ai reçu %d du processus 1",valeur) ;
}
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Types de données de base ( Fortran )

Type MPI Type Fortran

MPI INTEGER INTEGER


MPI REAL REAL
MPI DOUBLE PRECISION DOUBLE PRECISION
MPI COMPLEX COMPLEX
MPI LOGICAL LOGICAL
MPI CHARACTER CHARACTER
MPI PACKED Types hétérogènes

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Types de données de base ( C/C++ )


Type MPI Type C

MPI CHAR signed char


MPI SHORT signed short
MPI INT signed int
MPI LONG signed long
MPI UNSIGNED CHAR unsigned char
MPI UNSIGNED SHORT unsigned short
MPI UNSIGNED INT unsigned int
MPI UNSIGNED LONG unsigned long
MPI FLOAT float
MPI DOUBLE double
MPI LONG DOUBLE long double
MPI PACKED Type hétérogènes

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Autres possibilités

À la réception d’un message, le rang et l’identificateur


peuvent être des jokers, respectivement MPI ANY SOURCE
et MPI ANY TAG ;
Une communication avec le processus “fictif” de rang
MPI PROC NULL n’a aucun effet ;
Il est possible de créer des structures de données plus
complexes à l’aide de sous-programmes spécifiques ;
Il y a de multiples protocoles de transfert détaillés plus loin

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Anneau de communication

p
p6 1006 710
07 p
8
05
10

p5
100
1004

8 p0
p4 0
100
p1
10

p3
03

p2 01
1002 10

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Vision software

Il y a plusieurs protocoles d’envoi et de réception de messages.


On peut les classer selon l’impact des requêtes (
send,receive ) sur le déroulement de l’application ( vision
software )
non bloquant ;
localement bloquant ;
bloquant.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Vision hardware

La vision hardware conduit à distinguer plusieurs modes de


fonctionnement du calculateur :
mode asynchrone ( chaque processeur est indépendant ) ;
mode synchrone ( notion de contrôle centralisé ).
Certains protocoles de communication sont rendus possibles
par les détails de l’architecture matérielle.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Envoi synchrone localement bloquant

Le plus “standard” est l’asynchrone, localement bloquant :


L’envoi ou la réception d’un message n’a pas d’impact sur
le déroulement des autres processus ( concernés ou non
);
il n’y a pas de notion de rendez-vous ;
l’ordre n’est pas forcément respecté.
Notion de boı̂te aux lettres.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Principe de l’envoi asynchrone

Ce mécanisme suppose l’existence de zones mémoire


“tampon” de taille a priori illimités ( ce qui n’est jamais le cas en
pratique ).
Le principe est le suivant :
Le sous-programme MPI Send rend la main lorsque les
données à émettre sont sauvegardées dans cette zone
tampon.
Le sous-programme MPI Recv rend la main lorsque les
données à recevoir sont recopiées de la zone tampon
dans la zone “utilisateur”.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Cela fonctionne bien comme un système de boı̂tes aux lettres


dans lesquelles sont stockés les messages en attente
d’émission ou de réception.
On peut interroger le système ( MPI Probe par exemple ) pour
savoir si un message avec une certaine étiquette est arrivé :
int MPI Probe( int source, int tag, MPI Comm
comm, MPI Status *status )

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Programme modèle
Programme
# include "mpi.h"
# include <stdio.h>
# include <lapack.h>
void main(int narg, char** argv)
{
const int na=256, nb=200, m=2048, etiquette=1111 ;
float a[na][na], b[nb][nb], c[m][m], pivota[na], pivotb[nb] ;
int nprocs, rang, ierr, info ;
int i,j ;
double tps deb, tps fin, tps fin max ;
MPI Status status ;
// Initialisation MPI
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
// Initialisation des tableaux
for ( i = 0 ; i < na ; i++ )
for ( j = 0 ; j < na ; j++ )
a[i][j] = 1+(int) (10.0*rand()/(RAND MAX+1.0)) ;
for ( i = 0 ; i < nb ; i++ )
for ( j = 0 ; j < nb ; j++ )
b[i][j] = 1+(int) (10.0*rand()/(RAND MAX+1.0)) ;
for ( i = 0 ; i < m ; i++ )
for ( j = 0 ; j < m ; j++ )
c[i][j] = 1+(int) (10.0*rand()/(RAND MAX+1.0)) ;
Xavier Juvigny Calcul parallèle
Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Programme modèle ( suite )


Programme ( suite )
tps deb = MPI WTime() ;
if rang == 0
{
code = MPI Send(c,m*m,MPI FLOAT,1,etiquette,
MPI COMM WORLD ) ;
// Je calcule : factorisation LU avec LAPACK
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// On appelle une routine de produit matrice-matrice
matmul(nb,a,b,c) ;
} else if ( rang == 1 )
{
// Je calcule
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// Je reçois le gros message
code = MPI Recv(c,m*m,MPI FLOAT,0,etiquette,MPI COMM WORLD,&statut) ;
// Ce calcul dépend du message précédent
transpose(na, c, a ) ;
// Ce calcul est indépendant du message
sgetrf (&nb, &nb, b, &nb, pivotb, &info ) ;
}
tps fin = MPI WTime() - tps deb ;
printf("Temps = %lg secondes",tps fin) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Mesure performance programme modèle

Le temps de calcul mesuré est de 0.7 secondes.


Hors communications, le temps de calcul est de 0.15 secondes
ce qui veut dire que les communications prennent environ 78%
du temps global !
Le temps pris dans la communication provient principalement
de la recopie dans la mémoire tampon des données.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Envoi bloquant synchrone

Ce protocole suppose un rendez–vous entre processus. Celà a


un impact sur l’ensemble de l’application.
On distingue deux variantes :
Rendez–vous “simple” : MPI Ssend ne peut commencer à
s’éxécuter que si le MPI Recv correspondant a
commencé.
MPI Issend permet d’initier un message synchrone et
rendre la main à l’utilisateur pour continuer ses calculs...
De même MPI Irecv permet d’initier la réception d’un
message dans un tableau ou variable et rend la main pour
continuer les calculs.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Modification programme modèle avec rendez–vous


simple
Programme ( suite )
tps deb = MPI WTime() ;
if rang == 0
{
code = MPI Ssend(c,m*m,MPI FLOAT,1,etiquette,
MPI COMM WORLD ) ;
// Je calcule : factorisation LU avec LAPACK
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// Ce calcul modifie le contenu du tableau c
matmul(nb,a,b,c) ;
} else if ( rang == 1 )
{
// Je calcule
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// Je reçois le gros message
code = MPI Recv(c,m*m,MPI FLOAT,0,etiquette,MPI COMM WORLD,&statut) ;
// Ce calcul dépend du message précédent
transpose(na, c, a ) ;
// Ce calcul est indépendant du message
sgetrf (&nb, &nb, b, &nb, pivotb, &info ) ;
}
tps fin = MPI WTime() - tps deb ;
printf("Temps = %lg secondes",tps fin) ;
code = MPI Finalize() ;
} Xavier Juvigny Calcul parallèle
Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Performance pour rendez–vous simple

Le temps mesuré ici est alors de 0.36 secondes.


Sur certaines machines comme celle utilisée pour le test, on
peut gagner par rapport au programme modèle un facteur 2 sur
le temps pris par les échanges de message.
Cela est dû principalement au fait qu’il n’y a pas de recopie des
données dans un buffer.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Modification programme modèle avec rendez–vous


non simple
Programme ( suite )
MPI Request request ;
...
if rang == 0 {
code = MPI Issend(c,m*m,MPI FLOAT,1,etiquette,
MPI COMM WORLD ) ;
// Je calcule : factorisation LU avec LAPACK
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// Ce calcul modifie le contenu du tableau c
code = MPI Wait(&request,&statut) ;
matmul(nb,a,b,c) ;
} else if ( rang == 1 )
{ // Je calcule
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// Je reçois le gros message
code = MPI Irecv(c,m*m,MPI FLOAT,0,etiquette,MPI COMM WORLD,&statut) ;
// Ce calcul est indépendant du message
sgetrf (&nb, &nb, b, &nb, pivotb, &info ) ;
// Ce calcul dépend du message précédent
code = MPI Wait(&request,&statut) ;
transpose(na, c, a ) ; }
tps fin = MPI WTime() - tps deb ;

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Performance pour rendez–vous non simple

Le temps mesuré ici est alors de 0.28 secondes.


On gagne ici un facteur 3 par rapport à la version initiale

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Outils pour les messages synchrones

En général, dans le cas d’un envoi ( MPI IxSend() ) ou d’une


réception ( MPI IRecv() ) non bloquant, il existe toute une
palette de fonctions qui permettent :
de synchroniser un processus ( ex. MPI Wait ) jusqu’à
terminaison de la requête ;
ou de vérifier ( ex. MPI Test ) si une requête est bien
terminée ;
ou encore de contrôler avant réception ( ex. MPI Probe )
si un message particulier est bien arrivé.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Conseils de programmation

Éviter si possible la recopie temporaire des message en


utilisant la fonction MPI Ssend ;
Chevaucher les communications avec les calculs en
évitant la recopie temporaire des messages en utilisant les
fonctions non bloquantes MPI Issend et MPI Irecv.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Communications persistantes

Dans un programme, il arrive parfois que l’on soit contraint de


boucler un certain nombre de fois sur un envoi et une réception
de message où la valeur des données manipulées change
mais pas leurs adresses en mémoire ni leurs nombres ni leurs
types. En outre, l’appel à une fonction de communication à
chaque itération peut être très pénalisante à la longue d’où
l’intérêt des communications persistantes

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Définition d’une communication persistante

Elle consiste à :
Créer un schéma persistantde communication une fois
pour toute ( à l’extérieur de la boucle ) ;
activer réellement la requête d’envoi ou de réception dans
la boucle ;
libérer, si nécessaire la requête en fin de boucle.
envoi standard MPI Send init
envoi synchrone MPI Ssend init
envoi bufférisé MPI Bsend init
réception standard MPI Recv init

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Rappel programme stantard avec rendez–vous non


simple
Programme standard
if rang == 0
{
for( k = 1 ; k < 1000 ; k++ )
{
code = MPI Issend(c,m*m,MPI FLOAT,1,etiquette,
MPI COMM WORLD,&request ) ;
sgetrf (&na, &na, a, &na, pivota, &info ) ;
code = MPI Wait(&request,&statut) ;
matmul(nb,a,b,c) ;
}
} else if ( rang == 1 )
{
for( k = 1 ; k < 1000 ; k++ )
{
sgetrf (&na, &na, a, &na, pivota, &info ) ;
code = MPI Irecv(c,m*m,MPI FLOAT,0,etiquette,MPI COMM WORLD,&request ) ;
sgetrf (&nb, &nb, b, &nb, pivotb, &info ) ;
code = MPI Wait(&request,&statut) ;
transpose(na, c, a ) ;
}
}

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Mesure du temps pour le programme exemple

Exécution
> mpirun -np 2 NonBloquant2
Temps : 235 secondes

L’utilisation d’un schéma persistant de communication permet


de cacher la latence et de réduire les surcoûts induits par
chaque appel aux fonctions de communications dans la boucle.
Le gain peut être considérable lorsque ce mode de
communication est réellement implémenté.

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Programme stantard avec communication persistante


Programme standard
if rang == 0
{
code = MPI Ssend init(c,m*m,MPI FLOAT,1,etiquette,
MPI COMM WORLD,&request ) ;
for( k = 1 ; k < 1000 ; k++ )
{
code = MPI Start(&request) ;
sgetrf (&na, &na, a, &na, pivota, &info ) ;
code = MPI Wait(&request,&statut) ;
matmul(nb,a,b,c) ;
}
} else if ( rang == 1 )
{
code = MPI Recv init(c,m*m,MPI FLOAT,0,etiquette,MPI COMM WORLD,&statut,&request) ;
for( k = 1 ; k < 1000 ; k++ )
{
sgetrf (&na, &na, a, &na, pivota, &info ) ;
// Je reçois le gros message
code = MPI Start(&request) ;
sgetrf (&nb, &nb, b, &nb, pivotb, &info ) ;
code = MPI Wait(&request,&statut) ;
transpose(na, c, a ) ;
}
}

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Mesure du temps

Exécution
> mpirun -np 2 persistant
Temps : 195 secondes

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Remarques

Une communication activée par MPI Start sur une


requête créée par l’une des fonctions MPI xxxx init est
équivalente à une communication non bloquante
MPI Ixxxx ;
Pour redéfinir un nouveau schéma persistant, il faut
auparavant libérer la requête request associée à l’ancien
schéma en appelant la fonction
MPI Request free(&request) ;
Cette fonctions ne libérera la requête request qu’une fois
que la communication associée sera réellement terminée

Xavier Juvigny Calcul parallèle


Environnement
Notions générales
Communications point à point
Exemple : Anneau de communication
Communications collectives
Protocoles d’envoi et de réception
Les communicateurs

Conseils 2

Minimiser les surcoûts induits par des appels répétitifs aux


fonctions de communication en utilisant une fois pour toute
un schéma persistant de communication et activer celui-ci
autant de fois qu’il est nécessaire à l’aide de la fonction
MPI Start ;
Chevaucher les communications avec les calculs tout en
évitant la recopie temporaire des messages car un
schéma persistante ( ex. MPI Ssend init ) est forcément
activé d’une façon non bloquante à l’appel de la fonction
MPI Start.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Plan

1 Environnement

2 Communications point à point


Notions générales
Exemple : Anneau de communication
Protocoles d’envoi et de réception

3 Communications collectives
Notions générales

4 Les communicateurs

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Définition

Les communications collectives permettent de faire en une


seule opération une série de communications point à
point ;
Une communication collective concerne toujours les
processus d’un communicateur donné ;
La gestion des étiquettes est transparente ;

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Types de communications collectives

Elles sont de trois types :


1 les synchronizations globales
2 les transferts de données :
Diffusion globale de données ;
Diffusion sélective de données ;
Collecte de données réparties ;
collecte par tous de données réparties ;
diffusion sélective par tous de données réparties
3 les opérations sur les transferts de données
Opérations de réductions
Opérations de réductions et diffusion

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Synchronisation

Donne un point de rendez-vous à tous les processeur du


communicateur
Exemple en C
int code ;
code = MPI Barrier(MPI COMM WORLD) ;

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Diffusion général : MPI BCAST

A 0
A
A 1
2
A

P3 P3 A
P2 A P2 A
MPI BCAST
P1 P1 A
P0 P0 A

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en fortran

Programme
program bcast
implicit none
include ’mpif.h’
integer : : rang,valeur,code,nb proc
call MPI INIT(code)
call MPI COMM RANK(MPI COMM WORLD,rang,code)
if ( rang .EQ. 2 ) valeur = rang+1000
call MPI BCAST(valeur,1,MPI INTEGER,2,MPI COMM WORLD,code)
print *,’Moi, processus ’, rang,’ , j’’ai reçu ’, valeur, ’du processus 2’
call MPI FINALIZE(code)
end program bcast

Exécution
> mpirun -np 4 bcast

Moi, processus 2, j’ai reçu 1002 du processus 2.


Moi, processus 0, j’ai reçu 1002 du processus 2.
Moi, processus 1, j’ai reçu 1002 du processus 2.
Moi, processus 3, j’ai reçu 1002 du processus 2.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Diffusion sélective : MPI SCATTER

A2 0
A0
A1 1
2
A3

P3 P3 A3
P2 A0 A1 A2 A3 P2 A2
MPI SCATTER
P1 P1 A1
P0 P0 A0

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C
Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int nb valeurs = 128 ;
int rang, longueur tranche, i, code, nb procs ;
float* valeurs, donnees ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
longueur tranche = nb valeurs/nb procs ;
donnees = malloc(longueur tranche*sizeof(float)) ;
if rang == 2
{
valeurs = malloc(nb valeurs*sizeof(float)) ;
for ( i = 0 ; i < nb valeurs ; i++ )
valeurs[i] = 1000+i ;
}
code = MPI Scatter(valeurs,longueur tranche,MPI FLOAT,
donnees,longueur tranche,MPI FLOAT,2,MPI COMM WORLD ) ;
printf("Moi, processus %d, j’ai reçu %f à %f du processus 2",rang,
donnees[0],donnees[longueur tranche-1]) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex scatter

Moi, processus 0, j’ai reçu xxxx à xxxx du processus 2.


Moi, processus 1, j’ai reçu xxxx à xxxx du processus 2.
Moi, processus 3, j’ai reçu xxxx à xxxx du processus 2.
Moi, processus 2, j’ai reçu xxxx à xxxx du processus 2.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex scatter

Moi, processus 0, j’ai reçu 1000 à 1031 du processus 2.


Moi, processus 1, j’ai reçu 1032 à 1063 du processus 2.
Moi, processus 3, j’ai reçu 1096 à 1127 du processus 2.
Moi, processus 2, j’ai reçu 1064 à 1095 du processus 2.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Collecte : MPI GATHER

A2 0
A0
A1 1
2
A3

P3 A3 P3
P2 A2 P2 A0 A1 A2 A3
MPI GATHER
P1 A1 P1
P0 A0 P0

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int nb valeurs = 128 ;
int rang, longueur tranche, i, code, nb procs ;
float* valeurs, donnees ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
longueur tranche = nb valeurs/nb procs ;
donnees = malloc(nb valeurs*sizeof(float)) ;
valeurs = malloc(longueur tranche*sizeof(float)) ;
for ( i = 0 ; i < longueur tranche ; i++ )
valeurs[i] = 1000+rang*longueur tranche+i ;
code = MPI Gather(valeurs,longueur tranche,MPI FLOAT,
donnees,longueur tranche,MPI FLOAT,2,MPI COMM WORLD ) ;
if rang == 2
printf("Moi, processus %d, j’ai reçu %f ... %f ... %f",
donnees[0],donnees[longueur tranche],donnees[nb valeurs]) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex gather
Moi, processus 2, j’ai reçu xxxx ... xxxx ... xxxx

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex gather
Moi, processus 2, j’ai reçu 1000 ... 1032 ... 1127

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Collecte générale : MPI ALLGATHER


A0
A1 A1
A2 0 A0
A2
A0 A2 1
A0 A3
2 A1 A1
A2 A3
A3
3
A3

P3 A3 P3 A0 A1 A2 A3
P2 A2 P2 A0 A1 A2 A3
MPI ALLGATHER
P1 A1 P1 A0 A1 A2 A3
P0 A0 P0 A0 A1 A2 A3

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int nb valeurs = 128 ;
int rang, longueur tranche, i, code, nb procs ;
float* valeurs, donnees ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
longueur tranche = nb valeurs/nb procs ;
donnees = malloc(nb valeurs*sizeof(float)) ;
valeurs = malloc(longueur tranche*sizeof(float)) ;
for ( i = 0 ; i < longueur tranche ; i++ )
valeurs[i] = 1000+rang*longueur tranche+i ;
code = MPI Allgather(valeurs,longueur tranche,MPI FLOAT,
donnees,longueur tranche,MPI FLOAT,MPI COMM WORLD ) ;
printf("Moi, processus %d, j’ai reçu %f ... %f ... %f",
donnees[0],donnees[longueur tranche],donnees[nb valeurs]) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex allgather

Moi, processus 1, j’ai reçu xxxx ... xxxx ... xxxx


Moi, processus 3, j’ai reçu xxxx ... xxxx ... xxxx
Moi, processus 2, j’ai reçu xxxx ... xxxx ... xxxx
Moi, processus 0, j’ai reçu xxxx ... xxxx ... xxxx

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex allgather

Moi, processus 1, j’ai reçu 1000 ... 1032 ... 1127


Moi, processus 3, j’ai reçu 1000 ... 1032 ... 1127
Moi, processus 2, j’ai reçu 1000 ... 1032 ... 1127
Moi, processus 0, j’ai reçu 1000 ... 1032 ... 1127

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Échanges croisés : MPI ALLTOALL


A0
B0 B1
C2 0 A1
C0
A2 C1 1
A3 D0
2 B2 B3
C3 D1
D2
3
D3

P3 D0 D1 D2 D3 P3 A3 B3 C3 D3
P2 C0 C1 C2 C3 P2 A2 B2 C2 D2
MPI ALLTOALL
P1 B0 B1 B2 B3 P1 A1 B1 C1 D1
P0 A0 A1 A2 A3 P0 A0 B0 C0 D0

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int nb valeurs = 128 ;
int rang, longueur tranche, i, code, nb procs ;
float* valeurs, donnees ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
longueur tranche = nb valeurs/nb procs ;
donnees = malloc(nb valeurs*sizeof(float)) ;
valeurs = malloc(longueur tranche*sizeof(float)) ;
for ( i = 0 ; i < longueur tranche ; i++ )
valeurs[i] = 1000+rang*longueur tranche+i ;
code = MPI Alltoall(valeurs,longueur tranche,MPI FLOAT,
donnees,longueur tranche,MPI FLOAT,MPI COMM WORLD ) ;
printf("Moi, processus %d, j’ai reçu %f ... %f ... %f",
donnees[0],donnees[longueur tranche],donnees[nb valeurs]) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex mpialltoall

Moi, processus 1, j’ai reçu xxxx ... xxxx ... xxxx


Moi, processus 3, j’ai reçu xxxx ... xxxx ... xxxx
Moi, processus 2, j’ai reçu xxxx ... xxxx ... xxxx
Moi, processus 0, j’ai reçu xxxx ... xxxx ... xxxx

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 4 ex mpialltoall

Moi, processus 1, j’ai reçu 1032 ... 1160 ... 1447


Moi, processus 3, j’ai reçu 1096 ... 1224 ... 1511
Moi, processus 2, j’ai reçu 1064 ... 1192 ... 1479
Moi, processus 0, j’ai reçu 1000 ... 1128 ... 1415

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Réductions réparties

Une réduction est une opération appliquée à un ensemble


d’éléments pour en obtenir une seule valeur ( par exemple
la somme des éléments ou le maximum ) ;
MPI propose des sous–programmes de haut-niveau pour
opérer des réductions sur des données réparties sur un
ensemble de processus avec récupération du résultat sur
un seul processus ( MPI REDUCE ) ou bien sur tous (
MPI ALLREDUCE )

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Réductions réparties ( suite )

Si plusieurs éléments sont concernés par processus, la


fonction de réduction est d’abord appliquée à chacun
d’entre eux en faisant les réductions localement sur
chaque processus ;
Le sous–programme MPI SCAN permet d’effectuer en plus
des réductions partielles en considérant pour chaque
processus les processus précédents du groupe ;
Les sous–programe MPI OP CREATE et MPI OP FREE
permettent de définir des opérations de réduction
personelles.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Principales opérations de réduction

Nom Opération
MPI SUM Somme des éléments
MPI PROD Produit des éléments
MPI MAX Recherche du maximum
MPI MIN Recherche du minimum
MPI MAXLOC Recherche de l’indice du maximum
MPI MINLOC Recherche de l’indice du minimum
MPI LAND Et logique
MPI LOR Ou logique
MPI XOR Ou exclusif logique

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Réduction répartie ( Somme )

1000+1+2+3=1006
0 1
2
1
3
2

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
int rang, valeur, somme, code, nb procs ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
if rang == 0
valeur = 1000 ;
else
valeur = rang ;
code = MPI Reduce(valeurs,somme,1,MPI INT,
MPI SUM,0,MPI COMM WORLD ) ;
if rang == 0
printf("Moi, processus %d, j’ai pour valeur de somme globale %d",
rang, somme) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 7 ex mpireduce
Moi, processus 0, j’ai pour valeur de somme globale
xxxx

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 7 ex mpireduce
Moi, processus 0, j’ai pour valeur de somme globale
1021

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Réduction répartie avec diffusion( Produit )

1000 × 1 × 2 × 3 = 6000
0 1
2
1
3
2

Équivalent à un MPI Gather suivit d’un MPI Bcast.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Réduction répartie avec diffusion( Produit )

6000
1000 × 1 × 2 × 3 =6000
6000
6000 1
0
2
1
36000
2

Équivalent à un MPI Gather suivit d’un MPI Bcast.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
int rang, valeur, produit, code, nb procs ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
if rang == 0
valeur = 10 ;
else
valeur = rang ;
code = MPI Allreduce(valeurs,produit,1,MPI INT,
MPI PROD,MPI COMM WORLD ) ;
printf("Moi, processus %d, j’ai pour valeur le produit global %d",
rang, produit) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 7 ex mpiallreduce

Moi, processus 6, j’ai pour valeur de somme globale xxxx


Moi, processus 2, j’ai pour valeur de somme globale xxxx
Moi, processus 0, j’ai pour valeur de somme globale xxxx
Moi, processus 4, j’ai pour valeur de somme globale xxxx
Moi, processus 5, j’ai pour valeur de somme globale xxxx
Moi, processus 3, j’ai pour valeur de somme globale xxxx
Moi, processus 1, j’ai pour valeur de somme globale xxxx

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 7 ex mpiallreduce

Moi, processus 6, j’ai pour valeur de somme globale 7200


Moi, processus 2, j’ai pour valeur de somme globale 7200
Moi, processus 0, j’ai pour valeur de somme globale 7200
Moi, processus 4, j’ai pour valeur de somme globale 7200
Moi, processus 5, j’ai pour valeur de somme globale 7200
Moi, processus 3, j’ai pour valeur de somme globale 7200
Moi, processus 1, j’ai pour valeur de somme globale 7200

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Réduction répartie avec calculs partiels

p7
p6
1015+6=1021
1021+7=1028
p8
1010+5=1015
p5
1028+8=1036
p0
1006+4=1010
p4
1000
p1
1003+3=1006
p 3
p2
1000+1=1001
1001+2=1003

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Exemple en C

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
int rang, valeur, somme, code, nb procs ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
if rang == 0
valeur = 1000 ;
else
valeur = rang ;
code = MPI Scan(valeurs,somme,1,MPI INT,
MPI SUM,0,MPI COMM WORLD ) ;
printf("Moi, processus %d, j’ai pour valeur de la somme globale %d",
rang, somme) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 7 allgather

Moi, processus 6, j’ai pour valeur de somme globale xxxx


Moi, processus 2, j’ai pour valeur de somme globale xxxx
Moi, processus 0, j’ai pour valeur de somme globale xxxx
Moi, processus 4, j’ai pour valeur de somme globale xxxx
Moi, processus 5, j’ai pour valeur de somme globale xxxx
Moi, processus 3, j’ai pour valeur de somme globale xxxx
Moi, processus 1, j’ai pour valeur de somme globale xxxx

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Sortie de l’exemple

Exécution
> mpirun -np 7 allgather

Moi, processus 6, j’ai pour valeur de somme globale 1021


Moi, processus 2, j’ai pour valeur de somme globale 1003
Moi, processus 0, j’ai pour valeur de somme globale 1000
Moi, processus 4, j’ai pour valeur de somme globale 1010
Moi, processus 5, j’ai pour valeur de somme globale 1015
Moi, processus 3, j’ai pour valeur de somme globale 1006
Moi, processus 1, j’ai pour valeur de somme globale 1001

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Notions générales
Communications collectives
Les communicateurs

Compléments

Les sous–programmes MPI Scatterv, MPI Gatherv,


MPI Allgatherv et MPI Alltoallv étendent
respectivement
MPI Scatter,MPI Gather,MPI Allgather,MPI Alltoall
au cas où le nombre d’éléments à diffuser ou collecter est
différent suivant les processus.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Principe
Il s’agit de partitionner un ensemble de processus afin de créer
des sous-ensembles sur lesquels on puisse effectuer des
opérations telles que des communications point à point,
collectives, etc.
Chaque sous–ensemble ainsi créé aura son propre espace de
communication

0 4
1
2

5 3

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Création d’un communicateur

On ne peut créer un communicateur qu’à partir d’un autre


communicateur,
Fort heureusement, un communicateur est fourni par
défaut : l’identificateur MPI COMM WORLD défini dans le
fichier d’en-tête ;
Ce communicateur initial MPI COMM WORLD est créé pour
toute la durée d’exécution du programme à l’appel de la
fonction MPI Init ;
Ce communicateur ne peut-être détruit ;
Par défaut, il fixe la portée des communications point à
point et collectives à tous les processus de l’application

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Exemple de diffusion via MPI COMM WORLD

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int m = 16 ;
int i, rang, code, nb procs ;
float a[m] ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
for ( i = 0 ; i < m ; i++ ) a[i] = 0. ;
if rang == 2
for ( i = 0 ; i < m ; i++ ) a[i] = 2. ;
code = MPI Bcast(a,n,MPI FLOAT,2,MPI COMM WORLD) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Exécution de l’exemple

Dans cet exemple, le processus 2 diffuse un message


contenant un vecteur “a” à tous les processus du
communicateur MPI COMM WORLD ( donc de l’application ).

A 0
A
A 1
2
A A
AA A
7 3
6 4
5
> mpirun -np 8 monde

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Création d’un sous-groupe

Que faire pour que le processus 2 diffuse ce message au


sous-ensemble de processus de rang pair, par exemple ?
Boucler sur des send/recv peut-être très pénalisant surtout
si le nombre de processus est élevé. De plus un test serait
obligatoire dans la boucle pour savoir si le rang du
processus auquel le processus 2 doit envoyer le message
est pair ou impair.
La solution est de créer un communicateur regroupant ces
processus de sorte que le processus 2 leur diffuse à eux
seuls le message.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

A 0
A
1
2
A A
7 3
6 4
5

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Groupes et communicateurs

Dans la bibliothèque MPI, il existe des sous–programmes


pour :
1 Construire des groupes de processus :
MPI Group incl ;
MPI Groupe excl.
2 Construire des communicateurs :
MPI Cart create ;
MPI Cart sub ;
MPI Comm create ;
MPI Comm dup ;
MPI Comm merge ;
MPI Comm split.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Les constructeurs de groupes sont des opérateurs locaux


aux processus du groupe ( qui n’engendrent pas de
communications entre les processus ).
Les constructeurs de communicateurs sont des opérateurs
collectifs ( qui engendrent des communications entre les
processus ).
Les groupes est les communicateurs que le programmeur
crée peuvent être gérés dynamiquement. De même qu’il
est possible de les créer, il est possible de les détruire :
MPI Group free, MPI Comm free.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

En pratique, pour construire un communicateur, il existe deux


façons de procéder :
1 par l’intermédiaire d’un groupe de processus ;
2 directement à partir d’un autre communicateur.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Communicateur issu d’un groupe


Un groupe est un ensemble ordonné de N processus ;
Chaque processus du groupe est identifié par un entier
0,1,. . . ,N-1 appelé rang ;
Initialement, tous les processus sont membre d’un groupe
associé au communicateur par défaut MPI COMM WORLD ;
Des sous–programmes MPI ( MPI Group size,
MPI Group rank, etc. ) permettent de connaı̂tre les
attributs d’un groupe ;
Tout communicateur est associé à un groupe. Le
sous–programme MPI Comm group permet de connaı̂tre
le groupe auquel un communicateur est associé ;
La construction d’un groupe est une étape intermédiaire
pour créer un nouveau communicateur.
Xavier Juvigny Calcul parallèle
Environnement
Communications point à point
Communications collectives
Les communicateurs

Dans l’exemple suivant, on va :


regrouper les processus de rang pair dans un
communicateur ;
ne diffuser un message qu’aux processus de ce groupe.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int m = 16 ;
int i, rang, code, nb procs, iproc,n ;
int rang ds monde, rang ds pair ;
MPI Group grp monde,grp pair ;
int* rangs pair ;
MPI Comm comm pair ;
float a[m] ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
for ( i = 0 ; i < m ; i++ ) a[i] = 0. ;
if rang == 2
for ( i = 0 ; i < m ; i++ ) a[i] = 2. ;
// enregistrer le rang des processus pairs
n = nprocs/2 ;
rangs pair = malloc(n*sizeof(int)) ;
i = 0;
for( rang = 0 ; rang < nb procs ; rang += 2 )
{
i = i + 1;
rangs pair[i] = rang ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Programme (suite)
// Connaı̂tre le groupe associé à MPI COMM WORLD
code = MPI Comm group(MPI COMM WORLD,&grp monde) ;
// Créer le groupe des processus pairs
code = MPI Group incl(grp monde,n,rangs pair, &grp pair) ;
// Trouver le rang du processus 2 dans le groupe pair.
rang ds monde = 2 ;
code = MPI Group translate ranks(grp monde, 1, &rang ds monde,grp pair,&rang ds pair) ;
// Créer le communicateur des processus pairs
code = MPI Comm create(MPI COMM WORLD,grp pair,&comm pair) ;
// Une fois le communicateur créé, on détruit le groupe qui lui a donné naissance
code = MPI Group free(&grp pair) ;
// Diffuser le message seulement aux processus de rang pair
ifrang%2 == 0
{
code = MPI Bcast(a,n,MPI FLOAT,rang ds pair,MPI COMM WORLD) ;
// Destruction du communicateur
code = MPI Comm free(&comm pair) ;
}
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Contexte de communication

Un communicateur est constitué :


1 d’un groupe de processus ;
2 d’un contexte de communication mis en place à l’appel de
la fonction de construction du communicateur.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Le groupe constitue un sous–ensemble de processus ;


le contexte de communication permet de délimiter l’espace
de communication.
Les contextes de communication sont gérés par MPI ( le
programmeur n’a aucune action sur eux : attribut “caché” ).
Essayons de reprendre le programme en créant un groupe pour
les processus impairs et un groupe pour les processus pairs.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int m = 16 ;
int i, rang, code, nb procs, iproc,n ;
int rang ds monde, rang ds pair, rang ds impair ;
MPI Group grp monde,grp pair, grp impair ;
int* rangs pair ;
MPI Comm comm pair, comm impair ;
float a[m] ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
for ( i = 0 ; i < m ; i++ ) a[i] = 0. ;
if rang == 2
for ( i = 0 ; i < m ; i++ ) a[i] = 2. ;
if rang == 3
for ( i = 0 ; i < m ; i++ ) a[i] = 5. ;
// enregistrer le rang des processus pairs
n = nprocs/2 ;
rangs pair = malloc(n*sizeof(int)) ;
i = 0;
for( rang = 0 ; rang < nb procs ; rang += 2 )
{ i = i + 1;
rangs pair[i] = rang ; }

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Programme (suite)
// Connaı̂tre le groupe associé à MPI COMM WORLD
code = MPI Comm group(MPI COMM WORLD,&grp monde) ;
// Créer le groupe des processus pairs
code = MPI Group incl(grp monde,n,rangs pair, &grp pair) ;
// Trouver le rang du processus 2 dans le groupe pair.
rang ds monde = 2 ;
code = MPI Group translate ranks(grp monde, 1, &rang ds monde,grp pair,&rang ds pair) ;
// Créer le communicateur des processus pairs
code = MPI Comm create(MPI COMM WORLD,grp pair,&comm pair) ;
// Créer le groupe des processus impairs.
code = MPI Group excl(grp monde,n,rangs ds pair,&grp impair) ;
// Trouver le rang du processus 3 dans le groupe impair.
rang ds monde = 3 ;
MPI Group translate ranks(grp monde, 1, &rang ds monde,grp impair,&rang ds impair) ;
// Créer le communicateur des processus impairs
code = MPI Comm create(MPI COMM WORLD,grp impair,&comm impair) ;
// Diffuser le message seulement aux processus de rang pair
ifrang % 2 == 0
{
code = MPI Bcast(a,n,MPI FLOAT,rang ds pair,MPI COMM WORLD) ;
// Destruction du communicateur pair
code = MPI Comm free(&comm pair) ;
} else {
code = MPI Bcast(a,n,MPI FLOAT,rang ds impair,MPI COMM WORLD) ;
// Destruction du communicateur impair
code = MPI Comm free(&comm impair) ;
}
code = MPI Finalize() ;
}
Xavier Juvigny Calcul parallèle
Environnement
Communications point à point
Communications collectives
Les communicateurs

Une fois les groupes ( ou les communicateurs ) constitués, il


est possible :
De les comparer :
MPI Group compare(group1,group2,&resultat) ;
MPI Comm compare(comm1,comm2,&resultat) ;
Le résultat ( un entier ) peut être : MPI IDENT ou
MPI CONGRUENT ou MPI SIMILAR sinon MPI UNEQUAL.
d’appliquer des opérateurs ensemblistes sur deux
groupes :
MPI Group union(group1,group2,&nouveau groupe) ;
MPI Group intersection(group1,group2,&nouveau groupe) ;
MPI Group difference(group1,group2,&nouveau groupe) ;
où nouveau groupe peut être l’ensemble vide auquel cas
il prend la valeur MPI GROUP EMPTY.
Exemple : Appliquer ces opérations aux groupes pair et impair.
Xavier Juvigny Calcul parallèle
Environnement
Communications point à point
Communications collectives
Les communicateurs

Le programme précédent présente cependant quelques


inconvénients. Nous allons voir en réalité que :
nous n’étions pas contraint de nommer différemment ces
deux communicateurs ;
nous n’étions pas obligés de passer par des groupes pour
construire les communicateurs ;
nous n’étions pas non plus contraint de laisser le soin à
MPI d’ordonner le rang des processus dans les
communicateurs ;
pour des raisons de lisibilité et de performances, nous
aurions pu éviter les tests conditionnels, en particuliers
lors de l’appel au sous–programme MPI Bcast.
Le sous–programme MPI Comm split permet de partionner
un communicateur donné en autant de communicateurs que
l’on veut. . .
Xavier Juvigny Calcul parallèle
Environnement
Communications point à point
Communications collectives
Les communicateurs

Syntaxe
const int comm, couleur, clef ;
int nouveau comm, ierr ;
ierr = MPI Comm split(comm, couleur, clef,
&nouveau comm) ;
rang 0 1 2 3 4 5 6 7
couleur 0 * 3 0 3 0 2 3
clef 2 1 0 0 1 3 0 1
∗ ≡ MPI UNDEFINED.

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Exemple avec les communicateurs pair et impair

rang 0 1 2 3 4 5 6 7
couleur 0 1 0 1 0 1 0 1
clef 1 1 0 0 4 5 6 7

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Programme
# include "mpi.h"
# include <stdio.h>
void main(int narg, char** argv)
{
const int m = 16 ;
int clef, couleur ;
int rang, code, nb procs ;
MPI Comm comm ;
float a[m] ;
code = MPI Init(&narg, &argv) ;
code = MPI Comm size(MPI COMM WORLD,&nb procs) ;
code = MPI Comm rank(MPI COMM WORLD,&rang) ;
for ( i = 0 ; i < m ; i++ ) a[i] = 0. ;
if rang == 2 for ( i = 0 ; i < m ; i++ ) a[i] = 2. ;
if rang == 3 for ( i = 0 ; i < m ; i++ ) a[i] = 5. ;
if rang%2 == 0
{
// Couleur et rang des processus pairs
couleur = 0 ;
clef = ( rang == 2 ? 0 : rang == 0 ? 1 : rang ) ;
}
else
{
// Couleur et rang des processus impairs
couleur = 1 ;
clef = ( rang == 3 ? 0 : rang ) ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Programme (suite)
// Créer les communicateurs pair et impair
code = MPI Comm split(MPI COMM WORLD,couleur,clef,&comm) ;
// Le processus 0 de chaque communicateur diffuse
// son message aux processus de son groupe
code = MPI Bcast(a,n,MPI FLOAT,0,MPI COMM WORLD) ;
code = MPI Comm free(&comm) ;
code = MPI Finalize() ;
}

Xavier Juvigny Calcul parallèle


Environnement
Communications point à point
Communications collectives
Les communicateurs

Conclusions
Groupes et contextes définissent un objet appelé
communicateur ;
Les communicateurs définissent la portée des
communications ;
Ils sont utilisés pour dissocier les espaces de
communication ;
Un communicateur doit être spécifié à l’appel de toute
fonction d’échange de message ;
Ils permettent d’éviter les confusions lors de la sélection
des messages, par exemple, au moment de l’appel d’une
fonction d’une bibliothèque scientifique qui elle-même
effectue des échanges de message ;
Les communicateurs offrent une programmation modulaire
du point de vue de l’espace de communication.
Xavier Juvigny Calcul parallèle

Vous aimerez peut-être aussi