Vous êtes sur la page 1sur 54

Introduction à MPI

(suite)

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
Autres fonctions MPI
http://www.lam-mpi.org/download/files/7.1.4-user.pdf

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 3
Tester un message (sans blocage)
Immédiat
• int MPI_Iprobe (int source, int tag,
MPI_Comm comm, int *flag, MPI_Status
*status);
 source: Identificateur du processus expéditeur
• Si source = MPI_ANY_SOURCE: n’importe quelle source
 tag étiquette du message
• Si tag = MPI_ANY_TAG: n’importe quel message
 comm Communicateur (groupe des processus participant)
 flag = TRUE si message disponible, = FALSE si non
 status structure de statut retourné
• status.MPI_SOURCE: identificateur de l’expéditeur
• status.TAG: étiquette du message
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 4
Tester un message (sans blocage)

• MPI_Iprobe retourne le contrôle


immédiatement
• Si flag = TRUE, le message peut être lu
avec MPI_Recv

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 5
Tester un message (avec blocage)

• int MPI_Probe (int source, int tag,


MPI_Comm comm, MPI_Status *status);
• MPI_Probe teste et attend jusqu’à ce que le
message spécifié soit disponible
• Les arguments sont les mêmes que ceux de
MPI_Iprobe
• On peut attendre indéfiniment si le message n’est
jamais disponible ou il est déjà consommé par un
autre processus

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 6
Obtenir la longueur d’un message

• int MPI_Get_count (MPI_Status status,


MPI_Datatype datatype, int *count);
 status statut retourné par MPI_Probe, MPI_Iprobe,
MPI_Recv
 datatype type de données du tampon de réception
RecvBuf (MPI_INT, MPI_FLOAT, …)
 count nombre d’éléments de type datatype reçus

• Cette fonction obtient la dimension d’un message


 Cette dimension est contenue dans status

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 7
Groupes et communicateurs

LOG645 – Architectures de calculs parallèles


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

• Un groupe est un ensemble ordonné de processus


• Chaque processus dans un groupe est associé à un
identificateur entier unique
• L’identificateur varie de 0 à N-1, où N est le nombre
de processus dans le groupe
• Dans MPI, un groupe est représenté comme un objet:
 Accessible au programmeur seulement par "handle"

• Un groupe est toujours associé à un objet


communicateur
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 9
Communicateur

• Un communicateur entoure un groupe de processus


qui peuvent se communiquer entre eux
• Chaque message doit spécifier un communicateur
• Comme le groupe, un communicateur est représenté
par un objet, accessible au programmeur seulement
par un "handle"
• Par ex., le "handle" du communicateur qui comprend
toutes tâches: MPI_COMM_WORLD

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 10
Groupes et communicateurs

• Groupes et communicateurs sont liés et forment un


espace de communication sûr à l’intérieur des
groupes
• Du point de vue du programmeur, un groupe et un
communicateur sont pareils

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 11
Groupes et communicateurs

• But primaire:
 Permettent de regrouper les tâches décomposées dans un
groupe de tâche (agglomération)
 Rend les communications collectives à l’intérieur d’un sous-
ensemble de tâches
 Fournir la base pour l’implémentation des topologies
virtuelles
 Facilite l’écriture et la compréhension du code

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 12
Groupes et communicateurs

• Les groupes/communicateurs sont


dynamiques, ils peuvent être créés et détruits
pendant l'exécution de programme
• Un processus peut appartenir à plusieurs
groupes/communicateurs
• MPI fournit plus de 40 routines reliées aux
groupes, communicateurs, et topologies
virtuelles

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 13
Utilisation typique

• Extraire le "handle" de groupe global


MPI_COMM_WORLD avec la fonction
MPI_Comm_group

• Former le nouveau groupe qui est un sous-ensemble


du groupe global avec un appel à MPI_Group_incl
• Créer le nouveau communicateur pour le nouveau
groupe avec la fonction MPI_Comm_create
• Déterminer le nouveau identificateur dans le nouveau
communicateur avec la fonction MPI_Comm_rank

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 14
Utilisation typique

