Programmation « non bloquante
Transcription
Programmation « non bloquante
MPI-1 2ième partie : Programmation « non bloquante » et communications de groupe Stéphane Vialle MPI-1 2iè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 [email protected] http://www.metz.supelec.fr/~vialle Communications point à point non bloquantes MPI-1 2ième partie : Programmation « non bloquante » et communications de groupe Principes des comm. Non bloquantes Principes des communications non-bloquantes 6 – Communications point à point 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) • Principes • Ibsend-Irecv • Issend-Irecv • Irsend-Irecv • Identificateurs persistents • Besoin de savoir si les communications sont terminées : → MPI_Wait(request, …) ou MPI_Test(request, …) Comparaison aux communications bloquantes : • Nécessite une synchronisation explicite – Plus complexe • Permet de réaliser du recouvrement calcul-communication Communications point à point non bloquantes Communications point à point non bloquantes Ibsend – Irecv Issend – Irecv Mode synchrone et non-bloquant : MPI_Issend – MPI_Irecv Mode bufferisé et non-bloquant : MPI_Ibsend – MPI_Irecv Rappel : Début Bsend Bsend-Recv send Fin Ibsend transfert send Fin Recv send Fin Recv Recv Fin Issend ack. Début Issend Issend-Irecv Wait transfert Début Recv Ssend signalé Non-bloquant : Recv signalé Wait recv attente recv Début Recv Début Ibsend Ibsend-Irecv Ssend-Recv Recv Fin Ssend ack. Début Ssend Rappel : Recv signalé copie recv Non-bloquant : Fin Bsend Wait Wait send recv Début Irecv Wait Fin Irecv Issend signalé Début Irecv Wait Fin Irecv 1 Communications point à point non bloquantes Communications point à point non bloquantes Irsend – Irecv Identificateurs persistents Mode ready et non-bloquant : MPI_Irsend – MPI_Irecv Autre mode d’utilisation des comm. non bloquantes : Recv Début Fin signalé Rsend Rsend Rappel : Rsend-Recv Loop: MPI_Issend(…,&s_request); MPI_Irecv(…,&r_request); …… // calculs MPI_Wait(&s_request,…); MPI_Wait(&r_request,…); send recv transfert Début Recv Non-bloquant : Fin Recv Irecv Début Fin signalé Irsend Irsend Wait Wait Irsend-Irecv send MPI_Ssend_init(…,&s_request); MPI_Recv_init(…,&r_request); Loop: MPI_Start(&s_request); …… // calculs MPI_Wait(&s_request,…); MPI_Start(&r_request); MPI_Wait(&r_request,…); MPI_Request_free(&s_request); MPI_Request_free(&r_request); recv Début Irecv Wait Fin Irecv → Evite de réinitialiser des communications non-bloquantes Communications de groupe Principes des comm. de groupe MPI-1 2ième partie : Programmation « non bloquante » et communications de groupe 5 types principaux : Broadcast Scatter Gather Reduce(op) 7 – Communications de groupe = op(op( p( p( ), ),op( p( ), op( ),op( )) • Principes des communications de groupe • Broadcast • Scatter • Gather • Reduce + 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/Recv !! Communications de groupe Communications de groupe Scatter 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 */ comm root datatype datatype …… datatype Généralisation : MPI_Alltoall et count MPI_Alltoallv • Chaque processus exécute MPI_Bcast (différemment !) • Chaque processus utilise sa propre adresse de buffer 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*/ MPI_Datatype elements / int root; /* Rank of sending process */ MPI_Comm comm; /* Communicator */ comm root 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) 2 Communications de groupe Communications de groupe Gather Reduce 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 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 R k off receiving i i process MPI_Comm comm; /* Communicator comm root sendtype sendtype sendcnt …… sendtype Généralisation : MPI_Gatherv, */ */ */ */ */ */ */ */ • Chaque processus exécute MPI_Gather (différemment) • Chaque processus utilise sa propre adresse de sendbuf MPI_Allgather, int MPI_Reduce(sendbuf,recvbuf,count,datatype,op,root,comm) /* Address of send buffer */ void *sendbuf; 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 */ 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 comm root MPI_Op_create() = op(op( ),op( ), op( ),op( )) Généralisation : MPI_Allreduce, MPI_Reduce_scatter → les résultats sont redistribués MPI_Allgatherv Produit de matrices denses sur anneau Rappel d’algorithmique distribuée MPI-1 2ième partie : Programmation « non bloquante » et communications de groupe Partitionnement sur un anneau de processeurs : 8 – Produit de matrices denses sur • A partitionnée en blocs de lignes • B et C partitionnées en blocs de colonnes • circulation de A • B et C statiques anneau avec recouvrement 0 1 P-1 • Algorithme distribué • Modélisation des performances • Exemples de performances Topologie Partitionnement et circulation de A Partitionnement statique de B Partitionnement statique de C Produit de matrices denses sur anneau Produit de matrices denses sur anneau avec recouvrement Rappel d’algorithmique distribuée Algorithme distribué Exemple de déroulement de l’algorithme sur PE-2, avec P = 4 : B B B B A A É Étape 1 C A A É É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. • Résultats après P étapes (seulement) : 0 1 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(); } 1er algorithme : avec barrières conceptuelles P-1 Topologie Partitionnement statique de C Les barrières de synchronisations sont parfois implicites … Voir à Les barrières apparaissent parfois inutiles … l’implant. 3 Produit de matrices denses sur anneau Produit de matrices denses sur anneau avec recouvrement Implant. en MPI-1 à comm. non-bloquantes Exemple de performances Ibsend Issend 120 Texec(s) Æ voir BE-4! • 12 x P4- 3GHz - 2Go Ram • Ethernet Gigabit • 3 switchs Texec(P) 150 Implantation MPI-1 par communications Non-bloquantes et recouv. 90 60 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 1 2 Mflops La perte de performances persiste : • Elle n’est pas due au comm. • Amdahl ? • Calculs locaux trop petits ? Speed Up 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC Produit de matrices denses sur anneau avec recouvrement Exemple de performances Exemple de performances Speed Up(P) • 12 x P4- 3GHz - 2Go Ram • Ethernet Gigabit • 3 switchs Ibsend Issend Idéal 11 3 Produit de matrices denses sur anneau avec recouvrement 15 13 Mflops(P) Ibsend Issend Idéal 9 Avec un réseau moins bon le recouvrement a un impact! • 12 x P3 - 700MHz • Fast Ethernet • 3 switchs 7 5 3 1 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. Efficacité(P) M F lo p s 2 80 e(%) 1 60 40 Ibsend Issend 20 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC 1300 1200 1100 1000 900 800 700 600 500 400 300 200 100 0 Ring-Sendrecv-replace Ring Irsend Ring-Irsend Ring-Irsend+overlapp • Messages non-bloquant bl plus rapides. • Messages non-bloquant & recouvrement encore plus rapide. 1 2 3 4 5 6 7 8 9 10 11 12 13 Number of nodes • Recouvrement efficace! MPI : Programmation et algorithmique distribuée Bilan de programmation MPI MPI-1 2ième partie : Programmation « non bloquante » et communications de groupe 9 – 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 4 Comparaison de clusters Comparaisons de speedup de Jacobi Comparaison des meilleurs Speed Up des 4 réseaux sur 2 nœuds : 9 8 Speed Up (2) A – Comparaisons performances/coûts de 4 clusters • Comparaison de speedup de Jacobi • Mflops/Euros SU(2)-Myrinet-Sendrecv SU(2)-Gigabit-Sendrecv SU(2)-EthGamma-Sendrecv SU(2)-FastEth-Sendrecv SU(2) FastEth Sendrecv 7 6 5 4 3 2 1 0 0 250 500 750 1000 1250 1500 Problem size (KBytes) Comparaison de clusters Comparaison de clusters Coût Mflops/Euro du Jacobi Coût Mflops/Euro du Jacobi 0,3 0,2 PIV-Xeon 0,1 0 0 250 500 750 1000 Problem size (KBytes) Clusters ! 1250 1500 Myrinet revient cher, les solutions à « 0 copies » sont très rentables : M F lo p s /E u ro M Flops/Euro Le Mflops des clusters reste toujours plus cher qu’en séquentiel : 0,9 mpirun -np 1 - PIII-1GHz 0,8 PIII mpirun -np 1 PIV-X-2.4GHz 0,7 Myrinet (2) Gigabit (2) 0,6 Fast-Eth+Gamma ((2)) 05 0,5 Fast-Ethernet (2) 0,4 0,2 0,18 0,16 0,14 0,12 01 0,1 0,08 0,06 0,04 0,02 0 Myrinet-PIII (2) Gigabit-PIV-Xeon (2) Fast-Eth+Gamma-PIII (2) Fast-Ethernet-PIII (2) « Eth-0 copies » Myrinet 0 250 500 750 1000 Problem size (KBytes) 1250 1500 MPI-1 2ième partie : Programmation « non bloquante » et communications de groupe FIN 5