MPI_Comm_split 有多贵?

How costly is MPI_Comm_split?

拨打 MPI_Comm_split 的费用是多少?它是 运行 O(n)、O(log(n)) 还是其他(n 是要拆分的 comm 中的等级数)?

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

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

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

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

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

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

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

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

因此,即使 Open MPI 和 MPICH 在点对点、集体和单方通信方面具有可比的性能,但如果您创建大量通信器(或者如果您使用一个在后台执行此操作的第三方库)。