我正在开发一个带有MPI的C ++项目,该项目实现了分布式终止检测算法。终止部分如下所示:
MPI_Iprobe(MASTER, TERMINATION, MPI_COMM_WORLD, &terminationFlag, &status);
if (terminationFlag!=0)
{
MPI_Recv(0, 0, MPI_INT, MASTER, TERMINATION, MPI_COMM_WORLD, &status);
//Halt the process
}
MPI_Iprobe从MASTER节点查找带有TERMINATION标记的消息(MASTER在检测到终止条件时发送终止消息)。如果消息存在,则当前进程接收消息并自行停止。
在这里,我想知道如果收到终止消息后如何优雅地停止进程。我尝试过MPI_Finalize(),但程序不断产生以下错误:
*** The MPI_Send() function was called after MPI_FINALIZE was invoked.
*** This is disallowed by the MPI standard.
*** Your MPI job will now abort.
我通常将MPI_Finalize()放在代码的底部,以确保在调用此函数之前一切都已完成。但是,因为该过程可能在过程中间停止。我不知道是否应该使用MPI_Finalize()。
我使用mpic ++作为编译器和mpirun来运行程序。
更新
正如Hristo和suszterpatt指出的那样,我应该使用MPI_Finalize()
,然后使用return 0
。这似乎解决了这个问题。