当MPI发送消息的数量未知时,我该怎么做才能接收消息?

4

我正在用MPI编程。我希望将一些东西发送到另一个处理器并在那里接收,但我不知道我会发送多少信息。实际上,发送到其他处理器的消息数量取决于我在程序中读取的文件,因此我不知道在另一侧应该写多少个接收函数。我应该使用哪种方法和哪个函数呢?

1个回答

4
你仍然可以使用发送和接收,但你还需要添加一种新的消息类型,以告诉接收进程不会有新消息。通常这是通过使用不同的标签进行处理的。因此,你的程序看起来应该像这样:
if (sender) {
    while (data_to_send == true) {
        MPI_Send(data, size, datatype, receiving_rank, 0, MPI_COMM_WORLD);
    }
    for (i = 0; i < size; i++) {
        MPI_Send(NULL, 0, MPI_INT, i, 1, MPI_COMM_WORLD);
    }
} else {
    while (1) {
        MPI_Recv(data, size, datatype, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
        if (status.MPI_TAG == 1) break;

        /* Do processing */
    }
}

如果您有非阻塞集合(来自MPI-3),那么有一种更好的方法可行。在开始接收数据之前,您可以发布一个非阻塞障碍。然后您开始发布非阻塞接收。而不是仅等待接收,您使用waitany在两个请求上等待,当障碍完成时,您知道不会再有更多数据了。在发送方面,您只需持续发送数据,直到没有更多数据为止,然后进行非阻塞障碍以完成操作。


谢谢,但对于第一个解决方案,我有另一个问题。如果发送消息的进程有三个不同标签的单独发送,我该如何识别何时退出while循环?我应该在什么时候退出?因为不止一个消息。 - user3241383
1
你只需要选择一个标签,表示你已经完成了算法。你可以拥有任意多个标签。 - Wesley Bland
很酷的技巧!不幸的是,当有许多发送进程并且我们不知道哪一个是最后一个发送者时,它似乎不起作用。在我的情况下,我有许多可能或可能不会向主节点发送消息的从节点。因此,目前没有办法让主节点知道要期望多少接收。有什么想法吗? - kornesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接