Hugues Leroy Cours de DEA CH 3.5 / 1
Les communications collectives
❑ Communications dans un groupe de processus.
❑ Dans un communicateur donné.
❑ Trois sortes :
■ Synchronisation globale MPI_Barrier()
■ Transferts de données : diffusion/collecte globale/sélective (Broadcast, scatter, gather)
■ Opérations de réduction : somme globale, maximum global, etc.
suivies éventuellement d’une diffusion du résultat à tous les participants
❑ Permettent à l’utilisateur de faire une série de communications point à point en utilisant une seule fonction
Hugues Leroy Cours de DEA CH 3.5 / 2
Caractéristiques
■ C’est une action collective dans un communicateur
■ Tous les processus de ce communicateur doivent participer
■ Une synchronisation peut avoir lieu (ce n’est pas toujours le cas)
■ Toutes ces opérations sont bloquantes
■ On ne spécifie pas d’étiquette (cette gestion est à la charge du système, il n’y aura pas d’interférences avec les autres communications)
■ Les tampons de réception doivent avoir exactement la même taille
■ Les types de données doivent évidemment être les mêmes
Attention : tous les processus du communicateur doivent participer.
Le nom des primitives est assez ambigü car pour MPI_Bcast par exemple (broad- cast) un processus fera la diffusion et les autres écouterons (recv). Mais pour tous la primitive se nomme Bcast !
Hugues Leroy Cours de DEA CH 3.5 / 5
Barrière de synchronisation
❑ C:
int MPI_Barrier (MPI_Comm comm)
❑ Fortran:
MPI_BARRIER (COMM, IERROR) INTEGER COMM, IERROR
Hugues Leroy Cours de DEA CH 3.5 / 6
Diffusion générale
❑ C:
int MPI_Bcast ( void *buffer, int count,
MPI_Datatype datatype, int root, MPI_Comm comm)
❑ Fortran:
MPI_BCAST (BUFFER, COUNT, DATATYPE, ROOT, COMM, IERROR)
<type> BUFFER(*)
INTEGER COUNT, DATATYPE, ROOT, COMM, IERROR
Il n’y a pas de multicast : un broadcast effectué par le processus root ne peut pas être reçu par un MPI_Recv() par les autres processus du communicateur (tous les processus DOIVENT faire Bcast)
Hugues Leroy Cours de DEA CH 3.5 / 9 2
0
1
3
A A
A
A
P0 P1 P2 P3
A
P0 P1 P2 P3
A
A A MPI_Bcast
MPI_Bcast(&valeur,1,MPI_INT,2,MPI_COMM_WORLD)
A
Hugues Leroy Cours de DEA CH 3.5 / 10
Par abus de notation on a rajouté une flèche de P2 vers P2 sur le dessin, juste pour rappeler que P2 participe bien au Bcast
Diffusion sélective : MPI_Scatter
MPI_Scatter ( void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm ) (on traite dans l’ordre croissant des numéros de processus)
A B C D E
A B C D E
A B C D E
On distribue dans l’ordre croissant des numéros de processus.
Les processus reçoivent tous le même nombre d’éléments : “sendcnt” divisé par le nb de processus du communicateur.
Le paramètre recvcnt est en fait le sizeof(recvbuf)
Hugues Leroy Cours de DEA CH 3.5 / 13
Collecte : MPI_Gather
MPI_Gather ( void *sendbuf, int sendcnt, MPI_Datatype sendtype, void *recvbuf, int recvcnt, MPI_Datatype recvtype, int root, MPI_Comm comm )
Attention : recvcnt doit être égal à sendcnt, et non pas égal à la somme S de tous les sendcnt.
Le tampon de reception recvbuf devra bien entendu avoir une taille d’au moins S.
A B C D E
A B C D E
A B C D E
Hugues Leroy Cours de DEA CH 3.5 / 14
La remarque sur sendcnt est à retenir...
Le Gather est l’opération symétrique du Scatter.
On ne peut pas avec Gather recevoir des contributions de tailles diverses.
Opérations de réduction
❑ Opérations sur des valeurs distribuées dans un groupe de processus
❑ Exemples :
■ somme ou produit global
■ maximum ou minimum global
■ opération globale définie par l’utilisateur
❑ C
int MPI_Reduce ( void *sendbuf,void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm )
Hugues Leroy Cours de DEA CH 3.5 / 17
Réductions prédéfinies
MPI_Op Fonction
MPI_MAX Maximum
MPI_MIN Minimum
MPI_SUM Somme
MPI_PROD Produit
MPI_LAND ET Logique MPI_BAND ET Bit à bit
MPI_LOR OU Logique
MPI_BOR OU Bit à bit MPI_LXOR OU Exclusif Logique MPI_BXOR OU Exclusif Bit à bit
MPI_MAXLOC Maximum et indice du maximum MPI_MINLOC Minimum et indice du minimum
Hugues Leroy Cours de DEA CH 3.5 / 18
MPI_Reduce
1
2
3
4 RANK
ROOT A B C D
MPI_REDUCE 0
Q R S T F G H E F
K L I NJ
P M N NO
A B C D
Q R S T F G H E F
K L I NJ
P M N NO
AoEoIoMoQ
“o” est l’opérateur de réduction. On traite dans l’ordre croissant des numéros de processus.
Hugues Leroy Cours de DEA CH 3.5 / 21
Exemple de réduction : Une somme globale d’entiers
❑ C:
MPI_Reduce(&x, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD) ;
❑ Fortran:
CALL MPI_REDUCE( x, result, 1, MPI_INTEGER, MPI_SUM, 0, MPI_COMM_WORLD, IERROR)
❑ Somme lesx de chaque processus et range dansresult
❑ Le résultat est ici disponible uniquement pour le processus 0 (root)
Hugues Leroy Cours de DEA CH 3.5 / 22
Autre exemple
INTEGER MAXHT, GLOBMAX, IERROR, MYID
C On a une simulation de croissance d’arbres dans une forêt. On a parallélisé C en attribuant à chaque processus une partie de la forêt.
C Au bout d’un certain temps on veut savoir quel est l’arbre le plus grand ...
C Le processus 0 sera celui qui connaitra la taille max de tous les arbres de la forêt C
C Chaque processus trouve l’arbre le plus haut de son coin de forêt ...ici un calcul ...
C
CALL MPI_REDUCE ( MAXHT, GLOBMAX, 1, MPI_INTEGER, MPI_MAX,
* 0,MPI_COMM_WORLD, IERROR) C
IF (MYID.EQ.0) THEN ...
ENDIF
Opération de réduction définie par l’utilisateur
❑ Dans la suite on note par “o” l’opérateur de réduction
❑ C - la fonction est du typeMPI_User_function :
void my_operator ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype)
❑ Fortran
FUNCTION MY_OPERATOR ( INVEC(*), INOUTVEC(*), LEN, DATATYPE )
<type> INVEC(LEN), INOUTVEC(LEN) INTEGER LEN, DATATYPE
Remarque : on n’utilisera pas lors de cette formation cette possibilité de définir nos propres opérateurs de réduction.
Hugues Leroy Cours de DEA CH 3.5 / 25
Définition de l’opérateur de réduction
❑ la fonction associée à cet opérateur “o” s’applique aux éléments des vecteurs d’entrée et sortie comme suit :
for (i = 0; i < len ; i++ )
inoutvec(i) = inoutvec(i) “o” invec(i)
❑ l’opérator ”o” n’est pas forcément commutatif
❑ il y a associativité, mais cette propriété n’est pas forcément vérifiée avec les nombres réels (troncatures...). Profitons de cette occasion pour rappeler qu’un bon algorithme doit toujours se préoccuper de la précision des calculs et de la validité des résultats...
Hugues Leroy Cours de DEA CH 3.5 / 26
Enregistrer un opérateur de réduction
Son type doit êtreMPI_Op ( C ) ouINTEGER ( Fortran )
❑ C :
int MPI_Op_create ( MPI_User_function *function, int commute, MPI_Op *op )
❑ Fortran :
MPI_OP_CREATE ( FUNC, COMMUTE, OP, IERROR ) EXTERNAL FUNC
LOGICAL COMMUTE INTEGER OP, IERROR
Hugues Leroy Cours de DEA CH 3.5 / 29
Variantes de MPI_Reduce
❑ MPI_ALLREDUCE : pas de processus root ( tous ont le résultat final ) int MPI_Allreduce ( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
MPI_Op op, MPI_Comm comm )
❑ MPI_REDUCE_SCATTER : les processus choissisent de recevoir une certaine partie du résultat. Ces parties sont distribuées dans l’ordre des numéros (rangs) de processus.
int MPI_Reduce_scatter ( void *sendbuf, void *recvbuf, int *recvcnts, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )
❑ MPI_SCAN : les processus reçoivent un résultat partiel
int MPI_Scan ( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )
Hugues Leroy Cours de DEA CH 3.5 / 30
MPI_Allreduce
1
2
3
4 RANK
A B C D 0
Q R S T F G H E F
K L I NJ
P M N NO
A B C D
Q R S T F G H E F
K L I NJ
P M N NO MPI_ALLREDUCE
AoEoIoMoQ
Hugues Leroy Cours de DEA CH 3.5 / 33
MPI_Reduce_scatter
1
2
3
4 RANK
A B C D
0
Q R S T F G H E F
K L I NJ
P M N NO
A B C D
Q R S T F G H E F
K L I NJ
P M N NO MPI_REDUCE_SCATTER recvcounts
1
0
2
0
1
AoEoIoMoQ
Hugues Leroy Cours de DEA CH 3.5 / 34
On traite toujours dans l’ordre croissant des numéros de processus.
MPI_Scan
1
2
3
4 RANK
A B C D
0
Q R S T F G H E F
K L I NJ
P M N NO
A B C D
Q R S T F G H E F
K L I NJ
P M N NO MPI_SCAN
AoEoIoMoQ A
AoE
AoEoI
AoEoIoM
Hugues Leroy Cours de DEA CH 3.5 / 37
Exercice 5 (Scatter/Gather)
Un produit de matrices carrées (à faire en C ou Fortran) C= A x B
■ les matrices à multiplier (A et B) sont sur le processus 0. Celui-ci distribue une tranche horizontale de la matrice A et une tranche verticale de B à chacun des processus. Chacun calcule alors un bloc diagonal de C. Pour le calcul des blocs non diagonaux chaque processus doit envoyer aux autres la tranche de A qu’il possède.
■ Après quoi le processus 0 peut collecter les résultats et les imprimer.
■ Faire l’étude de mise à l’échelle (scalability) correspondante. Essayez aussi pour le produit matrice vecteur. Que peut-on en déduire ?
Hugues Leroy Cours de DEA CH 3.5 / 38
Insister sur le calcul de mise à l’échelle. Bien noter les volumes de calcul et les volumes échangés, puis évaluer le ratio Tcomm / Tcalc.
Si on a n processus on utilisera une matrice carrée d’ordre multiple de n.
N’oubliez pas de vérifier que vous avez bien le bon résultat !
. . . .
. . . .
. .
. .
B
A
C
Exercice 6
■ En tirant à pile ou face sur chacun des processus, boucler jusqu’à ce que tous les processus fassent le même choix ou bien jusqu’à ce qu’on atteigne un nombre - fixé à priori - d’essais. (utiliser MPI_Allreduce)
Exercice 7
■ Transformer le programme de l’anneau : pour calculer la somme, utiliser une opération de réduction globale.
■ Ensuite transformer le programme pour que chaque processus calcule une somme partielle.
■ Enfin chaque processus doit imprimer sa somme partielle, mais dans le bon ordre : processus 0, puis processus 1, etc.