Les communications collectives Communications dans un groupe de processus. Dans un communicateur donné. Trois sortes : Synchronisation globale MI_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 ermettent à l utilisateur de faire une série de communications point à point en utilisant une seule fonction Hugues Leroy Cours de DE CH 3.5 / Hugues Leroy Cours de DE CH 3.5 / 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 ttention : tous les processus du communicateur doivent participer. Le nom des primitives est assez ambigü car pour MI_Bcast par exemple (broadcast) un processus fera la diffusion et les autres écouterons (recv). Mais pour tous la primitive se nomme Bcast! Hugues Leroy Cours de DE CH 3.5 / 3 Hugues Leroy Cours de DE CH 3.5 / 4
Barrière de synchronisation C: int MI_Barrier (MI_Comm comm) Fortran: MI_BRRIER (COMM, IERROR) INTEGER COMM, IERROR Hugues Leroy Cours de DE CH 3.5 / 5 Hugues Leroy Cours de DE CH 3.5 / 6 Diffusion générale C: int MI_Bcast ( Fortran: void *buffer, int count, MI_Datatype datatype, int root, MI_Comm comm) MI_BCST (BUFFER, COUNT, DTTYE, ROOT, COMM, IERROR) <type> BUFFER(*) INTEGER COUNT, DTTYE, 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 MI_Recv() par les autres processus du communicateur (tous les processus DOIVENT faire Bcast) Hugues Leroy Cours de DE CH 3.5 / 7 Hugues Leroy Cours de DE CH 3.5 / 8
ar abus de notation on a rajouté une flèche de vers sur le dessin, juste pour rappeler que participe bien au Bcast 3 MI_Bcast(&valeur,,MI_INT,,MI_COMM_WORLD) MI_Bcast 3 3 Hugues Leroy Cours de DE CH 3.5 / 9 Hugues Leroy Cours de DE CH 3.5 / Diffusion sélective : MI_Scatter BCDE 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. BCDE Le paramètre recvcnt est en fait le sizeof(recvbuf) B C D E MI_Scatter ( void *sendbuf, int sendcnt, MI_Datatype sendtype, void *recvbuf, int recvcnt, MI_Datatype recvtype, int root, MI_Comm comm ) (on traite dans l ordre croissant des numéros de processus) Hugues Leroy Cours de DE CH 3.5 / Hugues Leroy Cours de DE CH 3.5 /
Collecte : MI_Gather La remarque sur sendcnt est à retenir... B C D E Le Gather est l opération symétrique du Scatter. On ne peut pas avec Gather recevoir des contributions de tailles diverses. BCDE B C D E MI_Gather ( void *sendbuf, int sendcnt, MI_Datatype sendtype, void *recvbuf, int recvcnt, MI_Datatype recvtype, int root, MI_Comm comm ) ttention : 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. Hugues Leroy Cours de DE CH 3.5 / 3 Hugues Leroy Cours de DE CH 3.5 / 4 Opérations de réduction Opérations sur des valeurs distribuées dans un groupe de processus Exemples : C somme ou produit global maximum ou minimum global opération globale définie par l utilisateur int MI_Reduce ( void *sendbuf,void *recvbuf, int count, MI_Datatype datatype, MI_Op op, int root, MI_Comm comm ) Hugues Leroy Cours de DE CH 3.5 / 5 Hugues Leroy Cours de DE CH 3.5 / 6
Réductions prédéfinies MI_Op MI_MX MI_MIN MI_SUM MI_ROD MI_LND MI_BND MI_LOR MI_BOR MI_LXOR MI_BXOR MI_MXLOC MI_MINLOC Fonction Maximum Minimum Somme roduit ET Logique ET Bit à bit OU Logique OU Bit à bit OU Exclusif Logique OU Exclusif Bit à bit Maximum et indice du maximum Minimum et indice du minimum Hugues Leroy Cours de DE CH 3.5 / 7 Hugues Leroy Cours de DE CH 3.5 / 8 MI_Reduce RNK B C D B C D o est l opérateur de réduction. On traite dans l ordre croissant des numéros de processus. ROOT MI_REDUCE 3 4 oeoiomoq Hugues Leroy Cours de DE CH 3.5 / 9 Hugues Leroy Cours de DE CH 3.5 /
C: Exemple de réduction : Une somme globale d entiers MI_Reduce(&x, &result,, MI_INT, MI_SUM,, MI_COMM_WORLD) ; Fortran: CLL MI_REDUCE( x, result,, MI_INTEGER, MI_SUM,, MI_COMM_WORLD, IERROR) Somme les x de chaque processus et range dans result Le résultat est ici disponible uniquement pour le processus (root) INTEGER MXHT, GLOBMX, IERROR, MYID utre exemple 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 u bout d un certain temps on veut savoir quel est l arbre le plus grand... C Le processus 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 CLL MI_REDUCE ( MXHT, GLOBMX,, MI_INTEGER, MI_MX, *,MI_COMM_WORLD, IERROR) C IF (MYID.EQ.) THEN... ENDIF Hugues Leroy Cours de DE CH 3.5 / Hugues Leroy Cours de DE CH 3.5 / 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 type MI_User_function : Remarque : on n utilisera pas lors de cette formation cette possibilité de définir nos propres opérateurs de réduction. void my_operator ( void *invec, void *inoutvec, int *len, MI_Datatype *datatype) Fortran FUNCTION MY_OERTOR ( INVEC(*), INOUTVEC(*), LEN, DTTYE ) <type> INVEC(LEN), INOUTVEC(LEN) INTEGER LEN, DTTYE Hugues Leroy Cours de DE CH 3.5 / 3 Hugues Leroy Cours de DE CH 3.5 / 4
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 = ; 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...). rofitons 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 DE CH 3.5 / 5 Hugues Leroy Cours de DE CH 3.5 / 6 Enregistrer un opérateur de réduction Son type doit être MI_Op ( C ) ou INTEGER ( Fortran ) C : int MI_Op_create ( MI_User_function *function, int commute, MI_Op *op ) Fortran : MI_O_CRETE ( FUNC, COMMUTE, O, IERROR ) EXTERNL FUNC LOGICL COMMUTE INTEGER O, IERROR Hugues Leroy Cours de DE CH 3.5 / 7 Hugues Leroy Cours de DE CH 3.5 / 8
Variantes de MI_Reduce MI_LLREDUCE : pas de processus root ( tous ont le résultat final ) int MI_llreduce ( void *sendbuf, void *recvbuf, int count, MI_Datatype datatype, MI_Op op, MI_Comm comm ) MI_REDUCE_SCTTER : 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 MI_Reduce_scatter ( void *sendbuf, void *recvbuf, int *recvcnts, MI_Datatype datatype, MI_Op op, MI_Comm comm ) MI_SCN : les processus reçoivent un résultat partiel int MI_Scan ( void *sendbuf, void *recvbuf, int count, MI_Datatype datatype, MI_Op op, MI_Comm comm ) Hugues Leroy Cours de DE CH 3.5 / 9 Hugues Leroy Cours de DE CH 3.5 / 3 MI_llreduce RNK B C D B C D MI_LLREDUCE 3 4 oeoiomoq Hugues Leroy Cours de DE CH 3.5 / 3 Hugues Leroy Cours de DE CH 3.5 / 3
MI_Reduce_scatter RNK recvcounts B C D B C D On traite toujours dans l ordre croissant des numéros de processus. MI_REDUCE_SCTTER 3 4 oeoiomoq Hugues Leroy Cours de DE CH 3.5 / 33 Hugues Leroy Cours de DE CH 3.5 / 34 MI_Scan RNK B C D B C D oe MI_SCN oeoi 3 oeoiom 4 oeoiomoq Hugues Leroy Cours de DE CH 3.5 / 35 Hugues Leroy Cours de DE CH 3.5 / 36
Exercice 5 (Scatter/Gather) Un produit de matrices carrées (à faire en C ou Fortran) C= x B les matrices à multiplier ( et B) sont sur le processus. Celui-ci distribue une tranche horizontale de la matrice et une tranche verticale de B à chacun des processus. Chacun calcule alors un bloc diagonal de C. our le calcul des blocs non diagonaux chaque processus doit envoyer aux autres la tranche de qu il possède. près quoi le processus 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? 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 C Hugues Leroy Cours de DE CH 3.5 / 37 Hugues Leroy Cours de DE CH 3.5 / 38 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 MI_llreduce) 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, puis processus, etc. Hugues Leroy Cours de DE CH 3.5 / 39 Hugues Leroy Cours de DE CH 3.5 / 4