• Aucun résultat trouvé

Les communications collectives. Caractéristiques. Communications dans un groupe de processus. Dans un communicateur donné.

N/A
N/A
Protected

Academic year: 2022

Partager "Les communications collectives. Caractéristiques. Communications dans un groupe de processus. Dans un communicateur donné."

Copied!
10
0
0

Texte intégral

(1)

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 !

(2)

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)

(3)

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)

(4)

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 )

(5)

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.

(6)

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.

(7)

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

(8)

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

(9)

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

(10)

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.

Références

Documents relatifs

´ Ecrire un programme qui demande un verrouillage en ´ ecriture des fichiers dont les noms lui sont pass´ es en argument et attend que l’utilisateur ait press´ e la touche Entr´

Changer d’un thread à un autre dans le même processus est bien plus simple et. plus rapide: la sauvegarde des registres de l ’UCT, la pile, et peu

On fait cela tant qu’il y a plusieurs ´el´ements dans le tableau.. Si le tableau est de taille impaire, son ´el´ement central

Avec cmovl on a if(*t&lt;m) m=*t; et la fonction calcule le plus petit ´el´ement.. Avec cmova la comparaison est

int MPI_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm). adresse du

int MPI_Sendrecv (const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int

public void Scatter(Object sendbuf, int sendoffset, int sendcount, Datatype sendtype, Object recvbuf, int recvoffset, int recvcount, Datatype recvtype, int root)

int MPI_Sendrecv (void *sendbuf,int sendcount,MPI_Datatype sendtype, int dest,int sendtag,void *recvbuf,int recvcount,MPI_Datatype recvtype,int source,int recv