La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Projet QUID www.lri.fr/~gk/QUID/ Présentation rapide de MPI : Message Passing Interface Géraud Krawezik LRI – Université de Paris Sud EADS CCR – Blagnac.

Présentations similaires


Présentation au sujet: "Projet QUID www.lri.fr/~gk/QUID/ Présentation rapide de MPI : Message Passing Interface Géraud Krawezik LRI – Université de Paris Sud EADS CCR – Blagnac."— Transcription de la présentation:

1 Projet QUID Présentation rapide de MPI : Message Passing Interface Géraud Krawezik LRI – Université de Paris Sud EADS CCR – Blagnac

2 DEA ID - Calcul Haute Performance228 octobre 2003 Sommaire MPI, une bibliothèque de passage de messages Le passage de messages MPI MPI en pratique Fonctions de communication point-à-point Fonctions de communication collective MPI : notions avancées Modes de communication Types utilisateur Extensions MPI-2

3 DEA ID - Calcul Haute Performance328 octobre 2003 Introduction à MPI Introduction au modèle à passage de messages MPI Structure dun programme MPI Fonctions de base HelloWorld_MPI.c

4 DEA ID - Calcul Haute Performance428 octobre 2003 Passage de messages (1) Le problème : On dispose de n machines Ces machines sont connectées en réseau Comment utiliser la machine globale à n processeurs constituée par lensemble de ces n machines? RAM CPU RAM CPU RAM CPU RAM CPU RAM CPU RAM CPU RAM CPU Réseau

5 DEA ID - Calcul Haute Performance528 octobre 2003 Passage de messages (2) Une réponse : le passage de messages (message passing) Faire exécuter un processus sur chaque processeur disponible Effectuer des transferts de données explicites entre les processeurs Synchroniser les processus explicitement Immédiatement on peut distinguer deux types de communications pour le transfert de données : Les communications à linitiative dun seul des processus : one sided Les communications se font en commun : cooperative

6 DEA ID - Calcul Haute Performance628 octobre 2003 Deux types de communications Communications one sided Pas de protocole de rendez-vous (tout est fait à distance) On nindique pas aux processus une lecture ou écriture dans leur mémoire locale Synchronisation difficile ou coûteuses Prototypes de fonctions : put(remote_process, data) get(remote_process, data) Communications coopératives La communication est effectuée explicitement par les deux processus La synchronisation est implicite dans les cas simples Prototypes de fonctions : send(destination, data) recv(source, data) CPU put() CPU get() CPU send()recv()

7 DEA ID - Calcul Haute Performance728 octobre 2003 MPI (Message Passing Interface) Standard développe et utilisé par des industriels, des académiques, et des fabricants de machines parallèles But : spécifier une bibliothèque de fonctions de passage de messages portable La base est un environnement dexécution qui lance les processus et les connecte entre eux Supporte : Des modes de communication synchrones et asynchrones Des communications collectives Offre des domaines de communication séparés

8 DEA ID - Calcul Haute Performance828 octobre 2003 Structure dun programme MPI Correspond au schéma général de programmation SPMD Tous les processus sont lancés en même temps Le même programme est lancé sur tous les processus Section séquentielle Initialisation de MPI Initialisation de la section parallèle Calcul Communications Synchronisation Fin section parallèle Section séquentielle (Parties non-parallélisables) Remarque : la plupart des implémentations conseillent de limiter cette dernière partie à la sortie du programme Section multinode (MPI) Initialisation de la section parallèle Terminaison de la section parallèle

9 DEA ID - Calcul Haute Performance928 octobre 2003 Fonctions de base Initialisation de lenvironnement MPI C : MPI_Init(&argc, char &argv); Fortran : call MPI_Init(ierror) Terminaison de lenvironnement MPI (il est en général recommandé de terminer immédiatement après cette instruction) C : MPI_Finalize(); Fortran : call MPI_Finalize(ierror) Obtention du rang du processus C : MPI_Comm_rank(MPI_COMM_WORLD, &rank); Fortran : call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierror) Obtention du nombre de processus C : MPI_Comm_size(MPI_COMM_WORLD, &size); Fortran : call MPI_comm_size(MPI_COMM_WORLD, size, ierror)

10 DEA ID - Calcul Haute Performance1028 octobre 2003 HelloWorld_MPI.c #include void main(int argc, char ** argv) { int rang, nprocs; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rang); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); printf(Bonjour, je suis %d (parmi %d process)\n, rang, nprocs); MPI_Finalize(); }

