在MPI程序的main函数中调用MPI_Finalize,程序没有预期退出而是hang住了。用top命令查看,所有MPI进程都在运行并且占用100%的cpu。

上网查原因及解决方案,看到不少人也有这个困扰。有人说这是由于部分进程的通信未结束,于是MPI_Finalize卡住,程序也就不会退出。顺着这个线索查看MPI_Finalize的官方文档,确实有这个说法。

对这个解释初步想法是:我的程序不可能有这种情况,所有的进程通信应该都结束了,走到MPI_Finalize才卡住的!继续根据日志和输出查找原因,半小时后醒悟过来,果然是部分进程在等待通信导致!

我是通过查看进程输出文件找到这个原因的,因为只看到一个进程正常输出了文件。顺着这个点查看代码,在程序的循环结束判断处找到了问题:判断条件对所有进程可能返回不同结果。于是部分进程跳出循环执行到MPI_Finalize,其他进程仍继续循环并等待同步通信。就这样满足退出条件的进程卡在MPI_Finalize,其他进程卡在通信等待。

这个现象的解决办法有两种:

  1. 同步退出条件,所有进程同进退;
  2. 调用 MPI_Abort

其实这应该算程序的bug,即进程/线程在判断分支中使用同步,这是危险的做法。所以用第一种的解决办法是正道,第二种方法则简单粗暴省事。