2

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+failurempi4py は大きなデータを送信しようとするとハングします。これは、プロセス間で送信できるデータにサイズ制限があることを示唆しています。データ転送のサイズが限界に達したためにエラーが発生したと考えてよろしいですか? もしそうなら、関連するマトリックスがほぼ同じサイズであるため、なぜBcast他のSend/通信中にのみ発生し、他の / 通信中に発生しないのですか?Recv

4

0 に答える 0