11 DEA ID - Calcul Haute Performance1128 octobre 2003 MPI : notions et fonctions de base Notions élémentaires : groupes, contextes, domaines de communication Types de données Tags de communication Fonctions de communication point à point Fonctions de communication collectives Exemple concret : calcul de la trace dune matrice carrée

12 DEA ID - Calcul Haute Performance1228 octobre 2003 Groupes et contextes Les processus dun programme MPI peuvent être regroupés en groupes group Tout message est envoyé dans un contexte context, et doit impérativement être reçu dans le même contexte

13 DEA ID - Calcul Haute Performance1328 octobre 2003 Domaines de communication Plusieurs nœuds peuvent être regroupés en un domaine de communication, ou communicator Dans tous les exemples précédents, MPI_COMM_WORLD a été utilisé pour les communications, il sagit du domaine par défaut, comprenant tous les processeurs De façon plus générale, toute opération peut être effectuée seulement sur un ensemble de processeurs par lindication de son domaine Chaque processus possède un rang dans chaque domaine de communication dont il fait partie

14 DEA ID - Calcul Haute Performance1428 octobre 2003 Domaines de communication (2) Avant de créer un domaine, il faut créer un groupe de processeurs : int MPI_Comm_group(MPI_Comm comm, MPI_Group *group) ; Création dun domaine : int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm) ; int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm) ; Exemple dutilisation : MPI_Send(newcomm, )

15 DEA ID - Calcul Haute Performance1528 octobre 2003 Types de données MPI Type MPIType C MPI_CHARsigned char MPI_SHORTsigned short int MPI_INTsigned int MPI_LONGsigned long int MPI_UNSIGNED_CHARunsigned char MPI_UNSIGNED_SHORTunsigned short int MPI_UNSIGNEDunsigned int MPI_UNSIGNED_LONGunsigned long int MPI_FLOATfloat MPI_DOUBLEdouble MPI_LONG_DOUBLElong double MPI_BYTE MPI_PACKED Type MPIType FORTRAN MPI_INTEGERINTEGER MPI_REALREAL MPI_DOUBLE_PRECISIONDOUBLE PRECISION MPI_COMPLEXCOMPLEX MPI_LOGICALLOGICAL MPI_CHARACTERCHARACTER(1) MPI_BYTE MPI_PACKED

16 DEA ID - Calcul Haute Performance1628 octobre 2003 Communications point à point Permettent denvoyer et recevoir des données entre deux processus Les deux processus initient la communication, lun qui envoie la donnée, le second qui la reçoit Les communications sont identifiés par des tags Il faut préciser davance la taille des éléments envoyés, ainsi que leur type

17 DEA ID - Calcul Haute Performance1728 octobre 2003 Tags de communication Les tags de communication permettent didentifier une communication particulière dans un ensemble Elles permettent ainsi, dans le cas ou les communications ne sont pas synchrones, de trier les messages Il est possible dans le cas des opérations de réception, de recevoir depuis nimporte quel tag en utilisant le mot- clef : MPI_ANY_TAG

18 DEA ID - Calcul Haute Performance1828 octobre 2003 Fonctions de comm. de base Envoi de données synchrone de base : int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) ; Le tag permet didentifier le message de facon unique Réception de données synchrone de base : int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) ; Le tag doit être identique que le tag du Send MPI_ANY_SOURCE peut être précisé si lémetteur nest pas nécessairement connu

19 DEA ID - Calcul Haute Performance1928 octobre 2003 Jeton.c #include void main(int argc, char ** argv) { int me, prec, suiv, np; int jeton = 0; MPI_Status * status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &np); if (me == 0) prec = np – 1; else prec = me – 1; if (me == np - 1) suiv = 0; else suiv = me + 1; if (me == 0) MPI_Send(&jeton, 1, MPI_INT, suiv, 0, MPI_COMM_WORLD,); while (1) { MPI_Recv(&jeton, 1, MPI_INT, prec, 0, MPI_COMM_WORLD, status); MPI_Send(&jeton, 1, MPI_INT, suiv, 0, MPI_COMM_WORLD); } MPI_Finalize(); } np -1

