首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MPI4PY快速失败

用MPI4PY快速失败
EN

Stack Overflow用户
提问于 2018-04-17 01:08:16
回答 2查看 1.3K关注 0票数 5

在使用mpi4py运行MPI脚本时,我希望采取以下行为:当任何进程抛出异常时,mpirun (及其派生的进程)应该立即退出,并使用非零错误代码。但是,我发现,即使一个或多个进程抛出异常,执行仍在继续。

我使用的是mpi4py 3.0.0和OpenMPI 2.1.2。我正在用mpirun --verbose -mca orte_abort_on_non_zero_status 1 -n 4 python my_script.py运行这个脚本。我预期这会在睡眠被击中之前立即结束,但是相反,使用秩!= 0睡眠的进程:

代码语言:javascript
复制
import time
import mpi4py

def main():
    import mpi4py.MPI
    mpi_comm = mpi4py.MPI.COMM_WORLD
    if mpi_comm.rank == 0:
        raise ValueError('Failure')


    print('{} continuing to execute'.format(mpi_comm.rank))
    time.sleep(10)
    print('{} exiting'.format(mpi_comm.rank)


if __name__ == '__main__':
    main()

我怎样才能得到我想要的行为(如果有任何进程失败,请迅速失败)。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-06 10:50:26

这似乎是mpi4py的一个已知问题。我从https://groups.google.com/forum/#!topic/mpi4py/RovYzJ8qkbc上读到:

mpi4py为您初始化/终结MPI。初始化发生在导入时,当process即将完成时(我正在使用Py_AtExit() call调用来完成)。由于MPI_Finalize()是集体的,并且在大多数MPI内隐式中可能是阻塞的,所以会出现死锁。

一个解决方案是覆盖sys.excepthook并在其中显式调用MPI.COMM_WORLD.Abort

下面是您修改的代码:

代码语言:javascript
复制
import sys
import time
import mpi4py.MPI
mpi_comm = mpi4py.MPI.COMM_WORLD

def mpiabort_excepthook(type, value, traceback):
    mpi_comm.Abort()
    sys.__excepthook__(type, value, traceback)

def main():
    if mpi_comm.rank == 0:
        raise ValueError('Failure')


    print('{} continuing to execute'.format(mpi_comm.rank))
    time.sleep(10)
    print('{} exiting'.format(mpi_comm.rank))

if __name__ == "__main__":
    sys.excepthook = mpiabort_excepthook
    main()
    sys.excepthook = sys.__excepthook__
票数 5
EN

Stack Overflow用户

发布于 2018-05-07 20:37:49

事实证明,mpi4py可以作为一个模块运行,解决这个问题(在内部,如jcgiret所说,调用Abort() ):

代码语言:javascript
复制
mpirun --verbose -mca orte_abort_on_non_zero_status 1 -n 4 python -m mpi4py my_script.py
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49868333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档