具有2个静态过程的问题,该问题会创建2个带有打开mpi的动态过程

问题描述 投票:0回答:1

程序必须创建2个我们可以调用m0和m1的静态进程。

每个主进程(m0和m1)必须使用mpi_spawn动态创建2个子进程。 m0主服务器必须通过单个调用bcast对所有进程进行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);
    }

通过先前的修改,我得到的结果与通过对讲机通信器对讲机进行广播相同。我不明白为什么:

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
c mpi openmpi
1个回答
0
投票

如果无法修改应用程序,以便两个主控器一起产生四个从属器,或者不能使用两步广播,这就是达到预期结果的方法。

#include "mpi.h"
#include "stdio.h"
#define PROCESSES 2

int main(int argc, char *argv[])
{

    int rank, size, n = -1, remote_leader = -1;
    int master;
    MPI_Comm intercomm, mergedcomm, universe_inter, universe;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    MPI_Comm_get_parent(&intercomm);

    if (MPI_COMM_NULL == intercomm)
    {
        printf("I am master %d\n", rank);
        MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, PROCESSES, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm, MPI_ERRCODES_IGNORE);
        MPI_Bcast(&rank, 1, MPI_INT, MPI_ROOT, intercomm);
        master = rank;
        remote_leader = master^1;
        if (0 == rank) {
            n = 1234;
        }
    }
    else
    {
        MPI_Bcast(&master, 1, MPI_INT, 0, intercomm);
        printf("I am slave %d from master %d\n", rank, master);
    }

    /* make sure the master rank has rank 0 in the merged communicator */
    MPI_Intercomm_merge(intercomm, (NULL==MPI_COMM_NULL)?0:1, &mergedcomm);
    MPI_Intercomm_create(mergedcomm, 0, MPI_COMM_WORLD, remote_leader, 0, &universe_inter);
    /* make sure master 0 has rank 0 in the universe */
    MPI_Intercomm_merge(universe_inter, master, &universe);
    MPI_Comm_free(&mergedcomm);

    MPI_Bcast(&n, 1, MPI_INT, 0, universe);
    printf ("n = %d\n", n);

    MPI_Comm_free(&universe);
    MPI_Comm_disconnect(&intercomm);
    MPI_Finalize();
    return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.