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