无论如何,我可以通过它了解作为通信器一部分的所有进程吗?假设总共有 16 个 MPI 进程,而 MPI_Comm comm 有 4 个进程作为一个组。仅给定通信器 comm,我们能否知道作为通信器一部分的进程的所有等级?
谢谢你
每个通信器都有一个关联的进程组,可通过调用MPI_COMM_GROUP(MPI_Comm_group在 C 绑定中) 获得。获得进程组 forcomm后,可以使用MPI_GROUP_TRANSLATE_RANKS将组中的行列列表转换为组中comm的相应行列MPI_COMM_WORLD。一个必须经过翻译过程,因为在组内comm,参与过程的级别从0到MPI_COMM_SIZE(comm)-1。
这是一个示例实现:
void print_comm_ranks(MPI_Comm comm)
{
MPI_Group grp, world_grp;
MPI_Comm_group(MPI_COMM_WORLD, &world_grp);
MPI_Comm_group(comm, &grp);
int grp_size;
MPI_Group_size(grp, &grp_size);
int *ranks = malloc(grp_size * sizeof(int));
int *world_ranks = malloc(grp_size * sizeof(int));
for (int i = 0; i < grp_size; i++)
ranks[i] = i;
MPI_Group_translate_ranks(grp, grp_size, ranks, world_grp, world_ranks);
for (int i = 0; i < grp_size; i++)
printf("comm[%d] has world rank %d\n", i, world_ranks[i]);
free(ranks); free(world_ranks);
MPI_Group_free(&grp);
MPI_Group_free(&world_grp);
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例用法:
int rank;
MPI_Comm comm;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_split(MPI_COMM_WORLD, rank % 2, rank, &comm);
if (rank == 0)
{
printf("Rank 0 view:\n");
print_comm_ranks(comm);
}
else if (rank == 1)
{
printf("Rank 1 view:\n");
print_comm_ranks(comm);
}
Run Code Online (Sandbox Code Playgroud)
和7个进程的相应输出:
Rank 0 view:
comm[0] has world rank 0
comm[1] has world rank 2
comm[2] has world rank 4
comm[3] has world rank 6
Rank 1 view:
comm[0] has world rank 1
comm[1] has world rank 3
comm[2] has world rank 5
Run Code Online (Sandbox Code Playgroud)
(分裂后排名0并1最终在不同的传播者中)
请注意,您只能枚举当前进程知道的通信器的内容,因为通信器由其句柄引用,而这些是每个进程的本地值。