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