基于标志的组mpi进程

时间:2018-12-08 09:43:40

标签: parallel-processing mpi hpc

我需要基于更大的mpi通信器(mi_comm_world_2)创建一个子通信器(mpi_comm_world)。

尤其是在诸如

的检测循环之后

如果something进程内存在proc

我需要在新的沟通者mpi_comm_world_2中收集所有针对支票标记为true的过程。

我找不到明确的文档来完成这项工作。

1 个答案:

答案 0 :(得分:1)

好问题!

这是MPI_Comm_split命令的优点。

定义

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

参数

  • 通信:处理要从中构建新通信器的通信器

  • 颜色:一个非负整数,指示如何在新的传播者中对过程进行分组。具有相同颜色的进程位于同一新的沟通者中

  • :一个控制排名分配的整数。等级始终从 0 分配给通信器中的进程数。该键确定新通信器中进程等级的相对顺序。

  • 新通信:新的传播者

  • int :该函数返回一个整数,指示是否成功。

详细说明

请记住,您有许多进程在执行看起来相同的代码。因此,newcomm的值在各个进程之间可以不同。

颜色是一个整数值,用于确定当前过程将落入哪个新的子通讯器中。颜色具有相同数值的comm的所有进程将是同一新子通信器newcomm的一部分。

例如,如果您定义了color = rank%4(请参见下面的示例4),那么您将(全局)创建四个新的通信器。请记住,每个过程都只会看到其中一部分新传播者。换句话说,颜色决定了要创建哪个“团队”,就像橄榄球队的球衣颜色一样。

将确定流程在它们所属的新沟通者中的排名。如果设置key = rank,则每个新的传播者newcomm中的排名顺序(而不是排名本身)将遵循原始传播者comm中的排名顺序。如果键的两个或多个值具有相同的值,则comm中具有较低等级的进程在newcomm中具有较低的等级。 (请参见下面的示例2。)

示例

这里有一些图片示例,我在下面的代码中重复了这些示例。 Example#5回答了您的特定问题。

Examples of MPI_Comm_split

示例代码

//Compile with mpic++ main.cpp
#include <mpi.h>

int main(int argc, char **argv){
  int world_size, world_rank;

  MPI_Init(&argc, &argv);

  MPI_Comm_size(MPI_COMM_WORLD, &world_size);  //Get the number of processes
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);  //Get the rank of the process

  MPI_Comm comm = MPI_COMM_WORLD;
  MPI_Comm newcomm1, newcomm2, newcomm3, newcomm4, newcomm5;

  //Example 1: Duplicate the existing communicator. The command `MPI_Comm_dup()`
  //           does exactly this.
  MPI_Comm_split(comm, 0, world_rank, &newcomm1);

  //Example 2: Duplicate the existing communicator, but reverse the 
  //           rankings
  MPI_Comm_split(comm, 0, world_size-world_rank, &newcomm2);
  int rank2;                           //Get the rank of the process
  MPI_Comm_rank(newcomm2, &rank2);     //in the new communicator


  //Example 3: Split each process into its own communicator. This is the
  //           equivalent of using `MPI_COMM_SELF` for each process.
  MPI_Comm_split(comm, world_rank, world_rank, &newcomm3);

  //Example 4: Split processes into communicators based on their colouring. Use
  //           their rank in the existing communicator to determine their 
  //           relative rank order in the new communicator.
  int color = world_rank / 4;
  MPI_Comm_split(comm, color, world_rank, &newcomm4);
  int rank4;                           //Get the rank of the process
  MPI_Comm_rank(newcomm2, &rank4);     //in the new communicator

  //Example 5: Group only some of the processes into a new communicator based on
  //a flag.
  int flag = world_rank%2==0;          //An example flag
  MPI_Comm_split(comm, flag?0:MPI_UNDEFINED, world_rank, &newcomm5);

  MPI_Finalize();
}

更多信息

  • This page上有一个很好的关于沟通者和群体的教程。
  • 我为示例开发的SVG文件可用here