Parallel processing MPI_Reduce和MPI_Allreduce的默认实现需要多少跃点?

Parallel processing MPI_Reduce和MPI_Allreduce的默认实现需要多少跃点?,parallel-processing,mpi,Parallel Processing,Mpi,我试图计算出MPI_Reduce和MPI_Allreduce通常会涉及多少个独立的并行“跳跃”阶段,以获得这些操作所涉及的最小延迟的大致数字。基本上,假设消息非常小,因此延迟将占主导地位(?) 例如,减少100个MPI进程之间的内存。一个实现可能需要99个“延迟”:每个进程相互发送消息。另一个实现可以使每个进程向所有其他节点发送一条消息,并且只需要1个“延迟”(虽然是的,真的无法想象它会这么简单:会有争用增加了这一点)来完成@GillesGouaillardet的好评论,一些MPI实现使用基于动

我试图计算出MPI_Reduce和MPI_Allreduce通常会涉及多少个独立的并行“跳跃”阶段,以获得这些操作所涉及的最小延迟的大致数字。基本上,假设消息非常小,因此延迟将占主导地位(?)


例如,减少100个MPI进程之间的内存。一个实现可能需要99个“延迟”:每个进程相互发送消息。另一个实现可以使每个进程向所有其他节点发送一条消息,并且只需要1个“延迟”(虽然是的,真的无法想象它会这么简单:会有争用增加了这一点)

来完成@GillesGouaillardet的好评论,一些MPI实现使用基于动态/自动调谐的方法。广泛使用的和实现就是这种情况(假设它们配置正确)。选择的算法可能取决于几个因素(正如你在研究论文中看到的)。即使在您的特定情况下:例如,缓冲区大小也很重要。延迟并不总是限制因素,特别是在节点很少的情况下。此外,节点的网络拓扑(例如胖树、超立方体、圆环体等)和互连技术对延迟和吞吐量有显著影响。一个有效的实现必须考虑到这一点,以确保高效,主要是为了避免网络的争用。也就是说,它们是可以在胖树/超立方体/蝴蝶网络(对于两种集体操作)上的
log(n)
跳数(具有
n
节点数)中实现这一点的算法。对于基于环面的网络,跳数由拓扑本身限定,更具体地说,由环面的长度限定,通常类似于
O(n^(1/d))
(具有
d
环面的维数)。

MPI没有“默认实现”。在开放MPI的情况下,
coll/tuned
组件(可能是默认组件)根据通信器和消息大小选择一个算法(在多个算法中)。典型的算法是基于树的,这意味着P进程的消息数量将按log2(P)进行缩放。这是对天真的“全部发送”实现的巨大改进——即使在1024个进程上,您也可以看到数十条消息,而不是1000条。MPI将进行优化,以减少使用共享内存的节点上的延迟,因此这里的有效延迟将少得多。实际上,节点的数量可能是最重要的因素。