C'est une source de confusion pour les personnes nouvelles à MPI. Vous n'utilisez pas l' MPI_Recv()
pour recevoir des données envoyées par une émission de radiodiffusion; vous utilisez MPI_Bcast()
.
Par exemple, ce que vous voulez, c'est ceci:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
int rank;
int buf;
const int root=0;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == root) {
buf = 777;
}
printf("[%d]: Before Bcast, buf is %d\n", rank, buf);
/* everyone calls bcast, data is taken from root and ends up in everyone's buf */
MPI_Bcast(&buf, 1, MPI_INT, root, MPI_COMM_WORLD);
printf("[%d]: After Bcast, buf is %d\n", rank, buf);
MPI_Finalize();
return 0;
}
De MPI communications collectives, tout le monde doit participer, tout le monde doit appeler l'Jetés ou la Allreduce, ou ce que vous avez. (C'est pourquoi les Jetés de routine a un paramètre qui spécifie la "racine", ou qui est en train de faire l'envoi; si seulement l'expéditeur appelé jetés, que vous n'avez pas besoin de cela.) Tout le monde l'appelle la diffusion, y compris les récepteurs; la receviers n'est pas juste poster un recevoir.
La raison pour cela est que les opérations collectives peuvent impliquer tout le monde dans la communication, afin de vous indiquer ce que vous souhaitez réaliser (tout le monde obtient un processus de données) plutôt que la façon dont cela se produit (par exemple, la racine du processeur passe en boucle sur tous les autres rangs et fait envoyer), de sorte qu'il est possible d'optimiser les modes de communication (par exemple, un arbre hiérarchisé de la communication qui prend en log(P)
étapes plutôt que d' P
les étapes pour le processus P).