MPI +线程并行化与仅MPI的优势(如果有的话)是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MPI +线程并行化与仅MPI的优势(如果有的话)是什么?相关的知识,希望对你有一定的参考价值。

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

答案

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

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

但是混合MPI也有它的缺点,但你只问了它们的优点。

另一答案

事实上,这看起来是一个更复杂的问题。

这取决于很多因素。根据经验,我会说:你总是乐于避免hibrid openMP-MPI。哪个是优化的混乱。但是有些东西是你无法避免的,主要取决于你正在解决的问题以及你有权访问的集群。

假设你正在解决一个高度可并行化的问题而且你有一个小集群,那么Hibrid可能会没用。

但是,如果你有一个问题,可以说可以很好地扩展到N个进程,但在4N开始效率非常低。您可以访问具有10N核心的集群......然后,杂交将成为一种解决方案。每个MPI进程将使用少量线程,如4(已知> 8不高效)。 (很有趣的是,在KNL上我知道大多数人使用4到8个线程,每个MPI进程即使一个芯片有68个内核)

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

加速器+ MPI你错了。一旦您开始使用具有加速器的群集,您将需要使用某些功能,如openMP / MPI或CUDA / MPI或openACC / MPI,因为您需要在设备之间进行通信。现在你可以使用Direct GPU绕过CPU(至少对于Nvidia而言,不是其他构建者的线索,但我希望情况会如此)。然后通常每个GPU将使用1个MPI进程。大多数具有GPU的群集将具有1个套接字和N个加速器(N.

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

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

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

MPI学习3MPI并行程序设计模式:不同通信模式MPI并行程序的设计

使用 MPI 分配进程

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

OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?