将数据发送到给定的通信器

时间:2017-02-27 11:55:27

标签: mpi

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

例如,这张照片显示了我的目标: Communicators scheme

为此,我开发了打算传输MPI_Comm的测试代码。

  

parent.c

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

children.c

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

当然,由于以下原因,代码无效:

  

MPI_Send中的致命错误:无效的通信器,错误堆栈

有没有办法建立这种联系?

PS:这是一个例子,我知道如果我使用&#34; parent&#34;通过发送&#34; children.c&#34;,它会起作用。但我的目的是将数据发送到仅具有整数id的第三方通信器。

0 个答案:

没有答案