0

我希望找出 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?什么可能导致此错误?

4

1 回答 1

1

MPI 代码结果很好。很难说,因为该程序需要 1-2 小时才能运行到Segmentation Fault. 严格的调试指出了与 MPI 无关的错误。

于 2013-02-28T23:01:25.430 回答