【发布时间】:2020-03-11 21:15:28
【问题描述】:
我正在尝试使用 Scatter() 在 3 个进程之间分散一个大小为 (3,512,512,48,2) 且数据类型为双精度 np.float64 的数组:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
if __name__ == "__main__":
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float64)
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatter([a, MPI.DOUBLE], a_split, root = 0)
但是,程序出现死锁。根据我从这里找到的内容
mpi4py scatter and gather with large numpy arrays
这里
Along what axis does mpi4py Scatterv function split a numpy array?
对于大数组,我必须使用Scatterv() 函数。所以,这里是另一个使用这个函数的代码:
# mpirun -np 3 python3 prog.py
import numpy as np
from mpi4py import MPI
if __name__ == "__main__":
comm = MPI.COMM_WORLD
nproc = comm.Get_size()
rank = comm.Get_rank()
a = None
a_split = np.empty([512,512,48,2],dtype = np.float64)
size = 512*512*48*2
if rank==0:
a = np.zeros([3,512,512,48,2],dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatterv([a,(size,size,size),(0,size,2*size),MPI.DOUBLE],a_split,root =0)
然而,这也会导致死锁。我还尝试使用与Send(),Recv() 的点对点通信发送数组,但这没有帮助。似乎死锁仅取决于数组大小 - 例如,如果我将数组大小从 [512,512,48,2] 更改为 [512,10,48,2],则代码有效。
谁能建议我在这种情况下可以做什么?
【问题讨论】:
标签: python arrays numpy mpi mpi4py