【问题标题】:how to get the original mpi rank from split communicators如何从拆分通信器中获取原始 mpi 等级
【发布时间】:2021-09-18 01:29:06
【问题描述】:

我将世界排名分配给不同的通讯器

    MPI_Comm_split(world_comm, color_, key_worker,
                   &color_comm_worker);
    MPI_Comm_split(world_comm, color_master, key_master, &color_comm_master);
  
    int color_worker_size, color_master_size;
    MPI_Comm_size(color_comm_worker, &color_worker_size);
    MPI_Comm_size(color_comm_master, &color_master_size);
  
    int color_worker_rank, color_master_rank;
    MPI_Comm_rank(color_comm_worker, &color_worker_rank);
    MPI_Comm_rank(color_comm_master, &color_master_rank);      

例如,我将拥有 5 个等级:

  world_rank : 1 color_worker : 1 color_master: 0 key_master: 1
  world_rank : 2 color_worker : 1 color_master: 1 key_master: 1
  world_rank : 3 color_worker : 1 color_master: 2 key_master: 1
  world_rank : 4 color_worker : 2 color_master: 0 key_master: 2
  world_rank : 0 color_worker : 0 color_master: 0 key_master: 0

如您所见,color_comm_master 有自己的等级编号,从 0 开始。 此传播者中的排名 1 是世界传播者中的排名 2。如何通过知道拆分通信器的id来确定世界通信器中拆分排名的排名id?

【问题讨论】:

    标签: c++ mpi communicator


    【解决方案1】:

    让我们从包含等级 0 1 2 3 4 5 的通信器 A 开始

    您已经知道“颜色”决定了哪些进程最终在哪个通信器中结束,所以如果我们给前三个进程一个颜色,然后给后面三个不同的颜色,我们最终会得到两个通信器:

    key 告诉 MPI 实现将进程放在新通信器中的哪个位置。例如:

    MPI_Comm_split(A, rank < (nprocs/2), nprocs-rank, &newcomm);
    

    你最终会得到两个通信器:一些进程将在一个排名为 0 1 2 的通信器中,其他进程将在一个排名为 3 4 5 的通信器中

    在这些新的通信器中,进程是如何分配等级的?按“键”排序。在这种情况下,我构建了一个键来将排名倒序排列。 Rank 0 的 key 是 '6',所以它现在在新的通讯器中是 rank 2。 Rank 5 的 key 为 0,因此它现在在新的通信器中为 rank 0。

    这里有一些你可以用来澄清的代码:

    #include <mpi.h>
    #include <stdio.h>
    
    int main(int argc, char **argv) {
        int rank, new_rank, nprocs, new_nprocs;
        MPI_Comm newcomm;
    
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
    
        MPI_Comm_split(MPI_COMM_WORLD, rank < (nprocs/2), nprocs-rank, &newcomm);
    
        MPI_Comm_rank(newcomm, &new_rank);
        MPI_Comm_size(newcomm, &new_nprocs);
    
        printf("Hello from rank %d of %d (was rank %d of %d)\n",
                new_rank, new_nprocs, rank, nprocs);
    
        MPI_Comm_free(&newcomm);
        MPI_Finalize();
    }
    

    【讨论】:

    • 谢谢 Rob Latham,这很有用。
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 2022-08-23
    • 2018-04-03
    • 2019-12-12
    • 2020-09-17
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多