MPI_Comm_split说明

3 c++ mpi

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

MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,&my_row_comm);
Run Code Online (Sandbox Code Playgroud)

这只是我通过阅读一些基本文档遇到的示例。也许有人可以告诉我此沟通工具的工作方式?

Gil*_*les 7

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

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)
Run Code Online (Sandbox Code Playgroud)

那怎么办?
嗯,顾名思义,它将把传播者comm分解为不相交的子传播者newcomm。的每个过程都comm将成为这些子通信newcomm器中唯一的一个,因此输出(对于当前过程)只有一个通信器这一事实。但是,从全球范围来看,您必须了解的许多版本newcomm是不同的子通信器,对输入进行了划分comm

这就是函数的作用。但是它是如何做到的呢?
那么,这其中的两个参数color,并key开始发挥作用:

  • color是一个整数值,可用来确定当前进程将落入哪个子通信器中。更具体地,commcolor具有相同数值的所有过程将是相同子通信器的一部分newcomm。例如,如果要定义color = rank%2;rank进程的等级在中comm),则将创建(全局)两个新的传播者:一个用于奇数等级的过程,另一个用于偶数等级的过程。但是,请记住,每个流程只会看到它们属于其中的一部分新沟通者。因此,总之,color 允许区分您将创建的各个“团队”,例如在比赛期间穿球衣球衣的颜色以区分自己(因此我假设使用的命名)。
  • key将仅允许选择决定如何将流程归入它们所属的新通信器中。例如,如果您设置key = rank;,则每个新沟通者中的排名顺序(而不是排名本身)newcomm将遵循原始沟通者中的排名顺序comm。但是,如果您不关心顺序,则可以进行设置key=0;,每个新传播者的排名将由图书馆决定。

最后,举两个简单的例子:

  • MPI_Comm_split(comm, 0, rank, &newcomm)只会复制commnewcomm(与一样MPI_Comm_dup()
  • MPI_Comm_split(comm, rank, rank, &newcomm)只会MPI_COMM_SELF为每个流程返回等价的