86 votes

Utilisation de MPI_Bcast pour la communication MPI

J'essaie de diffuser un message du nœud racine à tous les autres nœuds à l'aide de MPI_Bcast. Cependant, chaque fois que je lance ce programme, il se bloque toujours au début. Quelqu'un sait-il ce qui ne va pas?

 #include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
        int rank;
        int buf;
        MPI_Status status;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);

        if(rank == 0) {
                buf = 777;
                MPI_Bcast(&buf, 1, MPI_INT, 0, MPI_COMM_WORLD);
        }
        else {
                MPI_Recv(&buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
                printf("rank %d receiving received %d\n", rank, buf);
        }

        MPI_Finalize();
        return 0;
}
 

164voto

Jonathan Dursi Points 25143

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X