52

调用MPI_Finalize后程序不退出

 4 years ago
source link: https://www.tuicool.com/articles/JBZJvqM
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MPI程序在main函数中调用 MPI_Finalize 后不退出,而是hang住了。用 top 命令查看,发现所有MPI进程都占用了100%的cpu。

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

对这个解释初步想法是:我的程序不可能有这种情况,所有的进程通信都结束了,应该都走到这里了啊!继续查看日志和输出,半小时后醒悟过来,果然是这个原因!

线索在于排查输出文件,发现只有一个进程输出了应有的文件。顺着这个疑点查看代码,发现程序中一处循环结束判断对所有进程可能会返回不同结果。这导致了部分进程走到了 MPI_Finalize ,其他进程仍在后续循环中捣鼓。而且由于循环中调用了 MPI_(I)Send/Recv/Reduce 等通信指令,于是乎满足退出条件的进程卡在 MPI_Finalize ,其他进程卡在通信。

个人认为这个问题的解决办法有两种:

exit

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK