我把世界排名分成了不同的委员
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在world通信器中排名2。我如何通过知道分裂通信器的id来确定世界通信器中分裂等级的等级id?
发布于 2021-07-07 16:41:34
让我们从包含排名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的通信器中
在这些新的通信器中,进程是如何分配等级的?按“key”排序。在本例中,我构造了一个键来将等级放在相反的顺序。等级0的关键字为“6”,因此它现在在新的通信器中的等级为2。等级5的关键字为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();
}
https://stackoverflow.com/questions/68287086
复制相似问题