mpi_bcast example ejemplo c mpi

example - Usando MPI_Bcast para la comunicación MPI



mpi_bcast ejemplo (2)

Esta es una fuente común de confusión para las personas nuevas en MPI. No utiliza MPI_Recv() para recibir datos enviados por una transmisión; 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, todos tienen que participar; todo el mundo tiene que llamar a Bcast, o Allreduce, o lo que sea. (Es por eso que la rutina de Bcast tiene un parámetro que especifica la "raíz" o quién realiza el envío; si solo el remitente se llama bcast, no necesitaría esto). Todos llaman a la transmisión, incluidos los receptores; los receviers no solo publican un recibo

La razón de esto es que las operaciones colectivas pueden involucrar a todos en la comunicación, de modo que usted declara lo que quiere que suceda (todos obtienen los datos de un proceso) en lugar de cómo sucede (por ejemplo, el procesador raíz se desplaza sobre todos los otros rangos y lo hace). un envío), de modo que haya un margen para optimizar los patrones de comunicación (por ejemplo, una comunicación jerárquica basada en árbol que toma pasos de log(P) lugar de pasos de P para procesos P).

Estoy intentando transmitir un mensaje desde el nodo raíz a todos los demás nodos utilizando MPI_Bcast. Sin embargo, siempre que ejecuto este programa siempre se cuelga al principio. ¿Alguien sabe qué le pasa?

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


MPI_Bcast es una operación colectiva y debe ser llamada por todos los procesos para que se complete.

Y no hay necesidad de llamar a MPI_Recv cuando se usa MPI_Bcast . Hay otra publicación que puede ayudarte, haz clic aquí.