MPI_Comm_split的成本有多高?

时间:2018-06-06 17:18:36

标签: mpi

调用MPI_Comm_split的代价是多少?它是在O(n),O(log(n))还是其他东西(n是被分割的comm中的排名数)中运行的?

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

1 个答案:

答案 0 :(得分:4)

如果您使用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在点对点,集体和单面通信方面具有相似的性能,如果您创建了大量的通信器(或者如果您使用第三方),那么这可能是一个非常不同的大规模图片在引擎盖下这样做的图书馆。)