RMA Remote memory access Types de communication Collective






















![Créer un nouveau groupe int MPI_Group_incl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup) Créer un nouveau groupe int MPI_Group_incl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup)](https://slidetodoc.com/presentation_image/4bee71edac8159cf418df425005434d8/image-23.jpg)




- Slides: 27
RMA (Remote memory access)
Types de communication • Collective: Tous les processus du commutator participent activement • Point-à-point, Cible active: Communication entre deux processus. Les deux sont actifs. • Point-à-point, Cible passive: Communication entre deux processus. Un seul est actif.
RMA (Remote memory access): permet plus de souplesse dans la communication entre les processus. Un processus « origine » indique tous les paramètres de la communication avec un processus « cible » C’est ce que l’on appelle une « communication à sens unique » .
Communication 3 types de communication: • Put • Get • Accumulate Tous ces appels sont non-bloquants
Synchronisation 3 types de synchronisation: • Fence • Start, Complete, Post, Wait • Lock, unlock
Fenêtre (Window) Mémoire allouée par chaque processus et éventuellement accessible à tous les autres. La création d’une fenêtre se fait à l’aide de la commande MPI_Win_Create
Époques • Époque d’accès: période entre deux synchronisation pendant laquelle la communication est possible. • Époque d’exposition: Période pendant laquelle un processus accepte de rendre disponible sa partie de fenêtre.
Création d’une fenêtre MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win); Il s’agit d’un appel collectif
Libérer une fenêtre int MPI_Win_free(MPI_Win *win) Il s’agit aussi d’un appel collectif
Allocation de l’espace mémoire int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr) Permet d’informer le compilateur que la mémoire sera utilisée en RMA.
Libérer la moimoire int MPI_Free_mem(void *base)
MPI_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win)
MPI_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win)
MPI_Accumulate int MPI_Accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
Barrière int MPI_Win_fence(int assert, MPI_Win win) Il s’agit d’un appel collectif qui débute et/ou termine une époque.
Début d’une époque d’accès int MPI_Win_start(MPI_Group group, int assert, MPI_Win win) Sur certains système, l’assertion peut être MPI_MODE_NOCHECK mais 0 est toujours valide. Seul le nœud origine fait cet appel
Fin d’une époque d’accès MPI_Win_complete(MPI_Win win) Seul le nœud origine fait cet appel
Début d’une époque d’exposition int MPI_Win_post(MPI_Group group, int assert, MPI_Win win) Seul le nœud cible fait cet appel
Fin d’une époque d’exposition int MPI_Win_wait(MPI_Win win) Seul le nœud origine fait cet appel
Cible active
Communicator Deux principale composante: • Groupe: Collection ordonnée de processus • Contexte: permet la gestion des messages Ex. tags) Permet aussi de créer une topologie
Groupe int MPI_Comm_group(MPI_Comm comm, MPI_Group *group) Retourne le groupe associé à un communicator
Créer un nouveau groupe int MPI_Group_incl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup)
Cible passive int MPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win) Le type est MPI_LOCK_EXCLUSIVE ou MPI_LOCK_SHARED Cet appel est fait par le processus origine seulement.
Cible passive int MPI_Win_unlock(int rank, MPI_Win win) Cet appel est fait par le processus origine seulement.
Cible passive
Exemples Exemple 1 Exemple 2