20 DEA ID - Calcul Haute Performance2028 octobre 2003 Synchronisme et asynchronisme (1) Afin de résoudre les problèmes de deadlocks, et pour permettre le recouvrement des communications par le calcul, on peut utiliser des fonctions de communications asynchrones Dans ce cas, le schéma de communication est le suivant : Initiation dune communication non-bloquante (soit par lenvoyeur, soit par le récepteur, soit les deux) La communication (bloquante ou pas) est lancée sur lautre nœud … opérations diverses (typiquement : calcul) Terminaison de la communication (opération qui bloque jusquà ce que la communication ait été effectuée)

21 DEA ID - Calcul Haute Performance2128 octobre 2003 Synchronisme et asynchronisme (2) Les fonctions non-bloquantes : int MPI_Isend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request); int MPI_Irecv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request) ; Le champ request sert à connaître létat de la communication non- bloquante afin de savoir quand elle se termine, par un appel à la fonction : int MPI_Wait(MPI_Request *request, MPI_Status *status) ;

22 DEA ID - Calcul Haute Performance2228 octobre 2003 Opérations collectives Afin de simplifier certaines opérations récurrentes, on peut utiliser des opérations qui sont effectuées sur un ensemble de processeurs (sur leur domaine de communication) Ces opérations sont typiquement : Des réductions Des échanges de données entre processeurs : Broadcast Scatter Gather All-to-All Des synchronisations explicites

23 DEA ID - Calcul Haute Performance2328 octobre 2003 Réductions (1) Une réduction permet deffectuer sur un des données distribuées dans un ensemble de processeurs une opération arithmétique de type addition, minima/maxima, … Prototype : C : int MPI_Reduce(void * sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm communicator); Fortran : MPI_Reduce(sendbuf, recvbuf, count, datatype, op, root, communicator, ierror) Dans la forme MPI_Reduce() seul le processeur root reçoit le résultat Il existe la forme MPI_AllReduce(), ou tous les processus reçoivent le résultat

24 DEA ID - Calcul Haute Performance2428 octobre 2003 Réductions (2) Opérations disponibles MPI_OpOperation MPI_MINMinimum MPI_MAXMaximum MPI_SUMSomme MPI_PRODProduit élément à élément MPI_LANDET logique MPI_BANDET bit par bit MPI_LOROU logique MPI_BOROU bit par bit MPI_LXOROU exclusif logique MPI_BXOROU exclusif bit par bit MPI_MINLOCMinimum et emplacement MPI_MAXLOCMaximum et emplacement

25 DEA ID - Calcul Haute Performance2528 octobre 2003 Broadcast Une opération de broadcast permet de distribuer à tous les processeurs une même donnée Communication de type un-vers-tous, depuis un processus root spécifie par tous les processus (identique pour tous) du domaine Prototypes : C : int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm); Fortran : MPI_Bcast(buffer, count, datatype, root, communicator, ierror) 0 123np-1 root = np-1 buffer

26 DEA ID - Calcul Haute Performance2628 octobre 2003 Scatter Opération de type un-vers-tous, où des données différentes sont envoyées sur chaque processus receveur, suivant leur rang Prototypes : C : int MPI_Scatter(void * sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm communicator); Fortran : MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, communicator, ierror) Les paramètres send ne sont utilises que par le processus qui envoie les données sendbuf recvbuf 0 123np-1 root = np-1

27 DEA ID - Calcul Haute Performance2728 octobre 2003 Gather Opération de type tous-vers-un, où des données différentes sont reçues par le processeur receveur, suivant leur rang Prototypes : C : int MPI_Gather(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm communicator); Fortran : MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, communicator, ierror) Les paramètres receive ne sont utilises que par le processus qui reçoit les données sendbuf recvbuf 0 123np-1 root = np-1

28 DEA ID - Calcul Haute Performance2828 octobre 2003 All-to-All Opération de type tous-vers-tous, où des données différentes sont envoyées sur chaque processus, suivant son rang, et réarrangées suivant le rang de lexpéditeur Prototypes : C : int MPI_AlltoAll(void * sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm communicator); Fortran : MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, communicator, ierror) Les paramètres send ne sont utilises que par le processus qui envoie les données sendbuf recvbuf 0 123np

29 DEA ID - Calcul Haute Performance2928 octobre 2003 Synchronisation explicite Barrière de synchronisation : tous les processus dun domaine de communication attendent que le dernier processus soit arrivé à la barrière de synchronisation avant de continuer lexécution A noter que sur les machines disposant de barrières matérielles (comme les SGI et le Cray T3E), la barrière MPI est beaucoup plus lente que celles-ci Prototype de la fonction C : int MPI_Barrier (MPI_Comm communicator); Fortran : MPI_Barrier(Communicator, IERROR)

