mpi4py.MPI.Comm.Allgatherv出现一个奇怪的错误。下面应该将所有来自不同等级的Farray副本并置为Farray。
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调用将其参数与进程等级一起输出到stdout,因此我可以查看其是否有效。它们还显示n
,ns
和displs
具有所需的值869445
,(436665, 432780)
和(0, 436665)
。
这是我已经使用了一年多的老代码了,没有任何问题。但是我只是试图在我们的HPC系统上使用它,但出现错误。通常,但不是100%的时间,某些数据不会被传输。例如,在仅两个进程上运行,我可能会发现在等级1进程中,等级1数据存在于farrays的第二部分中,但是第一部分应该包含等级0的数据,而似乎包含随机的记忆力下降。值得指出的是,由于我使用零初始化了farrays,因此这意味着整个数组都将被覆盖,只是没有正确的东西。
有什么想法,怎么解决?
我正在使用两天前从源代码安装的mpi4py / 3.0.1,没有明显的安装困难。
感谢您的帮助。