MPI.Gather 大型数组的调用挂起

MPI.Gather call hangs for large-ish arrays

我使用 mpi4py 并行化我的 Python 应用程序。我注意到每当我过多地增加进程数或涉及的数组大小时,我 运行 在 MPI.Gather 期间陷入死锁。

示例:

from mpi4py import MPI

import numpy as np

COMM = MPI.COMM_WORLD
RANK = COMM.Get_rank()
SIZE = COMM.Get_size()


def test():
    arr = RANK * np.ones((100, 400, 15), dtype='int64')

    recvbuf = None
    if RANK == 0:
        recvbuf = np.empty((SIZE,) + arr.shape, dtype=arr.dtype)

    print("%s gathering" % RANK)
    COMM.Gather([arr, arr.size, MPI.LONG], recvbuf, root=0)
    print("%s done" % RANK)

    if RANK == 0:
        for i in range(SIZE):
            assert np.all(recvbuf[i] == i)


if __name__ == '__main__':
    test()

执行此操作会得到:

$ mpirun -n 4 python bug.py 
1 gathering
2 gathering
3 gathering
0 gathering
1 done
2 done

同时进程 0 和 3 无限期挂起。但是,如果我将数组维度更改为 (10, 400, 15),或者 运行 带有 -n 2 的脚本,一切都按预期工作。

我错过了什么吗?这是 OpenMPI 或 mpi4py 中的错误吗?

平台:

我刚刚注意到,通过 Homebrew,MPICH 一切正常。因此,如果有人在 OSX 上遇到类似情况,解决方法是

$ brew unlink open-mpi
$ brew install mpich
$ pip uninstall mpi4py
$ pip install mpi4py --no-cache-dir

然后,我不得不编辑 /etc/hosts 并添加行

127.0.0.1     <mycomputername>

为了让 MPICH 正常工作。

更新:

到目前为止,这个问题应该已经解决了。 The bug was reported 并将 OpenMPI 更新到 4.0.1 为我修复了它。