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