• Effectuer des communications avec n’importe


quelles fonctions MPI de passage de
message
• À la fin, libérer le communicateur et le groupe
(facultatif) avec les fonctions:
MPI_Comm_free et MPI_Group_free

LOG645 – Architectures de calculs parallèles


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

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 16
Identificateur dans un groupe

• MPI_Group_rank (MPI_Group group,


int *rank)

• Retourne l’identificateur du processus actuel


dans un groupe ou retourne
MPI_UNDEFINED si le processus n’est pas
membre

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 17
Comparaison de deux groupe

• int MPI_Group_compare (MPI_Group


group1, MPI_Group group2, int *result)

• Compare deux groupes et retourne un nombre entier:


 MPI_IDENT si l'ordre et les membres des deux groupes
sont pareils
 MPI_SIMILAR si seulement les membres sont pareils
 MPI_UNEQUAL sinon

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 18
Groupe associé à un communicateur

• MPI_Comm_group (MPI_Comm comm,


MPI_Group *group)

• Détermine le groupe associé à un


communicateur donné

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 19
Constructeur de groupe par exclusion

• int MPI_Group_excl (MPI_Group group,


int n, int *ranks, MPI_Group *newgroup)
 n la taille du tableau d’identificateurs
 ranks tableau contenant les identificateurs à exclure du
nouveau groupe, ils doivent être valides et différents
 newgroup nouveau groupe dérivé

• Produit un groupe avec les membres non listés

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 20
Constructeur de groupe par inclusion