30 DEA ID - Calcul Haute Performance3028 octobre 2003 Trace dune matrice (1) Calcul de la trace dune matrice An Rappel : la trace dune matrice est la somme des éléments de sa diagonale (matrice nécessairement carrée) Mathématiquement, on sait que : Immédiatement, on voit facilement que le problème peut être parallélisé en calculant la somme des éléments diagonaux sur plusieurs processeurs puis en utilisant une réduction pour calculer la trace globale

31 DEA ID - Calcul Haute Performance3128 octobre 2003 Trace dune matrice (2.1) #include void main(int argc, char ** argv) { int me, np, root=0; int N; /* On suppose que N = m*np */ double A[N][N]; double buffer[N], diag[N]; double traceA, trace_loc; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &np); tranche = N/np; /* Initialisation de A faite sur 0 */ /* … */ /* On bufferise les éléments diagonaux depuis le processus maître */ if (me == 0) { for (i=root; i

32 DEA ID - Calcul Haute Performance3228 octobre 2003 Trace dune matrice (2.2) /* On calcule la trace locale sur chaque processeur */ trace_loc = 0; for (i = 0; i < tranche; i++) trace_loc += diag[i]; /* On peut alors effectuer la somme globale */ MPI_Reduce(&trace_loc, &traceA, 1, MPI_DOUBLE, MPI_SUM, root, MPI_COMM_WORLD); if (me == root) printf("La trace de A est : %f \n", traceA); MPI_Finalize(); }

33 DEA ID - Calcul Haute Performance3328 octobre 2003 MPI : notions avancées Modes de communication Types de données utilisateur Extensions MPI-2

34 DEA ID - Calcul Haute Performance3428 octobre 2003 Modes de communication Il existe non seulement la possibilité denvoyer les données de façon synchrone ou asynchrone dans le cas des échanges point-à- point Ainsi, on peut contrôler plus finalement le mode de communication par lutilisation de préfixes (MPI_[*]Send): Envoi synchrone ([S]) :se termine lorsque la réception correspondante est postée Envoi bufferisé ([B]): un buffer est créé, et lenvoi ne se termine que lorsque ce buffer utilisateur est copié dans le buffer système Envoi standard () : lenvoi se termine quand le buffer démission est vide Envoi ready ([R]) : lutilisateur affirme que la réception a été postée avec lémission

35 DEA ID - Calcul Haute Performance3528 octobre 2003 Types de données utilisateur Par défaut, les données qui peuvent être échangées (au sens large) par MPI sont les types présentés précédemment, sous forme de vecteurs Il est possible de créer de nouveaux types afin de simplifier les opérations de communication (notamment les procédures de bufferisation) Un type se présente sous la forme dune séquence de types de base et dune séquence doffsets entier (placement mémoire) Creation : MPI_Type_commit(type) ; Destruction : MPI_Type_free(type) ;

36 DEA ID - Calcul Haute Performance3628 octobre 2003 Extensions MPI-2 Le standard MPI-2 présente certaines nouveautés afin de combler certains vides constatés, que dautres outils peuvent combler Changement dynamique du nombre de processeurs Il devient possible de spawner de nouveaux processus lors de lexécution du programme. Des inter-domaines sont alors crées Fonctions de communications one-sided MPI_Put () et MPI_Get () sont présents dans MPI-2

37 DEA ID - Calcul Haute Performance3728 octobre 2003 Remarques en conclusion MPI est devenu, grâce au travail en commun de la communauté du calcul parallèle, une bibliothèque standard de passage de messages De nombreuses implémentations existent, sur la plupart des plate- formes Lapprentissage de MPI est très simple, sans devoir entrer dans les notions les plus obscures de la bibliothèque La documentation et les publications disponibles sont conséquentes

38 DEA ID - Calcul Haute Performance3828 octobre 2003 Quelques pointeurs Le site officiel du standard MPI (en Anglais) Le forum MPI (en Anglais) Livre : MPI, The Complete Reference (Marc Snir et al.) Les cours de lIDRIS (en Français)


Télécharger ppt "Projet QUID www.lri.fr/~gk/QUID/ Présentation rapide de MPI : Message Passing Interface Géraud Krawezik LRI – Université de Paris Sud EADS CCR – Blagnac."

Présentations similaires


Annonces Google