0% ont trouvé ce document utile (0 vote)
111 vues57 pages

Introduction à MPI pour Débutants

Transféré par

Pier-Olivier Beaulieu
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
111 vues57 pages

Introduction à MPI pour Débutants

Transféré par

Pier-Olivier Beaulieu
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Introduction à MPI

Architectures de calculs parallèles

LOG645
Sommaire

• Introduction à MPI
• Programmes MPI
• Communication point à point
• Communication collectives
• Autres fonctions MPI
• Groupes et communicateurs
• Construction de son propre type

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 2
Introduction à MPI
Message Passing Interface

LAM
Local Area Multicomputer

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 3
Qu’est ce que MPI

• MPI est une librairie, pas un langage de


programmation !
• MPI est une spécification de librairies proposée
comme une norme pour une large population de
vendeurs, développeurs, et utilisateurs
• Il spécifie les noms, séquencement d’appel, et les
résultats des fonctions sous C, C++, et Fortran
• MPI décrit ce qu’il faut faire mais pas comment faire

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 4
Historique

• Avril 1992: début du workshop sur "Standards for


Message Passing in a Distributed Memory
Environment"
• Novembre 1992: ébauche du standard MPI
• Novembre 1993: standard MPI 1.0
• Juin 1995: standard MPI 1.1
• Décembre 1995: première version du MPI 2.0
• Juin 1997: MPI/RT-1.0 (MPI à temps réel)
• Mars 2001: MPI/RT-1.1

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 5
Objectifs du MPI

• Portabilité
• Performance
• Fiabilité
• Simplicité
• Spécification indépendante du langage

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 6
Plateformes ciblées par MPI

• Machines connectées par réseau


 Parallèles
 Séquentielles
 Ensemble de machines hétérogènes

• Systèmes d’exploitation
 Unix
 Linux
 Windows NT/2000

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 7
Implémentations MPI (Posix)

 LAM-MPI de l'université de Notre Dame


 MPICH d'Argonne National Laboratory
 MPICH-PM/CLUMP du Parallel and Distributed System Software Laboratory
 MPICH-T3E de l'université de l'État du Mississipi
 MPICH-MADELEINE de l'École Normale Supérieure de Lyon
 MPI/Pro de Software Technology, Inc
 CHIMP/MPI de Edinburgh Parallel Computing Centre (EPCC)
 CRI/EPCC MPI for Cray T3D de Cray Research Incorporated via Edinburgh
Parallel Computing Centre
 MPIAP de Australian National University - CAP Research Program

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 8
Implémentations MPI (Windows)

• MPICH-NT d'Argonne National Laboratory


• MPI/Pro de Software Technology, Inc
• WMPI de Critical Software, Inc.
• WINMPICH de l'université d’État du Mississipi

La majorité des implémentations sont disponibles


gratuitement

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 9
Documentations sur MPI

• MPICH (installation, utilisation, administration)


 http://www-unix.mcs.anl.gov/mpi/mpich
• LAM-MPI:
 http://www.lam-mpi.org/using/docs

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 10
Livres sur MPI

• Using MPI, William Gropp, Ewing Lusk, and Anthony


Skjellum, MIT Press:
 http://www-unix.mcs.anl.gov/mpi/usingmpi

• MPI: The complete reference, Marc Snir, Steve Otto,


Steven Huss-Lederman, David Walker, Jack
Dongarra, MIT Press:
 http://www.netlib.org/utk/papers/mpi-book/mpibook.html
 http://www.netlib.org/utk/papers/mpi-book/mpibook.ps

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 11
Programmes MPI

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 12
Modèles de programmation MPI
Un seul programme
Toute données traitées dans meme
prog
• SPMD: Single Program, Multiple Data
• Plusieurs processus lancés sur une ou plusieurs
machines, à un ou plusieurs processeurs
• Chaque processus à ses propres variables locales
• Partage de données se fait par passage de message:
 Point à point (un à un)
 Collection de données (plusieurs à un)
 Broadcast (un à plusieurs)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 13
MAT(1024)

F_A() sur 10 a 512


Autre 512 fin
Pas bon aller loin de cela

CELA SPMD

RANK = GET();

For 512 x RANK -> 512 * (RANK + 1)

Comunication inter process

1. Point a point. Send a mon rank + 1 =


voisin. 2 noeuds

2. Fonction collectives: tous le monde envoie


des données t reçoit matrice finale

Collection et diffusion: touselle monde doit


appeler
Composition d’un programme

• Entête du fichier:
 #include "mpi.h"
 #include <mpi.h>

• Fonction main
 void main(int argc,char *argv[])

• Format des fonctions:


 int MPI_Xxxxxx(parametres);
Int retourne est code erreur convention

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 14
6 fonctions de base

Initialiser réseau
comm entre les
noeuds

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 15
Initialisation

