Utilisation de MPI Bcast pour la communication MPI

j'essaie de diffuser un message depuis le noeud racine vers tous les autres noeuds en utilisant MPI_Bcast. Cependant, chaque fois que j'exécute ce programme, il se bloque toujours au début. Quelqu'un sait quel est le problème avec elle?

#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 %dn", rank, buf);
        }

        MPI_Finalize();
        return 0;
}
62
c mpi
demandé sur David 2011-10-23 07:03:56

2 réponses

c'est une source commune de confusion pour les personnes nouvelles au MPI. Vous n'utilisez pas MPI_Recv() pour recevoir des données envoyées par une émission; vous utilisez MPI_Bcast() .

par exemple, ce que vous voulez, c'est:

#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;
}

pour les communications collectives MPI, tout le monde doit participer; tout le monde doit appeler le Bcast, ou le Allreduce, ou ce que vous avez. (C'est pourquoi le Bcast routine a un paramètre qui spécifie la "racine", ou qui fait l'envoi; si seulement l'expéditeur a appelé bcast, vous n'auriez pas besoin de cela. Tout le monde appelle l'émission, y compris les récepteurs; les récepteurs ne se contentent pas de poster une réception.

la raison en est que les opérations collectives peuvent impliquer tout le monde dans la communication, de sorte que vous déclarez ce que vous voulez arriver (tout le monde obtient des données d'un processus) plutôt que comment il se produit (par exemple, le processeur root effectue des boucles sur tous les autres rangs et effectue un envoi), de sorte qu'il est possible d'optimiser les modèles de communication (par exemple, une communication hiérarchique basée sur un arbre qui prend log(P) pas plutôt que P pas pour les processus P).

116
répondu Jonathan Dursi 2012-06-15 00:13:39

MPI_Bcast est une opération collective et elle doit être appelée par tous les processus pour être complète.

et il n'est pas nécessaire d'appeler MPI_Recv en utilisant MPI_Bcast . Il ya un autre post peut vous aider, Cliquez ici

1
répondu GoingMyWay 2017-05-23 11:47:09