Uso de MPI Bcast para la comunicación MPI


Estoy tratando de transmitir un mensaje desde el nodo raíz a todos los demás nodos usando MPI_Bcast. Sin embargo, cada vez que corro este programa siempre se cuelga al principio. ¿Alguien sabe qué tiene de malo?

#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;
}
 62
Author: David, 2011-10-23

2 answers

Esta es una fuente común de confusión para las personas nuevas en MPI. Usted no usa MPI_Recv() para recibir datos enviados por una emisión; usted utiliza MPI_Bcast().

Por ejemplo, lo que quieres es esto:

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

Para las comunicaciones colectivas de MPI, todo el mundo tiene que participar; todo el mundo tiene que llamar al Bcast, o al Allreduce, o lo que sea. (Es por eso que la rutina Bcast tiene un parámetro que especifica la "raíz", o quién está haciendo el envío; si solo el remitente llama bcast, no necesitarías esto.) Todo el mundo llama a la emisión, incluidos los receptores; los receviers no solo publican una recepción.

La razón de esto es que las operaciones colectivas pueden involucrar a todos en la comunicación, de modo que se indica lo que desea que suceda (todo el mundo obtiene los datos de un proceso) en lugar de cómo sucede (por ejemplo, el procesador raíz recorre todos los demás rangos y hace un envío), de modo que hay margen para optimizar los patrones de comunicación (por ejemplo, comunicación jerárquica que toma log(P) pasos en lugar de P pasos para procesos P).

 116
Author: Jonathan Dursi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-15 00:13:39

MPI_Bcast es una operación colectiva y debe ser llamada por todos los procesos para poder completarla.

Y no hay necesidad de llamar a MPI_Recv cuando se usa MPI_Bcast. Hay otro post que puede ayudarte, haz clic aquí

 1
Author: GoingMyWay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:09