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

时间:2010-04-20 18:56:19

标签: c concurrency mpi

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

我正在学习MPI,并在C中编写小糖分配模拟。当工厂停止生产时,这些过程结束。当仓库空着时,它们就会结束。我可以通过查看MPI_Send的返回值,以某种方式判断商店对仓库的订单是否成功(因为仓库流程已经结束)?该文档未提及此情况的特定错误代码,但未成功返回错误。

我可以这样做:

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

忽略错误代码?

由于

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

如果您希望一个进程看到另一个进程何时结束,您应该使用指定的标记从整理过程发送一条消息,并在另一个进程中进行peridocally post nonblocking receives以查看是否已发送退出通知。< / p>

或者,如果您希望整个程序在一个进程停止时中止,最简单的方法是在完成过程中使用MPI_COMM_WORLD作为通信器调用MPI_Abort(),这可以保证关闭所有进程。 / p>

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