首页 > 解决方案 > MPI_Comm_split 的成本是多少?

问题描述

调用 MPI_Comm_split 的成本是多少?它是以 O(n)、O(log(n)) 还是其他方式运行(n 是 comm 中被拆分的等级数)?

我正在编写针对基于 infiniband 的超级计算系统的代码。

标签: mpi

解决方案


如果您使用 Open MPI,MPI_Comm_split()(一般来说,通信器创建)可能并不便宜。

设计选择是从通信器 id(例如 CID,它是一个数字)到通信器的超快速转换。这就像访问数组一样快速和简单。

为了使内存占用尽可能低,新创建的通信器总是被分配最低的可用 CID。

CID 分配是通过迭代算法实现的,MPI_Iallreduce()每次迭代使用两个,迭代次数取决于 CID 空间在所有任务上的碎片程度。根据您使用的 MPI 任务数量以及 CID 空间的碎片程度,这可能需要相当长的时间。

您可以将MPI_Comm_split()探戈视为两步 - 创建新通信器的组 - 将 CID 分配给新通信器

第二步是最昂贵的,它不仅取决于初始通信器中的秩数。

如果我理解正确,MPICH 做出了另一种设计选择。将通信器 ID 转换为通信器稍微贵一些(但实际上每次调用 MPI 子例程时都会发生这种情况),但不需要始终使用最低的可用 CID,因此第二步要便宜得多(而且这只发生在新的通讯器被创建)。

因此,即使 Open MPI 和 MPICH 在点对点、集体和单方面通信方面具有相当的性能,但如果您创建大量通信器(或者如果您使用第三方库在引擎盖下)。


推荐阅读