在MPI中,如何知道作为通信器一部分的处理器的所有列组?

在MPI中,如何知道作为通信器一部分的处理器的所有列组?,mpi,Mpi,是否有任何方法可以让我知道作为communicator一部分的所有流程? 假设总共有16个MPI进程,MPI_Comm Comm有4个进程作为一个组。只要有通信器comm,我们就可以知道作为通信器一部分的所有进程的级别吗 谢谢每个通信器都有一个关联的进程组,可以通过在C绑定中调用MPI_COMM_group MPI_COMM_group来获得。一旦获得comm的进程组,就可以使用MPI_group_TRANSLATE_RANKS将comm组中的列组列表转换为MPI_comm_WORLD组中的相应

是否有任何方法可以让我知道作为communicator一部分的所有流程? 假设总共有16个MPI进程,MPI_Comm Comm有4个进程作为一个组。只要有通信器comm,我们就可以知道作为通信器一部分的所有进程的级别吗


谢谢

每个通信器都有一个关联的进程组,可以通过在C绑定中调用MPI_COMM_group MPI_COMM_group来获得。一旦获得comm的进程组,就可以使用MPI_group_TRANSLATE_RANKS将comm组中的列组列表转换为MPI_comm_WORLD组中的相应列组。必须经历翻译过程,因为在comm组中,参与过程的级别从0到MPI_comm_SIZEcomm-1不等

下面是一个示例实现:

无效打印通讯通讯通讯 { MPI集团集团、世界集团; MPI_Comm_Group MPI_Comm_WORLD和WORLD_grp; MPI_Comm_groupcomm和grp; 内部grp_尺寸; MPI_组尺寸、玻璃钢尺寸和玻璃钢尺寸; int*ranks=mallocgrp_size*sizeofint; int*world\u ranks=mallocgrp\u size*sizeofint; 对于int i=0;i 整数秩; MPI_通信; MPI_Comm_rankMPI_Comm_WORLD&rank; MPI_Comm_splitMPI_Comm_WORLD,排名%2,排名,&Comm; 如果秩==0 { 打印0视图:\n; 打印通信; } 如果秩=1,则为else { printfRank 1视图:\n; 打印通信; } 以及7个过程的相应输出:

排名0视图: 通信[0]的世界排名为0 通信[1]排名世界第2 通信[2]排名世界第4 通信[3]排名世界第6 排名1的视图: 通信[0]的世界排名为1 通信[1]排名世界第三 通信[2]排名世界第5 等级0和等级1在拆分后在不同的通讯器中结束


请注意,您只能枚举当前进程知道的通信器的内容,因为通信器由其句柄引用,这些句柄是每个进程的本地值。

每个通信器都有一个关联的进程组,可以通过在C绑定中调用MPI\U COMM\U group MPI\U COMM\U group获得。一旦获得comm的进程组,就可以使用MPI_group_TRANSLATE_RANKS将comm组中的列组列表转换为MPI_comm_WORLD组中的相应列组。必须经历翻译过程,因为在comm组中,参与过程的级别从0到MPI_comm_SIZEcomm-1不等

下面是一个示例实现:

无效打印通讯通讯通讯 { MPI集团集团、世界集团; MPI_Comm_Group MPI_Comm_WORLD和WORLD_grp; MPI_Comm_groupcomm和grp; 内部grp_尺寸; MPI_组尺寸、玻璃钢尺寸和玻璃钢尺寸; int*ranks=mallocgrp_size*sizeofint; int*world\u ranks=mallocgrp\u size*sizeofint; 对于int i=0;i 整数秩; MPI_通信; MPI_Comm_rankMPI_Comm_WORLD&rank; MPI_Comm_splitMPI_Comm_WORLD,排名%2,排名,&Comm; 如果秩==0 { 打印0视图:\n; 打印通信; } 如果秩=1,则为else { printfRank 1视图:\n; 打印通信; } 以及7个过程的相应输出:

排名0视图: 通信[0]的世界排名为0 通信[1]排名世界第2 通信[2]排名世界第4 通信[3]排名世界第6 排名1的视图: 通信[0]的世界排名为1 通信[1]排名世界第三 通信[2]排名世界第5 等级0和等级1在拆分后在不同的通讯器中结束


请注意,您只能枚举当前进程知道的通信器的内容,因为通讯器由其句柄引用,这些句柄是每个进程的本地值。

如果您想知道通讯器中的进程在默认通讯器mpi_comm_世界中的排名,那么您的问题的答案是这取决于您如何创建通讯器。因此,您是如何创建comm的?假设通信器是使用MPI_comm_create创建的。我们如何找到答案?如果您想知道comm中的进程在默认通信器mpi_comm_world中的排名,那么您的问题的答案取决于您是如何创建comm的。那么,您是如何创建comm的?假设通信器是使用mpi_comm_创建的。我们怎么知道?