Код Fortran зависает при использовании mpi_send на HP C, но не на моем ноутбуке - PullRequest
1 голос
/ 10 июля 2020

У меня есть подпрограмма, которая должна смешивать значения в массиве W % R между разными процессорами, используя MPI_SEND. Он работает на моем ноутбуке (в том смысле, что он не работает sh) с компиляторами Intel и gfortran. Но когда я запускаю его на HP C, программа зависает при первом вызове подпрограммы.

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

1 Ответ

6 голосов
/ 10 июля 2020

MPI_SEND блокируется. Не гарантируется возврат до тех пор, пока процесс, который отправляется, не отправит соответствующий прием. В коде, который у вас есть, все поступления могут никогда не быть достигнуты, так как процесс может ожидать отправки. Чтобы исправить это, исследуйте MPI_ISEND / MPI_IRECV и MPI_WAIT или MPI_SENDRECV.

Подробнее см. Раздел 3.4 в стандарте MPI по адресу https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...