1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

调用MPI_Finalize后程序不退出

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

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

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

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

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

  1. 同步退出条件,所有进程同进退;

  2. 在必须退出的地方,直接exit强制退出。

其实这应该算程序的bug,即进程/线程在判断分支中使用同步,这是危险的做法。所以用第一种的解决办法是正道,第二种方法应仅当在调试时使用,不推荐用在生产环境。

原文链接:https://www.qiquanji.com/post/4972.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

微信扫码关注

更新实时通知

作者:xialibing 分类:网络教程 浏览: