我使用MPI来平行我的Fortran代码。 MPI_Comm_reduce()
用于总结不同等级的结果。在某些情况下,计算只需要可用等级的一小部分,因此我想构建一个仅包含size1必要等级的通信器,例如。排名0,1,2,...,size1-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!
我的错误在哪里?
答案 0 :(得分:1)
首先,您应该尝试构建证明问题的Minimal, Complete, and Verifiable example。
来自MPI_Comm_split()
手册页
<强>概要强>
int MPI_Comm_split(MPI_Comm comm,int color,int key,MPI_Comm * newcomm)
输入参数
- comm communicator(句柄)
- 子集赋值的颜色控制(非负整数)。具有相同颜色的进程在同一个新的通信器中
- 排名分配的关键控制(整数)
所以这就是你应该如何调用MPI_Comm_split()
MPI_COMM_SPLIT(MPI_COMM_WORLD,color,rank,REDCOMM,ierr)
使用color
而不是硬编码1
,否则所有MPI任务最终都在同一个通信器中。由于您不需要在新通信器中重新排序排名,因此您也可以使用rank
作为密钥。
修改强>
由于您只关心第一个等级,因此可以使用MPI_UNDEFINED
作为最高等级的颜色。在这种情况下,最高排名将在MPI_COMM_NULL
。
请注意,无法在MPI_Comm_size()
上调用MPI_COMM_NULL
。
代码将成为
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)