mpi4py で python を使用して、コンピューティング クラスターで並列コードを実行しています。次のエラーが表示されます。
Assertion failed in file src/mpid/ch3/channels/mrail/src/rdma/ch3_rndvtransfer.$
[cli_15]: aborting job:
internal ABORT - process 15
どこで発生しているかを確認するために print ステートメントを挿入しました。これは、合計 32 のプロセスのうちの 1 つのプロセスから別のプロセスに大きなマトリックス (14x14x217) をブロードキャストしようとすると発生します。テストを実行すると、コードはうまく機能し、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 は大きなデータを送信しようとするとハングします。これは、プロセス間で送信できるデータにサイズ制限があることを示唆しています。データ転送のサイズが限界に達したためにエラーが発生したと考えてよろしいですか? もしそうなら、関連するマトリックスがほぼ同じサイズであるため、なぜBcast
他のSend
/通信中にのみ発生し、他の / 通信中に発生しないのですか?Recv