在 HPC 上使用 mpi_send 而不是在我的笔记本电脑上时 Fortran 代码冻结

Fortran code freezes when using mpi_send on an HPC but not on my laptop

我有一个子例程,它应该使用 MPI_SEND 在不同处理器之间混合数组 W % R 中的值。它适用于我的笔记本电脑(从某种意义上说它不会崩溃),同时使用 Intel 和 gfortran 编译器。但是当我 运行 它在 HPC 上时程序在第一次调用子例程时冻结。

SUBROUTINE mix_walkers( W ) 

 include 'mpif.h'
 TYPE(walkerList), INTENT(INOUT) :: W
 INTEGER, SAVE :: calls = 0
 INTEGER :: ierr, nthreads, rank, width, self, send, recv, sendFrstWlkr, sendLstWlkr, sendWlkrcount, &
            recvFrstWlkr, recvlstWlkr, recvWlkrcount, status

  calls = calls + 1

  CALL MPI_COMM_SIZE( MPI_COMM_WORLD, nthreads, ierr )

  CALL MPI_COMM_RANK ( MPI_COMM_WORLD, rank, ierr )

  width = W % nwlkr / nthreads

  IF( MODULO( calls, nthreads ) == 0 ) calls = calls + 1

  send          = MODULO( rank + calls, nthreads )
  recv          = MODULO( rank - calls, nthreads )

  sendFrstWlkr  = width * send + 1 
  recvFrstWlkr  = width * recv + 1 

  sendLstWlkr   = MIN( sendFrstWlkr - 1 + width, W % nwlkr )
  recvlstWlkr   = MIN( recvFrstWlkr - 1 + width, W % nwlkr )

  sendWlkrcount = SIZE( W % R( :, :, sendFrstWlkr : sendlstWlkr ) )
  recvWlkrcount = SIZE( W % R( :, :, recvFrstWlkr : recvlstWlkr ) )

  IF( send == rank ) RETURN

  ASSOCIATE( sendWalkers => W % R( :, :, sendFrstWlkr : sendlstWlkr ) , &
             recvWalkers => W % R( :, :, recvFrstWlkr : recvLstWlkr ) ) 

    CALL MPI_SEND( sendWalkers, sendWlkrcount, MPI_DOUBLE_PRECISION, send, calls, MPI_COMM_WORLD, ierr ) 

    CALL MPI_RECV( recvWalkers, recvWlkrcount, MPI_DOUBLE_PRECISION, recv, calls, MPI_COMM_WORLD, status, ierr )  

  END ASSOCIATE

END SUBROUTINE mix_walkers

MPI_SEND 正在阻塞。不能保证 return 直到被发送到的进程发布相应的接收。在代码中,您可能永远无法收到所有接收信息,因为该过程可能正在等待发送。要解决此问题,请调查 MPI_ISEND/MPI_IRECV 和 MPI_WAIT,或 MPI_SENDRECV。

有关详细信息,请参阅 https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf

上的 MPI 标准第 3.4 节