fortran - Fortran 代码在 HPC 上使用 mpi_send 时冻结,但在我的笔记本电脑上没有
问题描述
我有一个子程序,它应该W % R
使用MPI_SEND
. 它适用于我的笔记本电脑(从某种意义上说它不会崩溃),同时使用 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 被阻塞。在发送到发布相应接收的进程之前,不能保证返回。在代码中,您可能永远无法收到所有接收,因为进程可能正在等待发送。要解决此问题,请调查 MPI_ISEND/MPI_IRECV 和 MPI_WAIT 或 MPI_SENDRECV。
有关详细信息,请参阅 MPI 标准中的第 3.4 节,网址为https://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf
推荐阅读
- r - 如何用 r 中的另一个值替换整行字符串值
- datatables - 当 stateSave 为 true 时,数据表隐藏列不起作用
- ansible - Ansible - 执行本地副本的最佳方式(在 pre_tasks 中)?
- python - 以键值对作为键值的 Python 字典
- angular - 无法在 Safari 浏览器中从 Angular 下载 2 GB zip 文件
- c# - ElasticSearch NEST:批量索引操作不使用指定的文档 ID
- android - 如何更改 android 工具栏主页图标
- android - 电话录音服务仅记录来电者的声音。(安卓)
- gitlab - GitKraken 不允许我在 GitLab 上打开我的私人存储库
- regex - 有没有办法在固定条件的基础上对动态字符串进行分组