MPI-1 2ème partie : Programmation «non bloquante» et communications de groupe

Texte intégral

(1)

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 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

(2)

MPI-1 2ème partie :

Programmation « non bloquante » et communications de groupe

6 – Communications point à point

6 – Communications point à point non bloquantes

• Principes

• Ibsend Irecv

• Ibsend-Irecv

• Issend-Irecv

• Irsend-Irecv

• Identificateurs persistents

MPI_Ixxxx(…, MPI_Request *request)

Communications point à point non bloquantes

Principes des comm. Non bloquantes

Principes des communications non-bloquantes

Ibsend/Irecv - Issend/Irecv - Irsend/Irecv

IsendETIrecvnon 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_Wait(request, …) ou MPI_Test(request, …)

• Nécessite une synchronisation explicite – Plus complexe

• Permet de réaliser du recouvrement calcul-communication Comparaison aux communications bloquantes :

(3)

Communications point à point non bloquantes

Ibsend – Irecv

Rappel :

Mode bufferisé et non-bloquant : MPI_IbsendMPI_Irecv

Début Fin Recv

Rappel :

Bsend-Recv

Non bloquant : send recv

Début

Bsend Fin Bsend

copie

transfert

Début

Recv Fin

Recv Recvsignalé

Déb Fi Recv

Non-bloquant :

Ibsend-Irecv

send recv

Début

Ibsend Fin Ibsend

Début Irecv

Fin Irecv Recvsignalé

Wait

Wait

Wait

Communications point à point non bloquantes

Issend – Irecv

Début Ssend

Fin Ssend Recvack.

Mode synchrone et non-bloquant : MPI_IssendMPI_Irecv

Rappel :

send

recv transfert

Début

Recv Fin

Recv

attente

Ssend signalé

Début Recv Fin

Rappel :

Ssend-Recv

Non bloquant :

send recv

Début Issend

Fin Issend

Début

Irecv Fin

Irecv Recvack.

Issend signalé

Wait

Wait

Wait

Non-bloquant :

Issend-Irecv

(4)

Communications point à point non bloquantes

Irsend – Irecv

Mode ready et non-bloquant : MPI_IrsendMPI_Irecv

Début Rsend Fin

Rsend signaléRecv

Rappel :

send

recv transfert

Début

Recv Fin

Recv Début Fin

Irecv

Rappel :

Rsend-Recv

Non bloquant :

send recv

Début

Irsend Fin Irsend

Début

Irecv Fin

Irecv Irecv

signalé

Wait Wait

Wait

Non-bloquant :

Irsend-Irecv

Communications point à point non bloquantes

Identificateurs persistents

Autre mode d’utilisation des comm. non bloquantes : Loop:

MPI Issend( &s request); MPI Irecv( &r request);

MPI_Issend(…,&s_request); MPI_Irecv(…,&r_request);

…… // calculs

MPI_Wait(&s_request,…); MPI_Wait(&r_request,…);

MPI_Ssend_init(…,&s_request); MPI_Recv_init(…,&r_request);

Loop:

MPI Start(&s request); MPI Start(&r request);_ ( _ q ); _ ( _ q );

…… // calculs

MPI_Wait(&s_request,…); MPI_Wait(&r_request,…);

MPI_Request_free(&s_request);

MPI_Request_free(&r_request);

→ Evite de réinitialiser des communications non-bloquantes

(5)

MPI-1 2ème partie :

Programmation « non bloquante » et communications de groupe

7 – Communications de groupe

• Principes des communications de groupe

B d t

• Broadcast

• Scatter

• Gather

• Reduce

Communications de groupe

Principes des comm. de groupe

5 types principaux :

Broadcast Scatter Gather Reduce(op)

= op(op( ),op( ), op( ),op( ))

• Utilisent lescommunicatoret les groupes de processus + les barrières !

Routage optimisé selon le réseau sous-jacent

→arborescent – linéaire – sur bus – …

→parfois plus lent que des Send/Recv !!

• Utilisent les communicatoret les groupes de processus

• Opérations bloquantes

• Des variantes existent : all-reduce, all-to-all, scatterv, …

(6)

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) */

comm

root datatype

datatype

count

• Chaque processus exécute MPI_Bcast

(différemment !)

MPI_Datatype datatype; /* Data type of buffer */

int root; /* Rank of broadcast root (integer) */

MPI_Comm comm; /* Communicator */

