我在MPI编程。我想发送一些东西到另一个处理器并在那里接收,但我不知道我将发送多少消息。事实上,发送到另一个处理器的消息数量取决于我在程序中读取它的文件,所以我不知道我应该在另一端写入多少接收。我应该使用哪种方法和功能?
答案 0 :(得分: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,当屏障完成时,您知道此处将不再有任何数据。在发送方,你只是继续发送数据,直到不再有,然后做一个非阻塞屏障来完成任务。