我尝试使用np.float64
在3个进程之间散布大小为(3,512,48,2)的数组,数据类型为双精度Scatter()
:
# 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,2],dtype = np.float64)
if rank==0:
a = np.zeros([3,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,dtype = np.float64)
size = 512*512*48*2
if rank==0:
a = np.zeros([3,dtype = np.float64)
print(a.shape)
comm.Barrier()
print('Scattering')
comm.Scatterv([a,(size,size,size),(0,2*size),root =0)
但是,这也导致了僵局。我还尝试过通过与Send()
,Recv()
进行点对点通信来发送数组,但这无济于事。死锁似乎仅取决于数组的大小,例如,如果我将数组的大小从[512,2]
更改为[512,10,2]
,则代码有效。
有人可以建议我在这种情况下可以做什么吗?