【发布时间】:2016-11-19 13:51:21
【问题描述】:
在我之前的问题之后:Unable to implement MPI_Intercomm_create
已解决 MPI_INTERCOMM_CREATE 的问题。但是,当我尝试在颜色 0 的进程 0(全局等级 = 0)和颜色 1 的进程 0(即全局等级 = 2)之间实现基本的发送接收操作时,代码只是在打印接收到的缓冲区后挂起。 代码:
program hello
include 'mpif.h'
implicit none
integer tag,ierr,rank,numtasks,color,new_comm,inter1,inter2
integer sendbuf,recvbuf,tag,stat(MPI_STATUS_SIZE)
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
if (rank == 0) print*,' 0 here'
call MPI_INTERCOMM_CREATE(new_comm,0,MPI_Comm_world,2,tag,inter1,ierr)
call mpi_send(sendbuf,1,MPI_INT,2,tag,inter1,ierr)
!local_comm,local leader,peer_comm,remote leader,tag,new,ierr
else if(color .eq. 1) then
if(rank ==2) print*,' 2 here'
call MPI_INTERCOMM_CREATE(new_comm,2,MPI_COMM_WORLD,0,tag,inter2,ierr)
call mpi_recv(recvbuf,1,MPI_INT,0,tag,inter2,stat,ierr)
print*,recvbuf
end if
end
【问题讨论】:
-
我只是快速浏览了一下代码,所以它可能有更多问题,但显然你在这里遇到了问题:
call mpi_recv(recvbuf,1,MPI_INT,0,tag,inter1,stat,ierr)因为这应该使用inter2而不是inter1。 -
对所有 Fortran 问题使用标签 fortran。更多的人会看到它。 Fortran 90 只是该语言的一种旧版本。一个建议:在 Fortran 90 和更新版本中,最好使用
use mpi而不是include 'mpif.h'。 -
你也不要使用
implicit none(你真的应该使用它!)并且你没有在任何地方声明stat。要么将其正确声明为数组,要么只使用MPI_STATUS_IGNORE。 -
编辑:在 mpi_recv 中使用 inter2,声明为 stat。问题仍然存在。
-
状态呢?它没有在上面声明,所以你的代码不能被编译。
标签: parallel-processing fortran mpi openmpi