Программа должна создать 2 статических процесса, которые мы можем назвать m0 и m1.
Каждый мастер-процесс (m0 и m1) должен динамически создать 2 дочерних процесса с помощью mpi_spawn. Мастер m0 должен выполнить bcast для всех процессов с помощью одного вызова bcast. Я понятия не имею, как я мог решить это. Приведенный ниже код будет действителен, если, например, каждый мастер делает bcast для своих собственных детей, но не может делать их для детей другого мастера. Я думаю, мне следует создать внутреннюю связь, но я не знаю, как это сделать
#include "mpi.h"
#include "stdio.h"
#define PROCESOS 2
int main(int argc, char *argv[])
{
int rank, size, n = 1234, size_intercom, size_remote;
MPI_Comm intercom, iguales;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_get_parent(&intercom); // Para conocer si tiene padre o no
if (intercom == MPI_COMM_NULL)
{
MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, PROCESOS, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercom, MPI_ERRCODES_IGNORE);
printf("soy maestro %d\n", rank);
MPI_Comm_size(intercom, &size_intercom);
MPI_Comm_remote_size(MPI_COMM_WORLD, &size_remote);
printf("procesos en intercom %d, en remoto %d \n", size_intercom, size_remote);
MPI_Bcast(&n, 1, MPI_INT, MPI_ROOT, intercom);
}
else
{
// MPI_Intercomm_merge(intercom, 1, &iguales);
MPI_Bcast(&n, 1, MPI_INT, 0, intercom);
printf("soy hijo %d, recibo %d\n", rank, n);
}
MPI_Finalize();
return 0;
}
ВЕРСИЯ 2.0: Интересно, может ли это быть подходом, но я не могу получить ожидаемый результат:
if (intercom == MPI_COMM_NULL)
{
if (rank == 0)
{
n = 1234;
}
MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, PROCESOS, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercom, MPI_ERRCODES_IGNORE);
MPI_Intercomm_merge(intercom, 0, &iguales);
MPI_Intercomm_create(MPI_COMM_SELF, 0, iguales, 1, 1, &todos);
MPI_Bcast(&n, 1, MPI_INT, MPI_ROOT, todos);
printf("I'M MASTER rank: %d, i get: %d\n", rank, n);
}
else
{
MPI_Intercomm_merge(intercom, 1, &iguales);
MPI_Intercomm_create(MPI_COMM_WORLD, 0, iguales, 0, 1, &todos);
MPI_Bcast(&n, 1, MPI_INT, 0, todos);
printf("I'm a child %d, i get: %d\n", rank, n);
}
С предыдущей модификацией я получаю тот же результат, что и при выполнении bcast через внутреннюю связь de intercom comnunicator. Я не понимаю, почему:
I'M MASTER rank: 1, i get: 0
I'm a child 0, i get: 0
I'm a child 1, i get: 0
I'M MASTER rank: 0, i get: 1234
I'm a child 1, i get: 1234
I'm a child 0, i get: 1234