我希望找出 MPI 程序中错误的原因。该程序是一个很大的 while 循环,因此对于每次迭代,使用 ISEND 和 IRECV 在每个处理器与其邻居之间完成一组消息传递,如下所示:
而(t<一个非常大的数字)...
do i=1,8
if ( something that is almost always true ) then
call MPI_ISEND(A,A_buffer,inewtype,neighrank(i),2,MPI_COMM_WORLD,isend,ierr)
call MPI_WAIT(isend,istatus,ierr)
call MPI_ISEND(B,B_buffer,MPI_INTEGER4,neighrank(i),3,MPI_COMM_WORLD,isend,ierr)
call MPI_WAIT(isend,istatus,ierr)
end if
end do
do i=1,8
if ( something that is almost always true) then
call MPI_IRECV(C,C_buffer,inewtype,neighrank(i),2,MPI_COMM_WORLD,irecv,ierr)
call MPI_WAIT(irecv,istatus,ierr)
call MPI_IRECV(D,D_buffer,MPI_INTEGER4,neighrank(i),3,MPI_COMM_WORLD,irecv,ierr)
call MPI_WAIT(irecv,istatus,ierr)
end if
end do
...
segmentation fault
该程序在大量迭代后产生错误。在每次迭代中,相同数量的数据在处理器之间传递消息,但对 ISEND 和 IRECV 的调用次数是可调整的(即使用 80 次调用传递总共 80kb 或使用 40 次调用传递总共 160kb)。如果调用次数很少,程序会提前崩溃。
我怀疑关于 InfiniBand的事情!导致此错误,但我没有得到insufficient virtual memory
- 所以它不可能是 InfiniBand?什么可能导致此错误?