我使用python和mpi4py在计算集群上运行并行代码。我收到以下错误:
Assertion failed in file src/mpid/ch3/channels/mrail/src/rdma/ch3_rndvtransfer.$
[cli_15]: aborting job:
internal ABORT - process 15
我输入了打印语句来查看它发生的位置,当我尝试将一个大型矩阵(14x14x217)从一个进程广播到另外一个32个进程时,就会发生这种情况。当我运行测试得到更小的矩阵14x14x61时,代码工作得很好。以下是代码的相关部分(comm.Bcast
期间发生错误):
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
...
recv_buffer=numpy.zeros((g.numbands,g.numbands,g.gridsize),'complex')
senddata=numpy.zeros((g.numbands,g.numbands,g.gridsize+6),'complex')
if rank==size-1:
g.updateVHF(rank,size) #perform calculation on part of data
for i in range(size-1):
comm.Recv(recv_buffer,source=i,tag=0)
g.VHartree=g.VHartree+recv_buffer[:]
comm.Recv(recv_buffer,source=i,tag=1)
g.VFock=g.VFock+recv_buffer[:]
g.updateBasis()
senddata[:,:,0:g.gridsize]=g.wf
senddata[:,:,g.gridsize::]=g.wf0
else:
g.updateVHF(rank,size) # perform calculation on part of data
comm.Send(g.VHartree,dest=size-1,tag=0)
comm.Send(g.VFock,dest=size-1,tag=1)
comm.Bcast(senddata,root=size-1) # broadcast to everyone else
if rank != size-1: # rank==size-1 already has updated values
g.wf=senddata[:,:,0:g.gridsize]
g.wf0=senddata[:,:,g.gridsize::]
我找到了以下内容:http://listarc.com/showthread.php?4387119-Assertion+failure和mpi4py hangs when trying to send large data,这表明可以在进程之间发送的数据存在一些大小限制。我是否认为我的错误是由于达到了数据传输大小的限制?如果是这样,为什么它只在Bcast
而不是其他Send
/ Recv
通信期间发生,因为所涉及的矩阵大小几乎相同?