MPI + 线程并行化与仅 MPI 相比有啥优势(如果有)?

Posted

技术标签:

【中文标题】MPI + 线程并行化与仅 MPI 相比有啥优势(如果有)?【英文标题】:What is the advantage (if any) of MPI + threads parallelization vs. MPI-only?MPI + 线程并行化与仅 MPI 相比有什么优势(如果有)? 【发布时间】:2017-05-15 15:03:25 【问题描述】:

给定一个由多个节点组成的集群,每个节点都承载多核处理器,与使用纯全 MPI 相比,在节点之间使用 MPI 节点内的 OpenMP/pthread 是否有任何优势?如果我理解正确,如果我在单个节点上运行 MPI 程序并指示进程数等于内核数,那么我将有一个诚实的并行 MPI 作业,多个进程在不同的内核上运行。那么,为什么还要在节点内使用线程而只在节点之间使用 MPI 来进行混合并行化呢?对于 MPI+CUDA 混合的情况我没有疑问,因为 MPI 不能使用 GPU,但它可以使用 CPU 内核,那为什么要使用线程呢?

【问题讨论】:

因为在线程之间共享数据比在进程之间更容易、更快捷。 好的,所以如果并行任务之间的通信不密集,那么 MPI+线程可能不会比纯 MPI 提供太多收益? 【参考方案1】:

结合使用 OpenMP/pthread 线程和 MPI 进程称为混合编程。它比纯 MPI 更难编程,但随着最近 OpenMP 延迟减少,使用混合 MPI 很有意义。一些优点是:

    避免数据复制:由于线程可以在节点内共享数据,如果任何数据需要在进程之间复制,我们可以避免这种情况。 轻量级:线程是轻量级的,因此您可以减少与进程相关的元数据。 消息数量减少:节点内的单个进程可以与其他进程通信,减少节点之间的消息数量(从而减少网络接口卡的压力)。集体交流中涉及的消息数量是值得注意的。 更快的通信 :正如上面@user3528438 所指出的,由于线程使用共享内存进行通信,您可以避免在节点内使用点对点 MPI 通信。最近的一种方法(2012 年)建议使用 RMA 共享内存而不是节点内的线程 - 这种模型称为 MPI+MPI(使用 MPI 加 MPI 搜索 google 学者)。

但混合 MPI 也有其缺点,但您只询问了优点。

【讨论】:

另一个好处是更快的启动时间,并减少开销(例如设置通信通道的时间 + 内部内存占用) 使用 MPI 共享内存(MPI 3 标准的一部分)在很大程度上解决了数据复制问题。【参考方案2】:

这实际上是一个看起来要复杂得多的问题。

这取决于很多因素。根据经验,我会说:您总是乐于避免使用 hibrid openMP-MPI。这是一个需要优化的烂摊子。但是有一些时刻是你无法避免的,主要取决于你正在解决的问题和你可以访问的集群。

假设您正在解决一个高度可并行化的问题并且您有一个小型集群,那么 Hibrid 可能毫无用处。

但是,如果您遇到一个问题,可以说可以很好地扩展到 N 个进程,但在 4N 时效率开始变得非常差。而且您可以访问具有 10N 个内核的集群......然后混合将是一种解决方案。每个 MPI 进程将使用少量线程,例如 4(众所周知,>8 效率不高)。 (想想我认识的大多数人在 KNL 上每个 MPI 进程使用 4 到 8 个线程,即使一个芯片有 68 个内核,这很有趣)

那么混合加速器/openMP/MPI 呢?

加速器 + MPI 有问题。一旦您开始使用具有加速器的集群,您将需要使用诸如 openMP/MPI 或 CUDA/MPI 或 openACC/MPI 之类的东西,因为您需要在设备之间进行通信。如今,您可以使用 Direct GPU 绕过 CPU(至少对于 Nvidia 而言,对于其他构建器来说不是线索,但我希望会是这种情况)。然后通常每个 GPU 将使用 1 个 MPI 进程。大多数带有 GPU 的集群将有 1 个插槽和 N 个加速器(N

【讨论】:

以上是关于MPI + 线程并行化与仅 MPI 相比有啥优势(如果有)?的主要内容,如果未能解决你的问题,请参考以下文章

mpi中的darray和子数组有啥区别?

多进程 MPI 与多线程 std::thread 性能

与仅使用自制线程相比,使用 AnimationTimer 是不是具有性能优势?

使用 MPI 分配进程

c++中线程库和mpi的区别

我可以将 MPI 与共享内存一起使用吗