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