首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI_SENDRECV是如何工作的?

MPI_SENDRECV是如何工作的?
EN

Stack Overflow用户
提问于 2012-06-13 23:23:16
回答 2查看 16.3K关注 0票数 8

我有一个关于MPI_SENDRECV的问题。下面是一个示例:

代码语言:javascript
复制
 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先发送,然后接收)

代码语言:javascript
复制
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它不是先发送然后接收,而是同时发送和接收,对吗?

EN

回答 2

Stack Overflow用户

发布于 2012-06-14 01:28:22

你是对的,MPI_Sendrecv不同于先发送后接收。可以把它想象成一个MPI_IsendMPI_Irecv和一对MPI_Wait,所以实际上,发送和接收是并行进行的。

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

如果您希望修复第二个示例中的死锁,则进程必须以不同的顺序发出发送和接收。因此,等级0将发出send,然后是receive,而rank 1-A receive,然后是send。

票数 18
EN

Stack Overflow用户

发布于 2015-05-15 23:47:53

即使消息被路由到接收进程B,进程B仍然必须确认它想要接收A的数据。一旦它这样做了,数据就已经被传输了。进程A被确认数据已被发送,并且可以返回工作。

因此,您的第二个代码不能满足条件,这似乎是因为您没有应答其他人的呼叫。它应该如下所示:

代码语言:javascript
复制
if (myrank == 0) then
   call MPI_SEND(b,1,MPI_REAL,1,0,MPI_COMM_WORLD,ierr)
   call MPI_RECV(a,1,MPI_REAL,1,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,0,0,MPI_COMM_WORLD,istat,ierr)
end if
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11018175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档