Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 无法实现MPI\u Intercom\u创建_Parallel Processing_Fortran_Mpi_Fortran90_Openmpi - Fatal编程技术网

Parallel processing 无法实现MPI\u Intercom\u创建

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

我试图在两个内部通信程序之间用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,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在color
0
中,世界其他地方在color
1
中,并且您将始终拥有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必须是process
    2
    ,对于颜色
    1
    必须是process
    0

您应该很乐意使用这些经过修改的代码行:

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在color
0
中,世界其他地方在color
1
中,并且您将始终拥有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必须是process
    2
    ,对于颜色
    1
    必须是process
    0

您应该很乐意使用这些经过修改的代码行:

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