Fortran MPI_COMM_SPLIT不会提供新的缩减大小
我使用MPI来并行化我的Fortran代码Fortran MPI_COMM_SPLIT不会提供新的缩减大小,fortran,mpi,Fortran,Mpi,我使用MPI来并行化我的Fortran代码MPI\u Comm\u reduce()用于汇总不同列组的结果。在某些情况下,计算只需要可用列组的一小部分,因此我想构造一个只包含大小1必要列组的通信器,例如列组0,1,2,…,大小1-1 IF(rank.LE.size1-1)THEN; color=1; ELSE; color=2; ENDIF key=0 CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,1,key,REDCOMM,ierr) CALL MPI_COMM_SI
MPI\u Comm\u reduce()
用于汇总不同列组的结果。在某些情况下,计算只需要可用列组的一小部分,因此我想构造一个只包含大小1必要列组的通信器,例如列组0,1,2,…,大小1-1
IF(rank.LE.size1-1)THEN; color=1; ELSE; color=2; ENDIF
key=0
CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,1,key,REDCOMM,ierr)
CALL MPI_COMM_SIZE(REDCOMM,sizered,ierr)
但是,使用size=8
和size1=6
时,最后一次调用返回的是sizered=8
,而不是6!
我的错误在哪里?首先,你应该尝试建立一个证据来证明这个问题 从
MPI\u Comm\u split()
手册页
简介
int MPI_Comm_分割(MPI_Comm,int color,int key,MPI_Comm
*纽科姆)
输入参数
- 通讯器(手柄)
- 子集赋值的颜色控制(非负整数)。具有相同颜色的进程位于相同的新通信器中
- 秩分配的键控制(整数)
color
而不是硬编码的1
,否则所有MPI任务都会在同一个通信器中结束。由于不需要在新通信器中重新排列列组,因此也可以使用rank
作为键
编辑
因为您只关心第一个等级,所以可以使用MPI\u UNDEFINED
作为最高等级的颜色。在这种情况下,最高等级将在MPI\u COMM\u NULL
中
注意:您不能在MPI\u Comm\u NULL
上调用MPI\u Comm\u size()
代码将变成
IF(rank.LT.size1)THEN; color=0; ELSE; color=MPI_UNDEFINED; ENDIF
key=rank
CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,key,REDCOMM,ierr)
IF(rank.LT.size1) CALL MPI_COMM_SIZE(REDCOMM,sizered,ierr)
通过设置color=1或2,可以将mpi_comm_world分为两个组,但只能命名一个组(在我的例子中是redcomm)。是什么决定了这两个组中的哪一个获得redcomm名称?将有两个
redcomm
communicator!一个用于任务0-5,一个用于任务6-7。请记住,从给定MPI任务的角度来看,只有一个REDCOMM
。如果您只需要一个REDCOMM
通信器,那么您可以传递color=MPI\u UNDEFINED
,在这种情况下,一个REDCOMM
将是MPI\u COMM\u NULL
@Sanders。您可以通过创建具有组定义的通信器()@JorgeBellón生成一个包含进程子集的单一组的简单方法是,对于不需要作为结果通信器一部分的进程,将MPI_Comm_split中的颜色设置为MPI_UNDEFINED@IanBush True。我已经有一段时间没有使用派生的通讯器了。这不是MPI\u Comm\u create
,而是MPI\u Comm\u create\u group
我想谈论的功能。区别很重要,因为MPI\u Comm\u create
和MPI\u Comm\u split
都是涉及通信器中所有进程的集合(对于大量进程而言,这一点变得很明显),而MPI\u Comm\u create\u group
只涉及实际属于新通信器的进程。
IF(rank.LT.size1)THEN; color=0; ELSE; color=MPI_UNDEFINED; ENDIF
key=rank
CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,key,REDCOMM,ierr)
IF(rank.LT.size1) CALL MPI_COMM_SIZE(REDCOMM,sizered,ierr)