我发现有文字
“只能在发送消息的同一通信器中接收到消息”。 但是,如果我看这张图片
然后分析此代码
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
在我看来,我似乎在两个不同的传播者之间进行交流:inter1
和inter2
。转到所附图片,我正在从comm1
向comm2
交流。
答案 0 :(得分:2)
图片与示例代码无关。
查看代码,一个级别react-scripts
,另一个级别MPI_Send(..., inter1, ...)
。
这里重要的是如何创建MPI_Recv(..., inter2, ...)
和inter1
,它们都是来自调用inter2
的 all 等级,因此即使您使用不同的名称变量名,它们实际上是指相同(也是唯一的)内部通信器。
这是一种更直观的程序编写方式
MPI_Intercomm_create()