•int MPI_Init(int *argc, char **argv);


 argc, argv sont les arguments de la fonction main
 La fonction main a deux paramètres : argc de type int et
argv de type char * [].
argc donne le nombre d'éléments de la ligne de commande, et
argv contient ces éléments sous la forme d'un tableau de chaînes
de caractères. argv[0] contient le nom de la commande,
argv[i], pour i allant de 1 à argc-1, le ième argument.

• La première fonction MPI à appeler dans un programme

• Doit être appelée une seule fois dans un programme

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 16
Finalisation

•int MPI_Finalize( );

• La dernière fonction MPI à appeler dans un


programme
• Le programmeur doit s’assurer que toutes les
communications sont terminées
• Aucune fonction MPI ne peut être appelée après la
finalisation

Processus possède plusieurs threads. Threads contient un stack.

Processus peut être sur plusieurs machines distribues dans un


réseau

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 17
Communicateur

• Lors de l’appel de MPI_Init, on crée un


communicateur
MPI_COMM_WORLD

• Toutes les communications nécessitent


un communicateur
• Les processus MPI ne peuvent se
communiquer que s’ils partagent le
même communicateur
Envoyer un message sur
communicateur a adresse x. Doit
être sur meme rue pour lui parler

LOG645 – Architectures de calculs parallèles Ouvrir la mail de tous le monde


ou destinataire spécifique dans 18
Matériel développé par Lévis Thériault, Automne 2014 maison
Identificateur

• Renvoi du nombre de processus


 MPI_Comm_size (MPI_Comm comm, int *size)
 comm: communicateur Nombre de maisons
Prendre division du travail en
fonction du size
 size: nombre de processus dans le groupe comm

• Renvoi de l’identificateur du processus courant


 MPI_Comm_rank (MPI_Comm comm, int *rank)
Celui ci s’occupe de quelle partie du process
 comm: communicateur
 Identificateur(0, ..size-1) du processus appelant

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 19
Programme hello1.c

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 20
Compilation et exécution LAM-MPI

• Un bon fichier de configuration vous est fourni dans


l’énoncé du laboratoire no 1
• Il fait plus que la configuration présentée à la page
suivante
• Vous êtes encouragés à l’utiliser

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 21
Programme hello2.c

Pointeur vers int declare

Peut être dans n’importe quelle ordre


Clef ne pas
se fier sur 2 de 4
le timing 1 de 4
LOG645 – Architectures de calculs parallèles (Security) 4 de 4
Matériel développé par Lévis Thériault, Automne 2014 3 de 4 23
Communication point à point

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 24
Communication point à point

• Communication entre 2 processus


• Un processus envoi un message au
processus destinataire
• La communication se fait à l’intérieur
du communicateur
• Processus destinataire est identifié
par son identificateur dans le communicateur

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 25
Types de communication

• Envoi standard: souvent non-bloquant, MAIS peut


bloquer !!
• Envoi avec buffer: se termine toujours sans tenir
compte si la réception est complétée. Ne bloque
jamais, retourne une erreur si nécessaire
• Envoi synchrone: exige la synchronisation de
l’émetteur et du récepteur (se termine lorsque la
réception est complétée)
• Réception: se termine lorsque le message est
complètement arrivé
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 26
Types de communication

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 27
Envoi d’un message

• int MPI_Send (void *buf, int count,


MPI_Datatype datatype, int dest, int
tag, MPI_Comm comm);
 buf tampon à envoyer
 count nombre d’éléments de type datatype à envoyer
 datatype type de données dans buf
 dest identificateur du destinataire
 tag étiquette du message
 comm communicateur (groupe de processus)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 28
Envoi d’un message

• Lorsque MPI_Send est appelée, une des 2 situations


peut arriver:
1. Le message peut être copié dans un buffer interne et
transféré plus tard à la destination
2. Le message reste dans les variables du programme jusqu’à
ce que la destination soit prête à recevoir le message

• Dans 1, une fois que la copie dans le buffer est


terminée, le processus continue son exécution

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 29
Réception d’un message

• int MPI_Recv (void *buf, int count,


MPI_Datatype datatype, int source, int
tag, MPI_Comm comm, MPI_Status
*status);
 buf tampon à recevoir
 count nombre d’éléments de type datatype à recevoir
 datatype type de données dans buf
 source identificateur de l’expéditeur.
• source = MPI_ANY_SOURCE indique n’importe quelle
source

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 30
Réception d’un message

• int MPI_Recv (void *buf, int count,


MPI_Datatype datatype, int source, int
tag, MPI_Comm comm, MPI_Status
*status);
 tag étiquette du message
• tag = MPI_ANY_TAG indique n’importe quelle étiquette

 comm communicateur (groupe de processus)


 status structure de statut retourné, contient
• tag
• source

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 31
Réception et envoi d’un message

