【发布时间】:2014-01-03 22:33:37
【问题描述】:
我有一个很长的 FORTRAN+MPI 代码挂在 mpi_finalize() 步骤。这可能是由于待处理的消息。即使我“ctrl-c”中止了挂起的程序,我也可以获得预期的输出。
这里的问题是:我可以从我的代码中删除 mpi_finalize(),会有任何潜在的问题吗?似乎通过删除 mpi_finalize() 输出没有什么不同,并且程序可以退出而不会出错。
我使用的编译器是“ifort version 13.1.1”。
谢谢。
-开
【问题讨论】:
-
在大多数 MPI 实现中,即使存在一个进程而不调用
MPI_FINALIZE,整个 MPI 作业都会中止。 -
尝试在
MPI_Finalize();之前添加MPI_Barrier();或printf("rank %d\n",rank);:这将告诉您谁在等待。留下未决消息意味着未来的潜在麻烦...... -
@francis 我将 MPI_Barrier() 放在 MPI_Finalize() 之前,并打印通过该障碍的行列。事实证明,所有等级都可以成功执行 MPI_Barrier()。但在那之后,程序卡在了 MPI_Finalize() 中。
-
@HristoIliev 我可以这么说,如果在 MPI_Finalize() 之前有 MPI_Barrier(),并且在所有 proc 到达障碍之前已经保存了计算输出,我应该从我的程序中得到“正确”的答案, MPI_Finalize() 是否可以执行?
-
如果工作崩溃被认为是正确答案的一部分 - 那么是的。否则,您应该在并行调试器中运行您的程序,并查看在调用
MPI_FINALIZE时是否有任何挂起的操作。从未等待的被遗忘的MPI_ISEND或MPI_IRECV是此类操作的主要候选对象。