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
Fortran MPI_COMM_SPLIT不会提供新的缩减大小_Fortran_Mpi - Fatal编程技术网

Fortran MPI_COMM_SPLIT不会提供新的缩减大小

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来并行化我的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_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 *纽科姆)

输入参数

  • 通讯器(手柄)
  • 子集赋值的颜色控制(非负整数)。具有相同颜色的进程位于相同的新通信器中
  • 秩分配的键控制(整数)
这就是您应该如何调用MPI\u Comm\u split()

使用
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)