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

时间:2014-01-29 12:30:10

标签: c++ mpi

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

1 个答案:

答案 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,当屏障完成时,您知道此处将不再有任何数据。在发送方,你只是继续发送数据,直到不再有,然后做一个非阻塞屏障来完成任务。