MPI:发送和接收必须共享同一通信器。为什么?

时间:2019-01-16 05:46:10

标签: mpi

我发现有文字

“只能在发送消息的同一通信器中接收到消息”。 但是,如果我看这张图片

https://imgur.com/a/hYz4dWd

然后分析此代码

Send and Receive operations between communicators in MPI

use mpi !instead of include 'mpif.h'
implicit none

integer :: tag,ierr,rank,numtasks,color,new_comm,inter1,inter2
integer :: sendbuf,recvbuf,stat(MPI_STATUS_SIZE)
integer :: irank
!
tag = 22
sendbuf = 222
!
call MPI_Init(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,numtasks,ierr)
!
if (rank < 2) then
    color = 0
else 
    color = 1
end if
!
call MPI_COMM_SPLIT(MPI_COMM_WORLD,color,rank,new_comm,ierr)
!
if (color .eq. 0) then
    call MPI_INTERCOMM_CREATE(new_comm,0,MPI_Comm_world,2,tag,inter1,ierr)
!
call MPI_COMM_RANK(inter1,irank,ierr)
if(irank==0)then
    call mpi_send(sendbuf,1,MPI_INT,0,tag,inter1,ierr)
end if
!
else if(color .eq. 1) then
    call MPI_INTERCOMM_CREATE(new_comm,0,MPI_COMM_WORLD,0,tag,inter2,ierr)
    call MPI_COMM_RANK(inter2,irank,ierr)
    if(irank==0)then
        call mpi_recv(recvbuf,1,MPI_INT,0,tag,inter2,stat,ierr)
        if(ierr/=MPI_SUCCESS)print*,'Error in rec '
        print*,'rec buff = ', recvbuf
    end if
end if
!
call MPI_finalize(ierr)
end program h

在我看来,我似乎在两个不同的传播者之间进行交流:inter1inter2。转到所附图片,我正在从comm1comm2交流。

1 个答案:

答案 0 :(得分:2)

图片与示例代码无关。

查看代码,一个级别react-scripts,另一个级别MPI_Send(..., inter1, ...)

这里重要的是如何创建MPI_Recv(..., inter2, ...)inter1,它们都是来自调用inter2 all 等级,因此即使您使用不同的名称变量名,它们实际上是指相同(也是唯一的)内部通信器。

这是一种更直观的程序编写方式

MPI_Intercomm_create()