3A-SI Programmation parallèle MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe Stéphane Vialle Stephane.Vialle@supelec.fr http://www.metz.supelec.fr/~vialle MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe 6 Communications point à point non bloquantes 7 Communications de groupe 8 Produit de matrices denses sur anneau avec recouvrement 9 Bilan de programmation MPI A Comparaisons performances/coûts de 4 clusters B Produit de matrices denses sur tore 1
MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe 6 Communications point à point non bloquantes Principes Ibsend-IrecvIrecv Issend-Irecv Irsend-Irecv Identificateurs persistents Communications point à point non bloquantes Principes des comm. Non bloquantes Principes des communications non-bloquantes MPI_Ixxxx(, MPI_Request *request) Ibsend/Irecv - Issend/Irecv - Irsend/Irecv Isend ET Irecv non bloquants Un paramètre de plus que leurs homologues bloquants : Id sur la communication demandée (MPI_Request) Besoin de savoir si les communications sont terminées : MPI_(request, ) ou MPI_Test(request, ) Comparaison aux communications bloquantes : Nécessite une synchronisation explicite Plus complexe Permet de réaliser du recouvrement calcul-communication 2
Communications point à point non bloquantes Ibsend Irecv Mode bufferisé et non-bloquant : MPI_Ibsend MPI_Irecv Rappel : Bsend- send recv Non-bloquant : Ibsend-Irecv send recv Bsend Bsend signalé copie transfert Ibsend Ibsend signalé Irecv Irecv Communications point à point non bloquantes Issend Irecv Mode synchrone et non-bloquant : MPI_Issend MPI_Irecv Rappel : Ssend- Non-bloquant : Issend-Irecv send recv send recv Ssend Ssend signalé Issend Issend signalé attente Irecv ack. ack. Ssend transfert Issend Irecv 3
Communications point à point non bloquantes Irsend Irecv Mode ready et non-bloquant : MPI_Irsend MPI_Irecv Rappel : Rsend- Non-bloquant : Irsend-Irecv send recv send recv signalé Irecv signalé Irecv Rsend Rsend transfert Irsend Irsend Irecv Communications point à point non bloquantes Identificateurs persistents Autre mode d utilisation des comm. non bloquantes : Loop: MPI_Issend(,&s_request); Issend( MPI_Irecv(,&r_request); Irecv( request); // calculs MPI_(&s_request, ); MPI_(&r_request, ); MPI_Ssend_init(,&s_request); MPI init(,&r_request); Loop: MPI_ Start(&s _ request); MPI_ Start(&r _ request); // calculs MPI_(&s_request, ); MPI_(&r_request, ); MPI_Request_free(&s_request); MPI_Request_free(&r_request); Evite de réinitialiser des communications non-bloquantes 4
MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe 7 Communications de groupe Principes des communications de groupe Broadcast Scatter Gather Reduce Communications de groupe Principes des comm. de groupe 5 types principaux : Broadcast Scatter Gather Reduce(op) + les barrières! Utilisent les communicator et les groupes de processus Opérations bloquantes Des variantes existent : all-reduce, all-to-all, scatterv, Routage optimisé selon le réseau sous-jacent arborescent linéaire sur bus parfois plus lent que des Send/!! = op(op( ),op( ), op( ),op( )) 5
Communications de groupe Broadcast int MPI_Bcast(buffer,count,datatype,root,comm ) void *buffer; /* Starting address of buffer */ int count; /* Number of entries in buffer (integer) */ MPI_Datatype datatype; /* Data type of buffer */ int root; /* Rank of broadcast root (integer) */ MPI_Comm comm; /* Communicator */ root comm datatype count (différemment!) datatype Chaque processus utilise sa propre datatype Chaque processus exécute MPI_Bcast adresse de buffer Généralisation : MPI_Alltoall et MPI_Alltoallv Communications de groupe Scatter int MPI_Scatter(sendbuf,sendcnt,sendtype, recvbuf,recvcnt,recvtype, root,comm) void *sendbuf; /* Address of send buffer */ int sendcnt; /* Number of elements sent to each process */ MPI_Datatype sendtype; /* Data type of send buffer elements */ void *recvbuf; /* Address of receive buffer */ int recvcnt; /* Number of elements in receive buffer */ MPI_Datatype recvtype; /* Data type of receive buffer elements*/ int root; /* Rank of sending process */ MPI_Comm comm; /* Communicator */ root comm sendtype sendcnt Chaque processus exécute MPI_Scatter (différemment) Chaque processus utilise sa propre adresse de recvbuf Variante : MPI_Scatterv (avec décalage explicite des données) 6
Communications de groupe Gather int MPI_Gather(sendbuf,sendcnt,sendtype, recvbuf,recvcount,recvtype, root,comm) void *sendbuf; /* Starting address of send buffer */ int sendcnt; /* Number of elements in send buffer */ MPI_Datatype t sendtype; /* Data type of send buffer elements */ void *recvbuf; /* Address of receive buffer */ int recvcount; /* Number of elements for any single receive */ MPI_Datatype recvtype; /* Data type of recv buffer elements */ int root; /* Rank of receiving process */ MPI_Comm comm; /* Communicator */ root comm sendtype Chaque processus exécute sendtype MPI_Gather (différemment) sendcnt Chaque processus utilise sa sendtype propre adresse de sendbuf Généralisation : MPI_Gatherv, MPI_Allgather, MPI_Allgatherv Communications de groupe Reduce int MPI_Reduce(sendbuf,recvbuf,count,datatype,op,root,comm) void *sendbuf; /* Address of send buffer */ void *recvbuf; /* Address of receive buffer */ int count; /* Number of elements in send buffer */ MPI_Datatype datatype; /* Data type of elements of send buffer */ MPI_Op op; /* Reduce operation */ int root; /* Rank of root process */ MPI_Comm comm; /* Communicator */ root comm Reduce operations : MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD MPI_ LAND,, MPI_ BAND,, MPI_ LOR,, MPI_ BOR MPI_LXOR, MPI_BXOR, MPI_MINLOC + définition de nouvelles opérations par MPI_Op_create() = op(op( ),op( ), op( ),op( )) Généralisation : MPI_Allreduce, MPI_Reduce_scatter les résultats sont redistribués 7
MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe 8 Produit de matrices denses sur anneau avec recouvrement Algorithme distribué Modélisation des performances Exemples de performances Produit de matrices denses sur anneau Rappel d algorithmique distribuée Partitionnement sur un anneau de processeurs : A partitionnée en blocs de lignes B et C partitionnées en blocs de colonnes circulation de A B et C statiques 0 1 P-1 Topologie Partitionnement et circulation de A Partitionnement statique de B Partitionnement statique de C 8
Produit de matrices denses sur anneau Rappel d algorithmique distribuée Exemple de déroulement de l algorithme sur PE-2, avec P = 4 : B B B B A A A A Étape 1 C Étape 2 C Étape 3 C Étape 4 C Calcul de toutes les colonnes et routage de toutes les lignes de A en parallèle, en P=4étapes étapes. Résultats après P étapes (seulement) : 0 1 P-1 Topologie Partitionnement statique de C Produit de matrices denses sur anneau avec recouvrement Algorithme distribué Stratégies d implantation sur un anneau de P processeurs : Sans recouvrement : for (i=0; i<p; i++) calcul(); barriere(); circulation(); barriere(); } Avec recouvrement : for (i=0; i<p; i++) par { calcul(); circulation(); } barriere(); buffer_permut(); } 1 er algorithme : avec barrières conceptuelles Les barrières de synchronisations sont parfois implicites Les barrières apparaissent parfois inutiles Voir à l implant. 9
Produit de matrices denses sur anneau Implant. en MPI-1 à comm. non-bloquantes Using Issend and Irecv : void ComputationAndCirculation() { MPI_Request RqSend[2], Rq[2]; MPI_Status StSend, St; // Start computation and circulation loop for (int step = 0; step < NbPE; step++) { // - run asynchronous communications MPI_Issend(& A[step%2][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE, (Me-1+NbPE)%NbPE,0,MPI_COMM_WORLD,&RqSend[step%2]); MPI_Irecv(&A[(step+1)%2][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE, } } (Me+1)%NbPE,0,MPI_COMM_WORLD,&Rq[(step+1)%2]); MPI // - run local computations SeqLocalProduct(step); // - wait the end of the asynchronous communications MPI_(&RqSend[step%2],&StSend); MPI_(&Rq[(step+1)%2],&St); Produit de matrices denses sur anneau Implant. en MPI-1 à comm. non-bloquantes Avec des communications asynchrones et persistantes: void ComputationAndCirculation() { MPI_Request RqSend[2], Rq[2]; MPI_Status StSend, St; // Init of persistent comm MPI_Ssend_init(& A[0][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE, (Me-1+NbPE)%NbPE,0,MPI_COMM_WORLD,&RqSend[0]); MPI init(&a[0][0][0],size*local_size,mpi_double, (Me+1)%NbPE,0,MPI_COMM_WORLD,&Rq[0]); MPI_Ssend_init(&A[1][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE, (Me-1+NbPE)%NbPE,0,MPI_COMM_WORLD,&RqSend[1]); MPI init(&a[1][0][0],size*local_size,mpi_double, (Me+1)%NbPE,0,MPI_COMM_WORLD,&Rq[1]); // Start computation and circulation loop for (int step = 0; step < NbPE; step++) { MPI_Start(&RqSend[step%2]); MPI_Start(&Rq[(step+1)%2]); SeqLocalProduct(step); MPI_(&RqSend[step%2],&StSend); MPI_(&Rq[(step+1)%2],&St); } // Free the persistent communication objects MPI_Request_free(&RqSend[0]); MPI_Request_free(&RqSend[1]); MPI_Request_free(&Rq[0]); MPI_Request_free(&Rq[1]); } 10
Produit de matrices denses sur anneau avec recouvrement Exemple de performances Texec c(s) 150 120 90 60 Texec(P) Ibsend Issend 12 x P4-3GHz - 2Go Ram Ethernet Gigabit 3 switchs 30 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC 10000 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 La perte de performances persiste : Elle n est pas due au comm. Amdahl? Calculs locaux trop petits? Mflops Ibsend Issend Idéal Mflops(P) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC Spee ed Up 15 13 11 9 7 5 3 1 Produit de matrices denses sur anneau avec recouvrement Exemple de performances Ibsend Issend Idéal Speed Up(P) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC 100 Les communications sont négligeables dans cette implantation! Donc le recouvrement apporte peu sur un bon réseau. e(%) 80 60 40 20 0 12 x P4-3GHz - 2Go Ram Ethernet Gigabit 3 switchs Efficacité(P) Ibsend Issend 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC 11
Produit de matrices denses sur anneau avec recouvrement Exemple de performances Avec un réseau moins bon le recouvrement a un impact! 12 x P3-700MHz Fast Ethernet 3 switchs Flop s M 1300 1200 1100 1000 900 800 700 600 500 400 300 200 100 0 Ring-Sendrecv-replace Ring-Irsend Ring-Irsend+overlapp 1 2 3 4 5 6 7 8 9 10 11 12 13 Number of nodes Messages non-bloquant plus rapides. Messages non-bloquant & recouvrement encore plus rapide. Recouvrement efficace! MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe 9 Bilan de programmation MPI 12
MPI : Programmation et algorithmique distribuée Bilan de programmation MPI Avantages : Création de P processus dès le lancement Porté sur la plus large gamme d architecture possible Une grande variété d envois de messages possibles Aujourd hui : thread-safe, - ex : mixable avec OpenMP sur cluster de PC bi-pro. Inconvénients : Des différences de performances selon -le type d envois de messages - l application (volume et fréquence des comms) - l architecture employée Des synchronisations parfois complexes Demande une modification importante du code séquentiel - conception parallèle à part entière A Comparaisons performances/coûts de 4 clusters Comparaison de speedup de Jacobi Comparaison de speedup de Jacobi Mflops/Euros 13
Comparaison de clusters Comparaisons de speedup de Jacobi Comparaison des meilleurs Speed Up des 4 réseaux sur 2 nœuds : Speed Up (2) 9 8 7 6 5 4 3 2 1 0 SU(2)-Myrinet-Sendrecv Sendrecv SU(2)-Gigabit-Sendrecv SU(2)-EthGamma-Sendrecv SU(2)-FastEth-Sendrecv 0 250 500 750 1000 1250 1500 Problem size (KBytes) Comparaison de clusters Coût Mflops/Euro du Jacobi Le Mflops des clusters reste toujours plus cher qu en séquentiel : 0,9 mpirun -np 1 - PIII-1GHz 0,8 PIII mpirun -np1piv-x-2.4ghz PIVX2.4GHz 0,7 Myrinet (2) 0,6 Gigabit (2) Fast-Eth+Gamma (2) 0,5 Fast-Ethernet (2) 0,4 MFlops/Euro 0,3 0,2 0,1 0 PIV-Xeon Clusters! 0 250 500 750 1000 1250 1500 Problem size (KBytes) 14
Comparaison de clusters Coût Mflops/Euro du Jacobi Myrinet revient cher, les solutions à «0 copies» sont très rentables : 0,2 0,18 Myrinet-PIII (2) 016 0,16 Gigabit-PIV-Xeon (2) 0,14 Fast-Eth+Gamma-PIII (2) 0,12 Fast-Ethernet-PIII (2) 0,1 «Eth-0 copies» 0,08 0,06 0,04 0,02 Myrinet 0 MFlops/Euro 0 250 500 750 1000 1250 1500 Problem size (KBytes) MPI-1 2ème partie : Programmation «non bloquante»et communications de groupe FIN 15