mpi4py Allgatherv не может передать некоторые данные - PullRequest
0 голосов
/ 29 марта 2019

Я получаю странную ошибку с mpi4py.MPI.Comm.Allgatherv.Предполагается, что следующее приведёт к тому, что все копии из разных рангов будут объединены в группы.

n = farray.size
total = comm.allreduce(n)
ns = np.empty(size, dtype=int)
comm.Allgather(np.array(n), ns)
displs = np.zeros(size + 1, dtype=int);
displs[1:] = ns
displs = np.cumsum(displs)
displs = tuple(displs[:-1])
farrays = np.zeros(total, dtype=array.dtype)
recvbuf = [farrays, tuple(ns), displs, dtype]
sendbuf = [farray, n]
logGATHER('sendbuf', sendbuf)
logGATHER('recvbuf', recvbuf)
logGATHER('len(farrays)', len(farrays))
comm.Allgatherv(sendbuf, recvbuf)
logGATHER('farrays', farrays)

LogGATHER вызывает print свои аргументы для stdout вместе с рангом процесса, чтобы я мог видеть, работает ли он.Они также показывают, что n, ns и displs имеют желаемые значения, 869445, (436665, 432780) и (0, 436665).

Это старый код, который я использовал для хорошобольше года без проблем.Но я просто попытался использовать его в нашей системе HPC, и я получаю сообщение об ошибке.Часто, но не в 100% случаев, некоторые данные не передаются.Например, работая только на двух процессах, я могу обнаружить, что в процессе ранга 1 данные ранга 1 присутствуют во второй части farrays, но первая часть, которая должна содержать данные ранга 0, вместо этого, кажется, содержит случайныевоспоминание об этом.Стоит отметить, что, поскольку я инициализировал farrays с нулями, это означает, что весь массив перезаписывается, но не с нужной информацией.

Есть идеи, что происходит, и как я могу это исправить?

Я использую mpi4py / 3.0.1, установленную из источника два дня назад, без каких-либо видимых трудностей при установке.

Спасибо за любую помощь.

...