Я использую 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?
Платформа:
- OSX Mojave
- OpenMPI 4.0.0 (через Homebrew)
- mpi4py 3.0.1
- Python 3.7