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

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

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

最佳答案

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

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;(在rank中用comm定义进程的排名),那么您将(全局)创建两个新的通信器:一个用于奇数级进程,另一个用于偶数级进程。但是,请记住,每个过程只会看到它们属于其中的这些新传播者中的一个。因此,总之,color允许区分您将创建的各个“团队”,例如 Jersey 足球的颜色。比赛中,各队会穿上以区别自己(因此,我认为是这样的命名)。
  • key仅允许选择决定如何将这些过程分类为它们所属的新通信器。例如,如果设置key = rank;,则每个新传播者newcomm中的排名而不是排名本身的顺序将遵循原始传播者comm中的排名顺序。但是,如果您不关心顺序,则可以设置key=0;,并且每个新的传播者中的排名将由库决定...

  • 最后,举两个简单的例子:
  • MPI_Comm_split(comm, 0, rank, &newcomm)只会将comm复制为newcomm(与MPI_Comm_dup()一样)
  • MPI_Comm_split(comm, rank, rank, &newcomm)只会为每个进程
  • 返回等效的MPI_COMM_SELF

    09-11 21:58