【发布时间】:2012-04-25 21:30:09
【问题描述】:
有没有将等级编号推广到组编号?对于我的代码,我想创建 MPI::COMM_WORLD 的分层分解。假设我们使用 16 个线程。我使用 MPI::COMM_WORLD.Split 创建 4 个通信器,每个通信器有 4 个等级。现在是否有一个 MPI 函数可以为相应的四个组提供一些唯一的 id?
【问题讨论】:
标签: mpi
有没有将等级编号推广到组编号?对于我的代码,我想创建 MPI::COMM_WORLD 的分层分解。假设我们使用 16 个线程。我使用 MPI::COMM_WORLD.Split 创建 4 个通信器,每个通信器有 4 个等级。现在是否有一个 MPI 函数可以为相应的四个组提供一些唯一的 id?
【问题讨论】:
标签: mpi
好吧,您仍然可以通过MPI_COMM_WORLD 中的原始等级来引用每个进程。您还可以通过MPI_Comm_split() 的color 和key 参数完全控制每个进程在其新通信器中接收的等级。这些信息足以创建旧等级和新组/等级之间的映射。
【讨论】:
MPI_Comm_split() 的信息足以计算我要求的信息。但在 10.000 个内核的情况下做到这一点并非易事。这就是我询问是否支持直接在 MPI 基础上执行此操作的原因。
Split() 并使用 rank / N 颜色(以及可选的 rank % N 键)。这会将等级 0..N-1 放入第 0 组,将 N..2*N-1 放入第 1 组,依此类推,并保留每个组中进程的原始顺序。 j 组中等级为i 的进程是MPI_COMM_WORLD 中等级为j*N+i 的进程。
如果您不喜欢@suszterpatt 的回答(我喜欢),您总是可以滥用笛卡尔通信器,并假装通信器中索引 (2,3) 处的进程是层次分解的第 2 组中的进程 3。
但不要读到这篇文章并消除我推荐这种滥用的印象,这只是一个想法。
【讨论】: