【发布时间】:2014-01-29 21:00:10
【问题描述】:
我正在使用 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 ,当屏障完成时,你知道这里不会再有数据了。在发送方,您只需继续发送数据直到没有更多数据,然后做一个非阻塞屏障来完成事情。
【讨论】: