我有一个关于MPI_SENDRECV的问题.这是一个例子:
PROGRAM sendrecv
IMPLICIT NONE
INCLUDE "mpif.h"
INTEGER a,b,myrank,nprocs,ierr
integer istat(MPI_STATUS_SIZE)
CALL MPI_INIT(ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)
if (myrank.eq.0) then
a=1;b=3
else
a=2;b=4
endif
if (myrank == 0) then
call MPI_SENDRECV(b,1,MPI_REAL,1,0,
. a,1,MPI_REAL,1,0,
. MPI_COMM_WORLD,istat,ierr)
elseif (myrank == 1) then
call MPI_SENDRECV(b,1,MPI_REAL,0,0,
. a,1,MPI_REAL,0,0,
. MPI_COMM_WORLD,istat,ierr)
end if
if (myrank.eq.0) then
write(*,*) b,a
else
write(*,*) a,b
endif
CALL MPI_FINALIZE(ierr)
END
Run Code Online (Sandbox Code Playgroud)
在此之后我们得到3 4和3 4.我的问题是我们替换MPI_SENDRECV(如果我们假设首先发送MPI_SENDRECV然后接收)
if (myrank == 0) then
call MPI_SEND(b,1,MPI_REAL,1,0,MPI_COMM_WORLD,ierr)
call MPI_RECV(a,1,MPI_REAL,0,0,MPI_COMM_WORLD,istat,ierr)
elseif (myrank == 1) then
call MPI_SEND(b,1,MPI_REAL,0,0,MPI_COMM_WORLD,ierr)
call MPI_RECV(a,1,MPI_REAL,1,0,MPI_COMM_WORLD,istat,ierr)
end if
Run Code Online (Sandbox Code Playgroud)
那么这将是死锁所以这意味着MPI_SENDRECV它不先发送然后接收,而是同时发送ans接收,对吗?
Gre*_*sev 15
你是对的,MPI_Sendrecv不一样是发送后接收.把它想象成一个MPI_Isend,MPI_Irecv和一对MPI_Waits.因此,实际上,发送和接收并行进行.
顺便提一下,这是它在MPI库中通常实现的方式.
如果您想在第二个示例中修复死锁,则进程必须以不同的顺序发出发送和接收.因此,等级0将发出一个发送,然后是接收,并且等级1 - 接收然后发送.
| 归档时间: |
|
| 查看次数: |
14183 次 |
| 最近记录: |