gpt4 book ai didi

mpi - MPI_SENDRECV如何工作?

转载 作者:行者123 更新时间:2023-12-04 13:24:05 24 4
gpt4 key购买 nike

我有一个关于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

之后,我们得到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

然后这将陷入僵局
因此,这意味着它不首先发送然后接收,而是同时发送和接收的MPI_SENDRECV,对吗?

最佳答案

没错,MPI_Sendrecv与发送和接收不同。将其视为MPI_IsendMPI_Irecv和一对MPI_Wait。因此,实际上,发送和接收是并行进行的。

顺便说一句,这就是在MPI库中通常实现的方式。

如果要在第二个示例中解决死锁,则流程将必须以不同的顺序发出发送和接收。因此,等级0将发出发送,然后是接收,等级1将是发送,然后是发送。

关于mpi - MPI_SENDRECV如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11018175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com