在MPI程序的main函数中调用MPI_Finalize
,程序没有预期退出而是hang住了。用top
命令查看,所有MPI进程都在运行并且占用100%的cpu。
上网查原因及解决方案,看到不少人也有这个困扰。有人说这是由于部分进程的通信未结束,于是MPI_Finalize
卡住,程序也就不会退出。顺着这个线索查看MPI_Finalize
的官方文档,确实有这个说法。
对这个解释初步想法是:我的程序不可能有这种情况,所有的进程通信应该都结束了,走到MPI_Finalize
才卡住的!继续根据日志和输出查找原因,半小时后醒悟过来,果然是部分进程在等待通信导致!
我是通过查看进程输出文件找到这个原因的,因为只看到一个进程正常输出了文件。顺着这个点查看代码,在程序的循环结束判断处找到了问题:判断条件对所有进程可能返回不同结果。于是部分进程跳出循环执行到MPI_Finalize
,其他进程仍继续循环并等待同步通信。就这样满足退出条件的进程卡在MPI_Finalize
,其他进程卡在通信等待。
这个现象的解决办法有两种:
同步退出条件,所有进程同进退;
在必须退出的地方,直接
exit
强制退出。
其实这应该算程序的bug,即进程/线程在判断分支中使用同步,这是危险的做法。所以用第一种的解决办法是正道,第二种方法应仅当在调试时使用,不推荐用在生产环境。
原文链接:https://www.qiquanji.com/post/4972.html
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
微信扫码关注
更新实时通知