MPI_Recv:接收的大小与发送的大小不同

5
我正在编写一个程序,使用 MPI 库来检查最短路径。有两种情况:
一是找到了更好的路径,此时缓冲区的第一个槽将声明为 resultBuff[0] = 1,我需要遍历缓冲区的其余内容以获取更好的路径。
另一种情况是 resultBuff[0] = 0,我不会期望在缓冲区的其他单元格中获得任何值。

我能否使用单独的 MPI_Isend 调用:

如果我找到了更好的路径并将其存储在 resultBuff[1]resultBuff[10] 中:

MPI_Isend((void*)sendBuff, 11, MPI_INT, 0, 1, MPI_COMM_WORLD, &request);

如果找不到更好的路径:

MPI_Isend((void*)sendBuff, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &request);

在这两种情况下,我都会使用

MPI_Recv( (void*)resultBuff, 11, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status);

接收结果。

这个方法可行吗?
如果可行,那么如果我不发送更好的路径,我能节省通信成本吗?

注意:resultBuff 的大小为11。

2个回答

1

是的,你可以这样做。根据MPI标准和MPI_Recv的man pages,“count参数表示消息的最大长度;实际数量可以使用MPI_Get_count确定”,您可以使用从MPI_Recv()返回的status对象调用它。

至于节省通信成本,可能不会--这些短消息受到发送消息的延迟而不是带宽的影响。


0

你不需要发送一条消息来表明“我什么也没找到”:缺少消息同样可以传达这个信息。接收者可以定期调用MPI_Test,并检查状态对象以查看是否收到新消息。


1
那并没有回答问题,只是绕过了它。 - Nachshon Schwartz
1
我仍然需要知道路径计算何时结束。我需要发送一条消息,说明“我完成了”,只有这样我才能知道它是否找到了更好的路径。 - hizki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接