Parallel processing 无法实现MPI\u Intercom\u创建
我试图在两个内部通信程序之间用Fortran实现一个Parallel processing 无法实现MPI\u Intercom\u创建,parallel-processing,fortran,mpi,fortran90,openmpi,Parallel Processing,Fortran,Mpi,Fortran90,Openmpi,我试图在两个内部通信程序之间用Fortran实现一个MPI\u Intercom,一个具有前两个进程,另一个具有其余进程。 我需要在新创建的通讯器之间执行发送、接收操作 守则: program hello include 'mpif.h' integer tag,ierr,rank,numtasks,color,new_comm,inter1,inter2 tag = 22 call MPI_Init(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD,rank,i
MPI\u Intercom
,一个具有前两个进程,另一个具有其余进程。
我需要在新创建的通讯器之间执行发送、接收操作
守则:
program hello
include 'mpif.h'
integer tag,ierr,rank,numtasks,color,new_comm,inter1,inter2
tag = 22
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,1,tag,inter1,ierr)
!local_comm,local leader,peer_comm,remote leader,tag,new,ierr
else if(color .eq. 1) then
call MPI_INTERCOMM_CREATE(new_comm,1,MPI_COMM_WORLD,0,tag,inter2,ierr)
end if
select case (color)
case (0)
call MPI_COMM_FREE(inter1)
case(1)
call mpi_comm_free(inter2)
end select
call MPI_finalize(ierr)
end
程序你好
包括“mpif.h”
整型标记,ierr,秩,numtasks,颜色,新通信,inter1,inter2
标签=22
调用MPI_Init(ierr)
调用MPI_COMM_RANK(MPI_COMM_WORLD,RANK,ierr)
调用MPI_COMM_大小(MPI_COMM_WORLD、numtasks、ierr)
如果(秩<2),则
颜色=0
其他的
颜色=1
如果结束
调用MPI_COMM_SPLIT(MPI_COMM_WORLD、color、rank、new_COMM、ierr)
如果(颜色等式0),则
调用MPI\u Intercom\u CREATE(新通信,0,MPI\u通信世界,1,标记,inter1,ierr)
!本地通信,本地领导,对等通信,远程领导,标签,新,ierr
否则,如果(颜色等式1),则
调用MPI\u Internalm\u CREATE(新建\u comm,1,MPI\u comm WORLD,0,tag,inter2,ierr)
如果结束
选择大小写(颜色)
案例(0)
免费呼叫MPI_通信(inter1)
案例(1)
免费呼叫mpi_通信(inter2)
结束选择
调用MPI_finalize(ierr)
结束
代码编译时没有任何问题。但是在运行时会卡住,有时会显示错误。简短回答:问题来自
远程\u引导器的规格
长答覆:
我假设您的拆分逻辑是您想要的:进程0和1在color0
中,世界其他地方在color1
中,并且您将始终拥有3个以上的进程。
你必须选择:
- 每种颜色的
本地\u引线
。这是每个小组组长在本地通讯员(new_comm
)中的排名。无头痛的方法是选择秩0的进程,因为这是本地通信器中的秩,所以所有进程可以具有完全相同的值。所以我选择0级
- 每种颜色的
远程_引线
;这必须是inter communicator另一端的领导者在对等通信中的排名(在您的情况下为MPI通信世界)。这意味着,彩色0中的进程必须知道彩色1
中的0
进程对应于MPI_Comm_world
;颜色中的进程1必须知道颜色中的进程0
对应于MPI\u Comm\u world
。根据您的拆分逻辑和我选择本地引线的逻辑,remote\u leader
对于颜色0必须是process2
,对于颜色1
必须是process0
您应该很乐意使用这些经过修改的代码行:
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)
else if(color .eq. 1) then
if(rank==2) print*, ' 2 here'
call MPI_INTERCOMM_CREATE(new_comm,0,MPI_COMM_WORLD,0,tag,inter2,ierr)
end if
与您的代码最重要的区别是远程\u leader
是2
颜色0
。这就是问题的根源。
第二个区别是,颜色1的local_leader
为0
。这与我选择local\u leader
的逻辑一致。这不是问题的根源,但是,如果您只有1
彩色进程1
,则可能是问题的根源
更新
感谢赫里斯托·伊利耶夫,我正在添加此更新。如果您的目标是将颜色1的过程1用作本地\u领导
,则颜色0
的远程\u领导
应为3
,代码为:
if (color .eq. 0) then
if(rank==0) print*, ' 0 here'
call MPI_INTERCOMM_CREATE(new_comm,0,MPI_Comm_world,3,tag,inter1,ierr)
else if(color .eq. 1) then
if(rank==2) print*, ' 2 here'
call MPI_INTERCOMM_CREATE(new_comm,1,MPI_COMM_WORLD,0,tag,inter2,ierr)
end if
确保你检查了这个选项的所有内容,因为我没有特别注意检查它。另外,请确保您总是有更多的1
彩色流程1
简短回答:问题来自远程\u领导人的规格
长答覆:
我假设您的拆分逻辑是您想要的:进程0和1在color0
中,世界其他地方在color1
中,并且您将始终拥有3个以上的进程。
你必须选择:
- 每种颜色的
本地\u引线
。这是每个小组组长在本地通讯员(new_comm
)中的排名。无头痛的方法是选择秩0的进程,因为这是本地通信器中的秩,所以所有进程可以具有完全相同的值。所以我选择0级
- 每种颜色的
远程_引线
;这必须是inter communicator另一端的领导者在对等通信中的排名(在您的情况下为MPI通信世界)。这意味着,彩色0中的进程必须知道彩色1
中的0
进程对应于MPI_Comm_world
;颜色中的进程1必须知道颜色中的进程0
对应于MPI\u Comm\u world
。根据您的拆分逻辑和我选择本地引线的逻辑,remote\u leader
对于颜色0必须是process2
,对于颜色1
必须是process0
您应该很乐意使用这些经过修改的代码行:
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)
else if(color .eq. 1) then
if(rank==2) print*, ' 2 here'
call MPI_INTERCOMM_CREATE(new_comm,0,MPI_COMM_WORLD,0,tag,inter2,ierr)
end if
与您的代码最重要的区别是远程\u leader
是2
颜色0
。这就是问题的根源。
第二个区别是,颜色1的local_leader
为0
。这与我选择local\u leader
的逻辑一致。这不是问题的根源,但是,如果您只有1
彩色进程1
,则可能是问题的根源
更新
感谢赫里斯托·伊利耶夫,我正在添加此更新。如果您的目标是将颜色1的过程1用作本地\u领导
,则颜色0
的远程\u领导
应为3
,代码为:
if (color .eq. 0) then
if(rank==0) print*, ' 0 here'
call MPI_INTERCOMM_CREATE(new_comm,0,MPI_Comm_world,3,tag,inter1,ierr)
else if(color .eq. 1) then
if(rank==2) print*, ' 2 here'
call MPI_INTERCOMM_CREATE(new_comm,1,MPI_COMM_WORLD,0,tag,inter2,ierr)
end if
确保你检查了这个选项的所有内容,因为我没有特别注意检查它。还要确保您总是有更多的1
彩色进程1
它显示了什么错误?它卡在哪里了?您尝试了哪些步骤进行调试?对于e