……

datatype

count (différemment !)

• Chaque processus utilise sa propre 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 */p

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 */

Ch é

t comm

sendtype • Chaque processus exécute

MPI_Scatter (différemment)

• Chaque processus utilise sa propre adresse de recvbuf root sendtype

…… sendcnt

Variante :MPI_Scatterv (avec décalage explicite des données)

(7)

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 D t t dt /* D t t f d b ff l t */

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 of receiving process */

MPI_Comm comm; /* Communicator */

root

comm

sendtype • Chaque processus exécute

sendtype sendtype

……

sendtype

sendcnt

q p

MPI_Gather (différemment)

• Chaque processus utilise sa 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 */

/* f l f d b ff */

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

= op(op( ),op( ), op( ),op( ))

_ , _ , _ , _

MPI_LXOR, MPI_BXOR, MPI_MINLOC

+ définition de nouvelles opérations par

MPI_Op_create()

Généralisation :

MPI_Allreduce, MPI_Reduce_scatter

→ les résultats sont redistribués

(8)

MPI-1 2ème partie :

Programmation « non bloquante » et communications de groupe

8 – Produit de matrices denses sur anneau avec recouvrement

• Algorithme distribué

• 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 :

• circulation de A

• A partitionnée en blocs de lignes

Topologie

0 1 P-1

• circulation de A

• B et C statiques

• A partitionnée en blocs de lignes

• B et C partitionnées en blocs de colonnes

Partitionnement et circulation de A Partitionnement statique de B Partitionnement statique de C

(9)

Produit de matrices denses sur anneau

Rappel d’algorithmique distribuée

B A

B

A B

A A

B Exemple de déroulement de l’algorithme sur PE-2, avec P = 4 :

Étape 1 Étape 2 Étape 3 Étape 4

A

C A

C C

A

C A

• Calcul de toutes les colonneset routage de toutes les lignes de Aen parallèle enP = 4étapes

Topologie Partitionnement statique de C

0 1 P-1

Résultats après P étapes (seulement) : de A en parallèle, en P = 4étapes.

Sans recouvrement :

Produit de matrices denses sur anneau avec recouvrement

Algorithme distribué

Avec recouvrement : Stratégies d’implantation sur un anneau de P processeurs :

for (i=0; i<P; i++) calcul();

barriere();

circulation();

barriere();

}

for (i=0; i<P; i++) par {

calcul();

circulation();

}

barriere();

buffer_permut();

} }

1eralgorithme : avec barrières conceptuelles Les barrières de synchronisations sont parfois implicites …

Les barrières apparaissent parfois inutiles … Voir à l’implant.

(10)

Produit de matrices

denses

sur anneau

Implant. en MPI-1 à comm. non-bloquantes

void ComputationAndCirculation() {

UsingIssendand Irecv:

{

MPI_Request RqSend[2], RqRecv[2];

MPI_Status StSend, StRecv;

// 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 &RqRecv[(step+1)%2]);

(Me+1)%NbPE,0,MPI_COMM_WORLD,&RqRecv[(step+1)%2]);

// - run local computations SeqLocalProduct(step);

// - wait the end of the asynchronous communications MPI_Wait(&RqSend[step%2],&StSend);

MPI_Wait(&RqRecv[(step+1)%2],&StRecv);

} }

Produit de matrices

denses

sur anneau

Implant. en MPI-1 à comm. non-bloquantes

void ComputationAndCirculation() {

MPI_Request RqSend[2], RqRecv[2];

MPI_Status StSend, StRecv;

// Init of persistent comm

Avec des communications asynchrones et persistantes:

// 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_Recv_init(&A[0][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE, (Me+1)%NbPE,0,MPI_COMM_WORLD,&RqRecv[0]);

MPI_Ssend_init(&A[1][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE,

(Me-1+NbPE)%NbPE,0,MPI_COMM_WORLD,&RqSend[1]);

MPI_Recv_init(&A[1][0][0],SIZE*LOCAL_SIZE,MPI_DOUBLE, (Me+1)%NbPE,0,MPI_COMM_WORLD,&RqRecv[1]);

// Start computation and circulation loop for (int step = 0; step < NbPE; step++) {

( d[ %2])

MPI_Start(&RqSend[step%2]);

MPI_Start(&RqRecv[(step+1)%2]);

SeqLocalProduct(step);

MPI_Wait(&RqSend[step%2],&StSend);

MPI_Wait(&RqRecv[(step+1)%2],&StRecv);

}

// Free the persistent communication objects

MPI_Request_free(&RqSend[0]); MPI_Request_free(&RqSend[1]);

MPI_Request_free(&RqRecv[0]); MPI_Request_free(&RqRecv[1]);

}

