c++ - MPI 中发送消息数量未知时,如何接收?

标签 c++ mpi

我正在用 MPI 编程。我想发送一些东西到另一个处理器并在那里接收它,但我不知道我会发送多少消息。事实上,发送到另一个处理器的消息数量取决于我在程序中读取的文件,所以我不知道我应该在另一端写多少接收。我应该使用哪种方法和哪种功能?

最佳答案

您仍然可以使用发送和接收,但您还需要添加一种新的消息,告诉接收进程不会有新消息。通常这是通过使用不同的标签发送来处理的。所以你的程序看起来像这样:

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,当屏障完成时,您知道这里不会再有数据了。在发送端,你只是继续发送数据直到没有更多,然后做一个非阻塞屏障来完成事情。

关于c++ - MPI 中发送消息数量未知时,如何接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431180/

相关文章:

c++ - 比较 if 语句中的 int 值

mpi - 如何使用MPI组织异步通信?

c++ - MPI_Wait 中的 fatal error

c++ - 我在 C++ 初学者中遇到了无限循环问题

sockets - 在不同的 MPI 程序之间进行通信

c - MPI_Type_create_resized 的链接器错误

c - 使用 C 的 MPI 分段故障 MPI_Scatter

c++ - 从继承的类实例调用静态成员

c++ - 在 C++ 中创建一个 zip 存档

c++ - 访问另一个结构中的结构字段