2

在 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 中集体操作的实施细节?

4

2 回答 2

6

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

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

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

于 2012-07-26T08:58:14.733 回答
2

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

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

于 2012-07-26T08:57:03.620 回答