OpenMP 和 MPI 交互

Posted

技术标签:

【中文标题】OpenMP 和 MPI 交互【英文标题】:OpenMP and MPI Interaction 【发布时间】:2018-09-29 09:38:35 【问题描述】:

您好,目前我正在开发一个使用 MPI 并行工作的程序。我想知道是否可以使用 OpenMP 在 for 循环中获得额外的速度,以便我可以从每个处理器中获得更多。我这样做会有所收获吗?还有我该怎么办?

【问题讨论】:

MPI+OpenMP的组合应用广泛。您最喜欢的搜索引擎是比 SO 更好的起点,尽管您会在这里找到很多关于该主题的问题。 这个问题没有通用答案;有些 MPI 应用程序受益于线程,有些则没有。例如,对于我们的 HPC 应用程序 (lsu3shell.sourceforge.net),线程带来了显着的改进,但没有降低运行时间。我们只是通过在线程之间共享数据结构(在同一节点上运行的不同 MPI 进程的不同地址空间中冗余)节省了大量内存,这使我们能够解决更大的计算问题。 【参考方案1】:

根据经验,这实际上取决于您的问题以及您使用了多少 MPI 进程。

使用大量 MPI 进程通常会改善数据局部性,但您的并行化可能不允许大量进程。

您肯定会获得不错的加速的想法通常是错误的 :-(... 但是,如果您由于缺乏并行效率而无法使用更多 MPI 进程,您可能会获得这种可能性有效地使用更多内核。

根据经验,您应该针对少量线程(4-8,1/2 的套接字核心数),特别是如果您只有小循环(如果您达到最大 MPI 进程数,则应该是这种情况)。

混合并行的良好介绍: http://www.openmp.org/press-release/sc13-tutorial-hybrid-mpi-openmp-parallel-programming/

【讨论】:

第一个被广泛用于 MPI 的 CPU 使得大多数应用程序可以单独使用 MPI 实现足够接近完全性能,前提是您不会用完物理内存,正如其中提到的那样之前的cmets。与 OpenMP 一起“混合”(通常是 MPI 漏斗)可能有助于减少并行性的内存增长,并减少集群节点之间的互连流量。 如果您只为单个节点编写应用程序,您可能不会费心将 MPI 与 OpenMP 相结合,尽管在某些情况下,多个 CPU 平台可以通过运行每个 CPU 上的多线程 MPI 等级。 MPI/OpenMP 的成功最有可能适用于展示(或可以调整为)3 级并行性的应用程序; MPI 外部,OpenMP 线程在中间,内核并行(simd 等)在内部循环中。

以上是关于OpenMP 和 MPI 交互的主要内容,如果未能解决你的问题,请参考以下文章

在混合 MPI/OpenMP 中进行 MPI 调用的线程

openacc 与 openmp 和 mpi 的区别?

谐波级数和 c++ MPI 和 OpenMP

什么更容易学习和调试 OpenMP 或 MPI?

为啥 OpenMP 减少在共享内存结构上比 MPI 慢?

如何使用 MPI 和 OpenMP 运行并行循环