• int MPI_Group_incl (MPI_Group group,


int n, int *ranks, MPI_Group *newgroup
 n la taille du tableau d’identificateurs
 ranks tableau contenant les identificateurs à inclure du
nouveau groupe, ils doivent être valides et différents
 newgroup nouveau groupe dérivé

• Produit un groupe en réordonnant un groupe existant


et ne prend que les membres listés

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 21
Intersection de groupes

• int MPI_Group_intersection (MPI_Group


group1, MPI_Group group2, MPI_Group
*newgroup)
 group1 handle du premier groupe
 group2 handle du deuxième groupe
 newgroup handle de l’intersection des groupes

• Produit l’intersection de deux groupes existants

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 22
Différence de groupes

• int MPI_Group_difference (MPI_Group


group1, MPI_Group group2, MPI_Group
*newgroup)
 group1 handle du premier groupe
 group2 handle du deuxième groupe
 newgroup handle de la différence des groupes

• Produit la différence de deux groupes existants

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 23
Remarques sur les groupes

• Union
 Tous les éléments du premier groupe, suivis des éléments
du deuxième groupe qui ne sont pas dans le premier

• Intersection
 Tous les éléments du premier groupe qui sont aussi des
éléments du deuxième ordonné comme dans le premier
groupe

• Différence
 Tous les éléments du premier groupe et qui ne sont pas
dans le deuxième groupe, ordonné comme dans le premier
groupe
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 24
Remarques sur les groupes

• Noter que l’ordre des processus dans le


groupe de sortie est déterminé premièrement
à partir de l’ordre du premier groupe (si
possible), puis si nécessaire par l’ordre du
deuxième groupe
• Le nouveau groupe peut être vide, dans ce
cas il est égale à MPI_GROUP_EMPTY

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 25
Destructeur de groupe

• int MPI_Group_free (MPI_Group *group)

• Libère le groupe
• Cette opération marque l’objet du groupe pour une
désallocation
• Le handle du groupe prend MPI_GROUP_NULL
• Chaque opération avec ce groupe va se compléter
normalement

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 26
Comparaison de deux communicateurs

• int MPI_Comm_compare (MPI_Comm comm1,


MPI_Comm comm2, int *result)

• Compare deux communicateurs et retourne un entier:


 MPI_IDENT contextes et groupes sont identiques
 MPI_CONGRUENT contextes différent mais groupes
identiques
 MPI_SIMILAR contextes différent mais groupes similaires
 MPI_UNEQUAL sinon

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 27
Création d’un communicateur

• int MPI_Comm_create (MPI_Comm comm, MPI_Group


group, MPI_Comm *newcomm)
 comm communicateur associé avec l’ancien groupe
 group nouveau groupe pour lequel on créer un communicateur
 newcomm retourne le (handle) du nouveau communicateur

• Crée un nouveau communicateur à partir d’un ancien


communicateur et un nouveau groupe
• Note: l’appel doit être exécuté par tous les processus dans
comm (même s’ils n’appartiennent pas au même groupe)
• Retourne MPI_COMM_NULL pour les non-membres

LOG645 – Architectures de calculs parallèles


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

• int MPI_Comm_split(MPI_Comm comm, int color,


int key, MPI_Comm *newcomm)
 comm communicateur
 color les processus avec la même color vont dans le même
nouveau communicateur
 key identificateur du processus courant dans le nouveau
communicateur
 newcomm nouveau communicateur

• Partitionne le groupe associé à comm en sous-groupes


disjoints. Chaque sous-groupe contient les processus de même
couleur, les processus sont identifiés par l’ordre défini par la
valeur de l’argument key

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 29
Division d’un communicateur

• Exemple: appel collectif de la fonction est


exécuté par 10 processus

L’appel génère 3 nouveaux domaines de


communications: {f,g,a,d}, {e,i,c} et {h}. b et j ne
participent à aucun nouveau communicateur
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 30
Duplication d’un communicateur

• int MPI_Comm_dup (MPI_Comm comm,


MPI_Comm *newcomm)

• Duplique un communicateur existant avec toute


l’information associée

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 31
Libération d’un communicateur

• int MPI_Comm_free (MPI_Comm *comm)

• Marque l’objet communicateur pour la désallocation.


Le (handle) prend MPI_COMM_NULL
• Toute opération utilisant ce communicateur va se
compléter normalement, l’objet est vraiment libéré s’il
n’y a plus aucune référence active à lui

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 32
Inter-communicateur

• Le domaine de communication entre groupes


est spécifié par un ensemble d’inter-
communicateur qui ont comme attribut une
paire disjointe de groupe (A,B):
 Chaque communicateur du groupe A est lié à tous
les autres communicateurs du groupe B et vice
versa

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 33
Inter-communicateur

• La syntaxe de communication point à point est la même pour les


communicateurs et les inter-communicateurs
• Le processus cible est adressé pas son identificateur dans le
groupe cible
• La communication avec les inter-communicateurs ne pose pas
de conflit avec une communication qui utilise un autre
communicateur
• Les inter-communicateurs ne peuvent être utilisés pour les
communications collectives

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 34
Inter-communicateur

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 35
Test d’un inter-communicateur

• int MPI_Comm_test_inter(MPI_Comm comm,


int *flag)
- comm communicateur
- flag vrai si comm est inter-communicateur
• Permet de déterminer si le communicateur est inter-
communicateur ou intra-communicateur

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 36
Construction d’un inter-communicateur

• MPI_Intercomm_create(MPI_Comm
local_comm, int local_leader, MPI_Comm
bridge_comm, int remote_leader, int
tag, MPI_Comm *newintercomm)
− local_comm local (intra)communicateur
− local_leader identificateur du leader dans le
communicateur local (souvent 0)
− bridge_comm communicateur distant
− remote_leader identificateur du leader dans le
communicateur distant (souvent 0)
− tag étiquette pour la construction d’inter-communicateur
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 37
Exemple

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 38
Construction de son propre type
Types dérivés

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 39
Motivations pour les types dérivés

• Sous-bloc d’un tableau


• Structure de données
• Ensemble de variables
• Lorsqu’on envoi des éléments de ces trois
ensembles de données, ils ne sont pas
continus dans la mémoire

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 40
Création des types dérivés

• Avant d’utiliser un type dérivé dans une


communication, le programme doit le créer d’abord
• La création se fait en deux étapes:
 Construire le type de données avec les routines:
MPI_Type_contiguous, MPI_Type_vector,
MPI_Type_struct,…
 Inclure le type avec la routine: MPI_Type_commit

• Finalement, marquer le type de données pour la


désallocation avec : MPI_Type_free

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 41
Construction d’un type de données

• Un type général est constitué d’une séquence


des paires de 2 paramètres (type, depl)
du TypeMap
 type: un des types de base utilisés pour
construire le nouveau type
 depl: son déplacement (offset) par rapport à
l’adresse de l’origine du tampon d’envoi

• TypeMap = {(type1, depl1)…(typen,


depln)}
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 42
Taille d’un type

• int MPI_Type_size (MPI_Datatype


datatype, MPI_int *size)
• Obtenir le nombre d’octets (size)occupés
par un type datatype
• Équivalent à sizeof

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 43
Étendue d’un type

• int MPI_Type_extent(MPI_Datatype
datatype, MPI_int *size)
• Obtenir l’étendue extent d’un type
datatype

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 44
Type contiguë (contiguous)

• MPI_Type_contiguous(int count,
MPI_Datatype oldtype, MPI_Datatype
*newtype)
 count:nombre de blocs
 oldtype: ancien type
 newtype: nouveau type

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 46
Type contiguë (contiguous)

 Exemple pour count=4

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 47
Type vecteur (vector)

• MPI_Type_vector (int count, int


blocklength, int stride,
MPI_Datatype oldtype, MPI_Datatype
*newtype)
 count: nombre de blocs
 blocklength: nombre d’éléments dans chaque
bloc
 stride: espace entre le début de chaque bloc
mesuré comme étant le nombre d’éléments

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 48
Type vecteur (vector)

• “Vector” est un constructeur qui permet la


duplication d’un type dans des emplacements
de blocs séparant égaux
• Chaque bloc est obtenu en concaténant le
même nombre de copies de l’ancien type
• L’espace entre bloc est un multiple de
l’étendue de l’ancien type

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 49
Type vecteur (vector)

 Exemple pour count=2, stride=5 et


blocklengh=3

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 50
Type hvecteur (hvector)

• MPI_Type_hvector (int count, int


blocklength, MPI_Aint stride,
MPI_Datatype oldtype, MPI_Datatype
*newtype)
• Identique à MPI_Type_vector sauf que
“stride” est mesuré en octets plutôt qu’en
multiple de l’étendue de l’ancien type
• h vient de “heterogeneous”

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 51
Type structure (struct)

• MPI_Type_struct(int count, int


*array_of_blocklenghs, MPI_int
*array_of_displacements, MPI_Datatype
*array_of_types, MPI_Datatype *newtype)
 count:nombre de blocs
 array_of_blocklenghs: nombre d’éléments pour
chaque bloc
 array_of_displacements:déplacement en octet de
chaque bloc
 array_of_types: type d’éléments dans chaque bloc

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 52
Type structure (struct)

• Le constructeur de type le plus utilisé


• Permet la description d’un tableau de
structures comme étant un seul type de
données MPI

LOG645 – Architectures de calculs parallèles


Matériel développé par Lévis Thériault, Automne 2014 53
Type structure (struct)

 Exemple pour count=1,


blocklengh=(2,3,4) et
displacement=(0,7,15)

15
-

1 bloc
LOG645 – Architectures de calculs parallèles
Matériel développé par Lévis Thériault, Automne 2014 54
Libération du type

• MPI_Type_free
 Détruire un type
 Les types dérivés utilisant le type détruit ne sont
pas affectés
 Les communications en attente utilisant le type
détruit ne sont pas affectées

LOG645 – Architectures de calculs parallèles


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

Vous aimerez peut-être aussi