MPI et programmation par passage de messages

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
Communications point à point Communications collectives Optimisations
Synchronisation des processus père - fils
3- Déclaration et accès aux objets
Cours n° 8 Conception et Programmation à Objets
C.
13 – 16 Décembre 2005 Laurence Viry Introduction à MPI MPI_2.
Introduction à MPI 13 – 16 Décembre 2005 Laurence Viry.
Introduction à MPI Types dérivés MPI Décembre 2005
Paramètres et pointeurs
Structures et unions types énumérés Qu'est-ce qu'une structure
Tableaux Certains problèmes nécessitent beaucoup de variables du même type. Exemple : relevé de températures matin et soir dans 10 villes pour 10 jours.
FLSI602 Génie Informatique et Réseaux
8. Les tableaux P. Costamagna – ISEN N1.
Parallel Programming in C with MPI and OpenMP
Programmation de cartes graphiques
Principes de programmation (suite)
Structures de données linéaires
Démarche de résolution de problèmes
MPI (Message Passing Interface)
Serveurs Partagés Oracle
Bibliothèque standard du C++
TRANSMISSION DES DONNEES.
Présentation rapide de MPI : Message Passing Interface
Course Critique Race Condition
Interface CWIPI Thierry Morel Formation OpenPALM avril 2012
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
5.1 URDL22005 Systèmes dexploitation Threads Vue dEnsemble Modèles de Multithreading Problèmes des Threads Pthreads Threads Windows XP Threads Linux Threads.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Programmation concurrente
Une brève introduction à MPI Destinée à l usage des utilisateurs de CIMENT Laurent Desbat juin 2002.
Parallel Programming in C with MPI and OpenMP
Parallel Programming in C with MPI and OpenMP
Chapitre 9 Les sous-programmes.
ÉLÉMENTS DE BASE UNIX.
Méthode et Outils pour la Programmation
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Synchronisation Classique
Structures de données IFT-10541
Plan cours La notion de pointeur et d’adresse mémoire.
Importance du réseau dans des architectures MIMD Tout échange entre les processeurs nécessite un transfert de données via le réseau.
Programmation Système et Réseau (sous Linux)
La notion de type revisitée en POO
Module 8 : Surveillance des performances de SQL Server
GESTION ET TRAITEMENT DES ERREURS
Argc et argv Utilisation des paramètres de la ligne de commande.
Autres éléments du langage
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Tutorat en bio-informatique
Programmation parallèle
PARALLÉLISATION AUTOMATIQUE D’ALGORITHMES
Programmation Système et Réseau
ISBN Chapitre 10 L'implémentation des sous- programmes.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
Interface de communication pour les réseaux InfiniBand
Architecture Client/Serveur
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Langage de Programmation Orientée Objet : C++
L. Gurret – M. Herve – P. Mignon – J. Prarioz. Introduction  Dernière étape d’analyse  Cahier des charges, spécifications et conception orientée objet.
ARP Fonctionnement.
1 UNIX AVANCE Yves PAGNOTTE – Janvier – LES PROCESSUS SOUS UNIX.
Transcription de la présentation:

MPI et programmation par passage de messages Matthieu EXBRAYAT Maîtrise d’informatique

Modèles mémoire Shared memory Shared disk Shared nothing Remarque Mémoire partagée, disques partagés Implantations « haut de gamme » Croissance limitée Shared disk Mémoire répartie, Implantation physique assez rare (ou ferme de disques) Shared nothing Mémoire et disques répartis Cluster de PC, implantation courante Remarque implantation physique vs implantation logique

Mémoire Répartie (shared nothing) Fonctionnement parallèle = envoi de messages Envoi / Réception Permet la synchronisation Avantages Portabilité, extensibilité Inconvénients Gestion explicite des appels distants = programmation à 2 niveaux

MPI : Message Passing Interface MPI = spécification standard (consortium) Plusieurs implantations Gratuites Portables Intérêt Cadre « simple » pour la programmation par envoi de messages Sémantique « maîtrisée » Portabilité et stabilité (protocole bas niveau pas géré par développeur) Permet architecture hétérogène

MPI Contient Constantes, types et fonctions pour C, C++, Fortran (77 et 90) Primitives de comm. point à point Primitives de comm. collectives Regroupement de processus Interface de suivi des performances

MPI ne contient pas Opérations en mémoire partagée EDI (programmation / débogage) Il existe des extensions Gestion de processus Lancement explicite au départ RPC Gestion des threads E/S Parallèles (disponible dans MPI 2)

Principe d’un programme MPI On écrit un programme contenant les opérations locales + les échanges via MPI (initialisation et échanges) On compile On lance par mpirun –np n monprog n=nombre de machines La liste des machines peut être définie explicitement Mpi crée n copies de l’exécutable sur les machines cibles Exécution asynchrone des processus (+synchro sur échange messages) Terminaison des processus