• MPI_Send (parfois) et MPI_Recv (toujours)


bloquent le processus appelant jusqu’à ce que la
communication soit terminée
• Si le message passé à MPI_Send est plus long que
les buffers internes disponibles, le processus se
bloque jusqu’à la réception ou la disponibilité des
buffers

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 32
Réception et envoi d’un message

• Les messages envoyés par différents processus sont


dans un ordre aléatoire (non déterministe)
• Par contre, si un processus A envoie plusieurs
messages au processus B, B recevra les messages de
A en ordre (déterministe)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 33
Types de données

• Un message MPI contient un ensemble d’éléments de


types de données MPI
• Types de données MPI:
 Types de base
 Types composés à partir des types de base

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 34
Types de données

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 35
Deadlock

• Lorsque 2/plusieurs processus sont bloqués et chacun


attend l’autre/les autres
• Exemple:

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 36
Deadlock

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 37
Éviter le deadlock

• Pour chaque MPI_Recv d’un processus, il doit y


avoir un MPI_Send dans un autre processus

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 38
Éviter le deadlock

• Utiliser les communications non bloquantes


(immédiate)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 39
Éviter le deadlock

• On peut faire des traitements en attendant la fin de la


communication
• Tester à chaque fois si le message est arrivé ou non
sans blocage (MPI_Test)

• Tester à chaque fois si le message est arrivé ou non


avec blocage (MPI_Wait)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 40
Communication collective

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 41
Communication collective
Pas sync état, copies

• Barrière de synchronisation des processus Aucun cas si sauf mesure


de performance

• Émission d’un message d’un processus aux autres


processus
• Réduction globale des opérations comme: somme,
min, max
• Collection des données de plusieurs processus à un
processus
• Distribution d’un processus aux autres

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 42
Barrière de synchronisation

• int MPI_Barrier(MPI_Comm comm)

• Cette fonction bloque le processus appelant jusqu’à


ce que le groupe de processus appelle cette fonction
• Permet la synchronisation des processus

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 43
Émission (broadcast)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 44
Émission

• int MPI_Bcast (void *buffer, int count,


MPI_Datatype datatype, int root,
MPI_Comm comm);
 buffer tampon de donnée à émettre
Comptable fait broadcast
 count nombre d’éléments dans buffer Tu dis broadcast pour
recevoir
 datatype type de données Meme ligne de code fit
avec spmd

 root identification du processus émetteur


Magie ici numero de a comptable

 comm communicateur (groupe de processus, incluant


l’émetteur root, qui recevra aussi les données)
Rue principale

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 45
Émission

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 46
Réduction (reduce)
sinon Bottleneck sur lui qui recoit tous info si on parallelise un
calcul d<addition
Reduction : utilise un arbre

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 47
Réduction

• int MPI_Reduce (void *sendBuf, void *recvBuf,


int count, MPI_Datatype datatype, MPI_OP op,
int root, MPI_Comm comm);
 sendBuf tampon d’envoie
 recvBuf tampon de réception, significatif seulement pour root
 count nombre d’éléments dans sendBuf
 datatype type de données dans sendBuf
 op opération utilisée pour la réduction
 root identificateur du processus qui effectue la réduction des
données
 comm groupe des processus participants, incluant root

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 48
Réduction

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 49
Réduction

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 50
Réduction

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 51
Collection (Gather)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 52
Collection

• int MPI_Gather (void *sendBuf, int sendCount,


MPI_Datatype sendType, void *recvBuf, int
recvCount, MPI_Datatype recvType, int root,
MPI_Comm comm);
 sendBuf tampon d’envoie
 sendCount nombre d’éléments dans sendBuf
 sendType type de données dans sendBuf
 recvBuf tampon de réception, significatif seulement pour root
 recvCount nombre d’éléments dans recvBuf
 recvType type de données dans recvBuf
 root identificateur du processus qui reçoit des données
 comm communicateur (groupe des processus participant, incluant
root)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 53
Collection

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 54
Distribution (scatter)

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 55
Distribution
• int MPI_Scatter(void *sendBuf, int sendCount,
MPI_Datatype sendType, void *recvBuf, int
recvCount, MPI_Datatype recvType, int root,
MPI_Comm comm);
 sendBuf tampon d’envoie, significatif seulement pour root
 sendCount nombre d’éléments envoyé à chaque processus
 sendType type de données dans sendBuf
 recvBuf tampon de réception
 recvCount nombre d’éléments dansrecvBuf
 recvType type de données dans recvBuf
 root identificateur du processus qui envoie des données
 comm communicateur (groupe des processus participant, incluant
root)
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 56
Distribution

Laboratoire utiliser le Gather pas le scatter


Lit pas d<un fichier on le génère
Sauver un scatter avec ca

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 57

Vous aimerez peut-être aussi