多核机器上 MPI 集合操作的实现细节

Posted

技术标签:

【中文标题】多核机器上 MPI 集合操作的实现细节【英文标题】:Implementation details of MPI collective operations on a multi core machine 【发布时间】:2012-07-24 19:38:23 【问题描述】:

在 MPI 中,每个 rank 都有一个唯一的地址空间,并且它们之间的通信通过消息传递进行。

我想知道MPI 如何在具有共享内存的多核机器上工作。 如果队列位于两台没有共享内存的不同机器上,则 MPI 必须使用消息进行通信。但是如果 rank 在同一台物理机器上(但每个 rank 仍然有不同的地址空间),MPI 调用会利用共享内存吗?

例如,假设我正在发出 ALLREDUCE 调用。我有两台机器 M1 和 M2,每台都有 2 个内核。等级 R1 和 R2 位于机器 M1 的核心 1 和核心 2 上,而 R3 和 R4 位于机器 M2 的核心 1 和 2 上。 ALLREDUCE 将如何发生?是否会传输超过 1 条消息? 理想情况下,我希望 R1 和 R2 使用它们可用的共享内存(类似于 R3 和 R4)进行减少,然后在 M1 和 M2 之间交换消息。

是否有任何文档可供我阅读有关 MPI 中的集合操作的实施细节?

【问题讨论】:

【参考方案1】:

集体操作的实现因一个 MPI 库而异。最好的地方是您正在使用/想要使用的具体库的源代码。

我可以告诉你 Open MPI 如何实现集合。 Open MPI 由不同的组件(模块)所在的各个层组成。有用于集体操作的coll 框架,它使用较低级别的btl 框架来传输消息。 coll 框架中实现了许多不同的算法,以及实现这些算法的许多不同模块。评分机制用于选择库认为最适合您的情况的模块,但这可以很容易地用 MCA 参数覆盖。最突出的一个是tuned 模块,它经过了良好的测试并且可以很好地在各种互连上扩展,从共享内存到 InfiniBand。 tuned 模块完全不知道进程的位置。它只是使用btl 框架来发送消息,btl 负责使用共享内存或网络操作。 tuned 模块中的一些算法是分层的,并且通过适当的参数调整(OMPI 的巨大灵活性来自于许多内部 MCA 参数可以在不重新编译的情况下更改)这些算法可以匹配集群的实际层次结构.还有一个名为hierarchcoll 模块尽最大努力收集尽可能多的物理拓扑信息并使用它来优化集体通信。

不幸的是,几乎所有 MPI 实现都是用 C 语言编写的,顶部有非常薄的层以提供 Fortran 接口。因此,如果您想深入研究这个主题,我希望您对 C 的了解高于平均水平。也有很多关于集体运营优化的研究论文。其中一些是免费提供的,另一些是通过学术订阅获得的。

【讨论】:

从你所说的,我猜 MPI 确实利用了共享内存。很高兴知道该框架确实考虑了互连的属性。我不是一个熟练的 C 或 Fortran 程序员。实际上,我对集体操作优化背后的理论更感兴趣。请您指导我看一些研究论文。 参见 R. Kumar、A. Mamidala 和 D.K. 的“Scaling Alltoall Collective on Multi-core Systems”。 Panda 和 R. Thakur、R. Rabenseifner 和 W. Gropp 的“MPICH 中集体通信操作的优化”。【参考方案2】:

由于这是您正在使用的 MPI 实现的实现细节,我想最好在邮件列表中询问您正在使用的任何 MPI 实现。或者,在谷歌学者或其他搜索科学论文的网站上搜索“mpi 集体”会给你带来很多点击。

但是,一个合理的实现是首先使用共享内存在节点内进行缩减,以减少网络消息的数量。

【讨论】:

以上是关于多核机器上 MPI 集合操作的实现细节的主要内容,如果未能解决你的问题,请参考以下文章

集合框架

java集合框架

Python多核编程mpi4py实践及并行计算-环境搭建篇

使用jdk8 stream简化集合操作

集合操作最简单的高效并行处理

Stream接口