Я получаю странную ошибку с 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, установленную из источника два дня назад, без каких-либо видимых трудностей при установке.
Спасибо за любую помощь.