MPI_Comm_split说明

时间:2016-04-10 16:16:58

标签: c++ mpi

有人可以解释并告诉我更多有关MPI_Comm_split通信器的信息吗?

MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,&my_row_comm);

这只是我通过阅读一些基本文件而遇到的例子。也许有人可以告诉我这个沟通者是如何工作的?

1 个答案:

答案 0 :(得分:6)

首先,让我们看看手册页:

MPI_Comm_split(3)                     MPI                    MPI_Comm_split(3)

NAME
       MPI_Comm_split -  Creates new communicators based on colors and keys

SYNOPSIS
       int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)

INPUT PARAMETERS
       comm   - communicator (handle)
       color  - control of subset assignment (nonnegative integer).  Processes
              with the same color are in the same new communicator
       key    - control of rank assignment (integer)

OUTPUT PARAMETERS
       newcomm
              - new communicator (handle)

那是做什么的?
好吧,顾名思义,它会将传播者comm分成不相交的子传播者newcommcomm的每个进程将成为这些子通信器中的一个唯一,因此输出newcomm只是一个单一的通信器(对于当前进程)。但是,从全球来讲,您必须了解newcomm的许多版本都是不同的子通信器,对输入comm进行分区。

这就是函数的作用。但它是如何做到的呢? 好吧,这两个参数colorkey发挥作用:

  • color是一个整数值,允许决定当前进程将落入哪个子通信器。更具体地说,comm具有相同数值的color的所有进程将是同一子通信器newcomm的一部分。例如,如果您要定义color = rank%2;rankcomm的进程等级,那么您将创建(全局)两个新的通信器:一个用于奇数进程排名,一个甚至排名的过程。但是,请记住,每个流程只会看到他们所属的这些新传播者中的一个...总而言之,color允许分辨各个团队"你会创造出来,比如橄榄球队的颜色会在比赛中穿出来区分自己(因此我认为是命名)。
  • key将允许有选择地决定如何将流程分配到他们所属的新通信器中。例如,如果您设置key = rank;,那么每个新传播者newcomm中的排名<(>排名)(不是排名本身)将遵循原始传播者中的排名顺序{ {1}}。但如果你不关心订购,你也可以设置comm,每个新传播者的排名都是图书馆决定的......

最后,两个简单的例子:

  • key=0;只会将MPI_Comm_split(comm, 0, rank, &newcomm)复制到comm(就像newcomm
  • MPI_Comm_dup()只会为每个流程返回等效的MPI_Comm_split(comm, rank, rank, &newcomm)