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 在点对点、集体和单方通信方面具有可比的性能,但如果您创建大量通信器(或者如果您使用一个在后台执行此操作的第三方库)。
拨打 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 在点对点、集体和单方通信方面具有可比的性能,但如果您创建大量通信器(或者如果您使用一个在后台执行此操作的第三方库)。