(11)

Produit de matrices denses sur anneau avec recouvrement

Exemple de performances

Texec(P)

90 120 150

c(s)

Ibsend Issend

• 12 x P4- 3GHz - 2Go Ram

• Ethernet Gigabit

• 3 switchs

0 30 60 90

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC

Texec

Mflops(P)

8000 9000 10000

Ibsend Issend

L d f

0 1000 2000 3000 4000 5000 6000 7000 8000

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC

Mflops

Idéal

La perte de performances persiste :

• Elle n’est pas due au comm.

• Amdahl ?

• Calculs locaux trop petits ?

Produit de matrices denses sur anneau avec recouvrement

Exemple de performances

• 12 x P4- 3GHz - 2Go Ram

• Ethernet Gigabit

• 3 switchs

Speed Up(P)

9 11 13 15

ed Up

Ibsend Issend Idéal

1 3 5 7

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC

Spee

Efficacité(P)

80 100

Les communications sont

0 20 40 60 80

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Nombre de PC

e(%)

Ibsend Issend

Les communications sont négligeables dans cette implantation!

Donc le recouvrement apporte peu sur un bon réseau.

(12)

Produit de matrices denses sur anneau avec recouvrement

Exemple de performances

• 12 x P3 - 700MHz

Fast Ethernet

• 3 switchs Avec un réseau moins

bon le recouvrement a un impact!

500600 700800 1000900 11001200 1300

Flops

Ring-Sendrecv-replace Ring-Irsend

Ring-Irsend+overlapp

• Messages non-bloquant plus rapides.

• Messages

1000 200300 400500

1 2 3 4 5 6 7 8 9 10 11 12 13 Number of nodes

M 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

(13)

• 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 MPI : Programmation et algorithmique distribuée

Bilan de programmation MPI

Avantages :

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 messagesyp g

- 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 A Comparaisons

performances/coûts de 4 clusters

• Comparaison de speedup de Jacobi Comparaison de speedup de Jacobi

• Mflops/Euros

(14)

Comparaison de clusters

Comparaisons de speedup de Jacobi

Comparaison des meilleurs Speed Up des 4 réseaux sur 2 nœuds :

9 SU(2) Myrinet Sendrecv

3 4 5 6 7 8

Speed Up (2)

SU(2)-Myrinet-Sendrecv SU(2)-Gigabit-Sendrecv SU(2)-EthGamma-Sendrecv SU(2)-FastEth-Sendrecv

0 1 2

0 250 500 750 1000 1250 1500

Problem size (KBytes)

S

Comparaison de clusters

Coût Mflops/Euro du Jacobi

0,8

0,9 mpirun -np 1 - PIII-1GHz

mpirun -np 1 PIV-X-2.4GHz PIII

Le Mflops des clusters reste toujours plus cher qu’en séquentiel :

0,3 0,4 0,5 0,6 0,7

MFlops/Euro

mpirun np 1 PIV X 2.4GHz Myrinet (2)

Gigabit (2)

Fast-Eth+Gamma (2) Fast-Ethernet (2) PIV-Xeon

0 0,1 0,2

0 250 500 750 1000 1250 1500

Problem size (KBytes) PIV Xeon

Clusters !

(15)

Comparaison de clusters

Coût Mflops/Euro du Jacobi

Myrinet revient cher, les solutions à « 0 copies » sont très rentables :

0 16 0,18

0,2 Myrinet-PIII (2)

Gigabit-PIV-Xeon (2)

0,06 0,08 0,1 0,12 0,14 0,16

MFlops/Euro

Gigabit PIV Xeon (2) Fast-Eth+Gamma-PIII (2) Fast-Ethernet-PIII (2)

« Eth-0 copies »

0 0,02 0,04

0 250 500 750 1000 1250 1500

Problem size (KBytes)

Myrinet

MPI-1 2ème partie :

Programmation « non bloquante » et Programmation « non bloquante » et

communications de groupe

FIN

FIN

Figure

Updating...

Références

Updating...

Sujets connexes :