将MPI秩数推广到MPI组?

将MPI秩数推广到MPI组?,mpi,Mpi,秩数是否可以推广到群数?对于我的代码,我想创建MPI::COMM_WORLD的分层分解。假设我们使用16个线程。我使用MPI::COMM_WORLD.Split创建4个通讯器,每个通讯器有4个列组。现在是否有一个MPI函数可以为相应的四个组提供一些唯一的ID?那么,您仍然可以在MPI\u COMM\u WORLD中按其原始级别引用每个进程。您还可以通过MPI\u Comm\u split()的color和key参数,完全控制每个进程在其新通信器中接收的级别。这足够多的信息来创建旧等级和新组/等级

秩数是否可以推广到群数?对于我的代码,我想创建MPI::COMM_WORLD的分层分解。假设我们使用16个线程。我使用MPI::COMM_WORLD.Split创建4个通讯器,每个通讯器有4个列组。现在是否有一个MPI函数可以为相应的四个组提供一些唯一的ID?

那么,您仍然可以在
MPI\u COMM\u WORLD
中按其原始级别引用每个进程。您还可以通过
MPI\u Comm\u split()
color
key
参数,完全控制每个进程在其新通信器中接收的级别。这足够多的信息来创建旧等级和新组/等级之间的映射。

如果你不喜欢@suszterpatt的答案(我喜欢),你可能总是滥用笛卡尔式通信器,并假装通信器中索引(2,3)处的过程是分层分解组2中的过程3


但是不要读这篇文章,不要以为我推荐这样的滥用,这只是一个想法。

你说得对,我添加到
MPI\u Comm\u split()
中的信息足以计算我要求的信息。但是,在10.000个内核的情况下,这样做并不简单。这就是为什么我问是否有支持直接在MPI的基础上这样做的原因。对我来说似乎很简单。如果要将N*M个进程拆分为N个组,则每个进程使用
rank/N
color(可选地,
rank%N
key)调用
split()
。这将把秩0..N-1放入组0,N..2*N-1放入组1,依此类推,并保留每个组内进程的原始顺序。组
j
中等级
i
的过程是
MPI\u COMM\u WORLD
中等级
j*N+i
的过程。