0% ont trouvé ce document utile (0 vote)
4 vues5 pages

Cours MPI

MPI_Comm_split permet de diviser un groupe de processus MPI en sous-groupes disjoints basés sur une valeur de couleur, avec un ordre de rang déterminé par une clé. L'exemple fourni illustre comment diviser les processus en groupes de rangs pairs et impairs. MPI_Probe permet d'obtenir des informations sur un message en attente sans le recevoir, facilitant la gestion de messages de longueur inconnue.

Transféré par

Ayman Bouattane
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)
4 vues5 pages

Cours MPI

MPI_Comm_split permet de diviser un groupe de processus MPI en sous-groupes disjoints basés sur une valeur de couleur, avec un ordre de rang déterminé par une clé. L'exemple fourni illustre comment diviser les processus en groupes de rangs pairs et impairs. MPI_Probe permet d'obtenir des informations sur un message en attente sans le recevoir, facilitant la gestion de messages de longueur inconnue.

Transféré par

Ayman Bouattane
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

MPI_Comm_split

• MPI_Comm_split partitionne le groupe de processus MPI associés au communicateur


passé en sous-groupes disjoints.
• La division est déterminée par la valeur de couleur passée : les processus MPI
fournissant la même valeur de couleur seront placés dans le même sous-groupe.
• À l'intérieur de chaque sous-groupe, le rang des processus MPI placés dans chaque
sous-groupe est ordonné selon la valeur de la clé passée.
• MPI_SUCCESS: The routine successfully completed.

int MPI_Comm_split(MPI_Comm old_communicator,


int colour,
int key,
MPI_Comm* new_communicator);

Calcul parallèle Page 19


MPI_Comm_split
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);

int rank, size;


MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

int color = rank < size / 2 ? 0 : 1; // Divise les processus en deux groupes égaux

MPI_Comm new_comm;
MPI_Comm_split(MPI_COMM_WORLD, color, rank, &new_comm);

int new_rank, new_size;


MPI_Comm_rank(new_comm, &new_rank);
MPI_Comm_size(new_comm, &new_size);

printf("Process %d in MPI_COMM_WORLD has been split into %d sub-group.\n", rank, new_size);


printf(" Process %d in MPI_COMM_WORLD has rank %d in the new sub-group.\n", rank, new_rank);

MPI_Finalize();
return 0;
}
Calcul parallèle Page 19
Exercice

Division du groupe de processus en sous-groupes de rangs pairs et


impairs :
L'objectif de cet exercice est de diviser un groupe de processus MPI_COMM_WORLD en
deux sous-groupes :

• un sous-groupe pour les processus avec un rang pair et


• un autre sous-groupe pour les processus avec un rang impair. Vous devez utiliser la
fonction MPI_Comm_split pour réaliser cette division.

Calcul parallèle Page 19


MPI_Probe

MPI_Probe obtient des informations sur un message en attente de réception, sans le recevoir
réellement. int MPI_Probe(int source,
int tag,
MPI_Comm communicator,
MPI_Status* status);

Cette approche permet par exemple de recevoir des messages de longueur inconnue en utilisant
l’appel système MPI_Probe pour obtenir sa longueur.

S'il n'y a pas de message de la source donnée avec la taille donnée en attente de réception,
MPI_Probe bloquera jusqu'a ce qu'un tel message arrive.
int MPI_Get_count(const MPI_Status* status,
MPI_Datatype datatype,
int* count);

Renvoie le nombre d’element du msg identifie par status

Calcul parallèle Page 40


Exemple
int main(int argc, char* argv[])
{
MPI_Init(&argc, &argv);
int size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
int my_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
switch(my_rank)
{
case 0:
{int buffer[3] = {123, 456, 789};
printf("Process %d: sending a message containing 3 ints (%d, %d, %d), but the receiver is not aware of the length.\n", my_rank,
buffer[0], buffer[1], buffer[2]);
MPI_Send(buffer, 3, MPI_INT, 1, 0, MPI_COMM_WORLD);
break;}
case 1:
{MPI_Probe(0, 0, MPI_COMM_WORLD, &status);
printf("Process %d: obtained message status by probing it.\n",
my_rank); int count;
MPI_Get_count(&status, MPI_INT, &count);
printf(“%d”,count);
int* buffer = (int*)malloc(sizeof(int) * count);
MPI_Recv(buffer, count, MPI_INT, SENDER, 0, MPI_COMM_WORLD,
&status); printf("Process %d: received message with all %d ints:", my_rank,
count); for(int i = 0; i < count; i++) printf(" %d", buffer[i]);
printf(".\n");
break;}
} MPI_Finalize();
return EXIT_SUCCESS;
}
Calcul parallèle Page 40

Vous aimerez peut-être aussi