2

当我 MPI_Send 到已完成的进程时会发生什么?

我正在学习 MPI,并用 C 编写一个小型糖分布模拟。当工厂停止生产时,这些过程就结束了。当仓库空空如也时,它们就结束了。我能否通过查看 MPI_Send 的返回值来判断商店到仓库的订单是否未成功(因为仓库流程已结束)?文档没有提到这种情况的特定错误代码,但没有返回错误表示成功。

我可不可以做:

if (MPI_Send(...)) {
    ...
    /* destination has ended */
    ...
}

并忽略错误代码?

谢谢

4

2 回答 2

1

标准不允许使用不匹配的 MPI_Send 调用编写代码。除其他外,这意味着结果行为将取决于实现。可能的行为范围包括几个“明显”的选项:退出、挂起/死锁、内存损坏等。

大多数实现都有一定程度的调试输出,这可能有助于追踪这种逻辑编程错误。可以使用 MPI_Wait* 来阻止所有 MPI_Send/MPI_Recv 对的完成。在一般情况下,在接收节点进入 MPI_Finalize 之前,不可能知道 MPI_Send 不会被匹配。换句话说,在这种情况下使用屏障会导致程序挂起。

无论如何,这将是 MPI_Finalize 的错误条件。MPI_Send 的目标等级应该被检测为已经退出......因此 MPI_Send 永远无法匹配。但是,这种错误情况可能会导致 MPI 作业无法清理所有 rank 进程。

于 2010-04-22T17:51:42.623 回答
0

据我所知,MPI 标准没有为 MPI_Send() 定义返回值和输出参数:它不提供有关消息发送事件的任何信息,可能是因为消息缓冲可以使其没有可用的信息调用返回时的结果。

如果您希望一个进程查看另一个进程何时结束,您应该从完成进程发送一条带有指定标记的消息,并定期在另一个进程中发布非阻塞接收以查看是否发送了退出通知。

或者,如果您希望整个程序在一个进程停止时中止,最简单的做法是在结束进程中简单地调用 MPI_Abort(),并以 MPI_COMM_WORLD 作为通信器,这样可以保证关闭所有进程。

编辑:要实际回答标题中的问题,“当我 MPI_Send 到已完成的进程时会发生什么?”:据我了解,这取决于是否使用缓冲。如果不使用缓冲,则程序将挂起。如果使用缓冲,则 MPI_Send() 将缓冲消息并且进程将继续运行,但由于永远不会发布匹配的接收,因此消息将永远不会离开缓冲区。经常这样做最终会导致程序内存不足。

于 2010-04-20T20:25:51.643 回答