我正在用 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/