MPI_COMM_SPLIT不会给出新的缩小尺寸

时间:2017-09-15 05:33:58

标签: fortran mpi

我使用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=8size1=6,最后一次通话会返回sizered=8而不是6! 我的错误在哪里?

1 个答案:

答案 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)