使用MPI_COMM_split后进程列之间的关系

使用MPI_COMM_split后进程列之间的关系,mpi,rank,communicator,Mpi,Rank,Communicator,我使用MPI_Comm_split来拆分默认的MPI通信器。如果最初在默认通信器中有10个进程,那么MPI_Comm_WORLD和它们的列组由id_original标识。新的通讯器由4个进程组成,其id_为6、7、8、9。这些进程的等级由新通讯器中的id_new定义。这两个通讯器中进程的等级之间的关系是什么。id为6、7、8、9的流程是否会在新通信器中分别有新的等级0、1、2、3,或者顺序可能不同 您应该使用“key”参数来控制新通信器中的顺序。例如,您可以使用MPI_Comm_world(或您

我使用MPI_Comm_split来拆分默认的MPI通信器。如果最初在默认通信器中有10个进程,那么MPI_Comm_WORLD和它们的列组由id_original标识。新的通讯器由4个进程组成,其id_为6、7、8、9。这些进程的等级由新通讯器中的id_new定义。这两个通讯器中进程的等级之间的关系是什么。id为6、7、8、9的流程是否会在新通信器中分别有新的等级0、1、2、3,或者顺序可能不同

您应该使用“key”参数来控制新通信器中的顺序。例如,您可以使用MPI_Comm_world(或您的“id_原件”)中的排名作为键,如下所示:

MPI_Comm_split( MPI_COMM_WORLD, id_original >= 6 && id_original <= 9,
                id_original, &newComm ); 
MPI通信拆分(MPI通信世界,原始id>=6和原始id,根据(我强调):

在每个子组中,进程 按照 参数键的值,与ties 根据他们在世界上的排名被打破 旧组


因此,是的,如果进程6-9为
键提供相同的值,那么它们在新的通信器中将分别得到0-3级。但是,如果这对程序的正确性至关重要,那么您应该使用Edric的方法在代码中明确这种安排。

您确定吗?通过我的测试,任何(字面上,任何)
参数保留原始进程顺序(包括tie),即使您尝试更改排名顺序!(例如,通过传递
(id\u original+x)%size
其中
x
size
是进程总数)