Différents types d’appel Local (manipulation locale d’objets MPI) Non-local : échange avec autre(s) processus Bloquant : le processus reprend la main après l’opération (ressources disponibles) Non-bloquant : le processus reprend la main avant la fin de l’opération (nécessite contrôle) Point-à-point : Echange entre deux processus Collectif : Tous les processus du groupe appellent la même fonction NB : nous utiliserons le groupe par défaut, qui regroupe tous les processus

MPI et C Les fonctions commencent par MPI_ Elles retournent un code d’erreur (qui vaut MPI_SUCCESS en cas de réussite) Les arguments de type tableau sont indexés à partir de 0 (C classique…)

Connection et déconnection à MPI MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &num_procs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Get_processor_name(processor_name, &namelen); MPI_Finalize();

MPI_Send : envoi bloquant int MPI_Send(void *buf,int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm) buf : adresse mémoire (début des informations à transmettre) count : nombre de valeurs à envoyer datatype : type de valeur dest : numéro du processus destinataire tag : numéro associé au message comm : communicateur = groupe de processus. Nous utilisons le groupe global : MPI_COMM_WORLD

Des détails… Avant l’appel à MPI_Send, les infos à envoyer sont placées dans une zone de mémoire contigüe (tableau de taille count) Si count = 0 : pas de données (utilisable pour synchro) Les types de données : MPI_CHAR signed char MPI_SHORT signed short int MPI_INT signed int MPI_LONG signed long int MPI_FLOAT float MPI_DOUBLE double MPI_PACKED Comment envoyer un seul entier ?

MPI_Receive : réception bloquante int MPI_Recv (void* buf,int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) buf : emplacement où stocker les valeurs reçues count : capacité de buf (erreur si débordement, placement au début si remplissage incomplet) source : machine émettrice (numéro ou MPI_ANY_SOURCE) tag : numéro ou MPI_ANY_TAG status : infos sur la réception (structure) : status.MPI_SOURCE status.MPI_TAG status.MPI_ERROR int MPI_Get_count(MPI_Status *status,MPI_DATATYPE datatype, int *count))

Bloquant ? Une opération est bloquante dans le sens où elle ne termine qu’après avoir terminé l’utilisation du buffer : send se termine après l’envoi effectif (!= réception) receive se termine après la réception effective un send peut-il être lancé avant le receive correspondant ?

Ordre d’acheminement MPI garanti l’ordre d’acheminement entre un émetteur et un destinataire donnés. L’ordre global n’est par contre pas garanti (plusieurs émetteurs vers un même destinataire, par exemple).

Envoi et réception combinés Si deux processus souhaitent échanger des informations, il est possible d’appeler MPI_Sendrecv int MPI_Sendrecv (void* sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void* recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status) Procède comme deux threads qui géreraient un envoi et une réception envoi et réception sont bloquants Les buffers sont nécessairement différents (disjoints) Les tags peuvent être différents.

Processus NULL On peut faire des envoi vers MPI_PROC_NULL (si destinataire inactif pour une raison donnée) Se termine dès que possible. Aucun effet Utilisable aussi en réception.

Envoi et réception non bloquants Le processus reprend la main dès que la demande d’envoi ou de réception est faite. Le processus contrôle ensuite si l’envoi ou la réception a été effectué Permet des recouvrement calcul- communication (particulièrement intéressant pour réception)

Syntaxe 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) int MPI_Wait(MPI_Request * request, MPI_Status * status) int MPI_Test(MPI_Request * request, int *flag, MPI_Status * status)

Opérations collectives MPI définit certains algorithmes parallèles de base : diffusion, réduction… Définition cohérente avec send et receive, mais : correspondance entre message et buffer de réception (taille) opérations bloquantes pas de tag.

Barrière de synchronisation Permet de s’assurer d’un point de synchro (car pas de certitudes à partir des send et receive, même bloquants). int MPI_Barrier(MPI_Comm comm) Opération globale au groupe de processus

Broadcast int MPI_Bcast(void * buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) Envoi depuis le processus de rang root vers tous les autres

Gather Un processus collecte des informations venant de tous les processus et les assemble (dans un tableau) int MPI_Gather(void *sendbuf,int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Tous les processus (root y-compris) envoient des infos vers root. Le placement se fait dans l’ordre des rangs de processus. en général, recvcount = sendcount

Scatter Scatter : un processus distribue des informations (stockées dans un tableau) vers tous les processus int MPI_Scatter(void *sendbuf,int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm) Tous les processus (root y-compris) reçoivent des infos de root. La distribution se fait dans l’ordre des rangs de processus. en général, recvcount = sendcount

Reduce On dispose d’un certain nombre de calculs de préfixes pré-implantés int MPI_Reduce(void* sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD MPI_LAND, MPI_LOR, MPI_LXOR MPI_BAND, MPI_BOR, MPI_BXOR MPI_MAXLOC, MPI_MINLOC (paire valeur/index)

Scan On dispose d’un certain nombre de calculs de préfixes pré-implantés int MPI_Scan(void* sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm) Mêmes opérateurs que pour Reduce