MPI.Сбор вызовов зависает для массивов с большим числом элементов. - PullRequest
0 голосов
/ 21 февраля 2019

Я использую 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

1 Ответ

0 голосов
/ 21 февраля 2019

Я только что заметил, что все работает нормально с MPICH через Homebrew.Таким образом, на случай, если кто-нибудь столкнется с подобной ситуацией в 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 для правильной работы.

...