0

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

    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?

4

1 回答 1

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,因此它现在在新的通信器中为 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();
}
于 2021-07-07T16:41:33.710 回答