Mpi 向给定的通信器发送数据

Mpi 向给定的通信器发送数据,mpi,Mpi,我想知道是否有可能通过整数值向第三方通讯器发送数据。 换句话说,我想向非相关通信器中的进程发送一个MPI_Comm(int),以便在它们之间建立通信 例如,此图显示了我的目标: 为此,我开发了用于传输MPI_通信的测试代码 父.c #包括 #包括 int main(int argc,字符**argv){ MPI_Init(NULL,NULL); int世界大小、世界排名; MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小); MPI通信等级(MPI通信世界级和世界级);

我想知道是否有可能通过整数值向第三方通讯器发送数据。 换句话说,我想向非相关通信器中的进程发送一个MPI_Comm(int),以便在它们之间建立通信

例如,此图显示了我的目标:

为此,我开发了用于传输MPI_通信的测试代码

父.c

#包括
#包括
int main(int argc,字符**argv){
MPI_Init(NULL,NULL);
int世界大小、世界排名;
MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小);
MPI通信等级(MPI通信世界级和世界级);
MPI_通信儿童;
int err[世界大小],msg;
MPI_Comm_spawn(“./children”,NULL,2,MPI_INFO_NULL,0,MPI_Comm_WORLD,&children,err);
如果(世界排名==0){
MPI_发送(&children,1,MPI_INT,0,0,children);
MPI_Recv(&msg,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,children,MPI_STATUS_IGNORE);
}
MPI_Finalize();
返回(0);
}
儿童

#包括
#包括
int main(int argc,字符**argv){
MPI_Init(NULL,NULL);
int世界大小、世界排名;
MPI_Comm_大小(MPI_Comm_WORLD和WORLD_大小);
MPI通信等级(MPI通信世界级和世界级);
MPI_通信父级;
MPI_Comm_get_parent(&parent);
int comm,msg=123;
如果(世界排名==0){
MPI_Recv(&comm,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,parent,MPI_STATUS_IGNORE);
MPI_Comm子项=(MPI_Comm)Comm;
MPI_Send(&msg,1,MPI_INT,0,0,子项);
}
MPI_Finalize();
返回(0);
}
当然,由于以下原因,代码不起作用:

MPI_发送中的致命错误:无效的通信器,错误堆栈

有没有办法建立这种联系


PS:这是一个例子,我知道如果我在发送“children.c”时使用“parent”comm,它会起作用。但我的目的是只使用整数id向第三方通信器发送数据。

通信器句柄是本地值。您不能简单地将句柄发送到不属于该通信器的进程,然后让它进行通信。在您的情况下,您可以使用
MPI\u Intercomm\u merge
将“父级”与“辅助级”合并,然后使用
MPI\u Intercomm\u create
在“子级”与合并的“父级辅助级”之间创建一个内部通讯器。根据执行合并的方式,“Aux”中的列组将是“父Aux”中的第一个列组或最后一个列组。通信器句柄是本地值。您不能简单地将句柄发送到不属于该通信器的进程,然后让它进行通信。在您的情况下,您可以使用
MPI\u Intercomm\u merge
将“父级”与“辅助级”合并,然后使用
MPI\u Intercomm\u create
在“子级”与合并的“父级辅助级”之间创建一个内部通讯器。根据执行合并的方式,“Aux”中的列组将是“父Aux”中的第一个列组或最后一个列组。
#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    MPI_Init(NULL, NULL);
    int world_size, world_rank;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    MPI_Comm children;
    int err[world_size], msg;

    MPI_Comm_spawn("./children", NULL, 2, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &children, err);
    if (world_rank == 0) {
        MPI_Send(&children, 1, MPI_INT, 0, 0, children);
        MPI_Recv(&msg, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, children, MPI_STATUS_IGNORE);
    }
    MPI_Finalize();
    return (0);
}
#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    MPI_Init(NULL, NULL);
    int world_size, world_rank;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    MPI_Comm parent;
    MPI_Comm_get_parent(&parent);

    int comm, msg = 123;
    if (world_rank == 0) {
        MPI_Recv(&comm, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, parent, MPI_STATUS_IGNORE);
        MPI_Comm children = (MPI_Comm) comm;
        MPI_Send(&msg, 1, MPI_INT, 0, 0, children);
    }
    MPI_Finalize();
    return (0);
}