parallel-processing - 用于混合分布式和共享内存的混合 OpenMP + OpenMPI?

标签 parallel-processing openmp openmpi

我正在开发一个代码,按照我的标准执行一些非常大的计算。根据单 CPU 估计,预期运行时间约为 10 个 CPU 年,内存要求约为 64 GB。几乎不需要 IO。我的相关代码的串行版本(用 C 编写)运行良好,我必须开始考虑如何最好地并行化代码。

我可以访问每个节点具有约 64 GB RAM 和 16 个内核的集群。我可能会限制自己使用例如<= 8 个节点。我正在想象一个设置,其中内存在单个节点上的线程之间共享,在不同节点上使用单独的内存,节点之间的通信相对较少。

根据我目前所读到的内容,我提出的解决方案是使用混合 OpenMP + OpenMPI 设计,使用 OpenMP 来管理单个计算节点上的线程,并使用 OpenMPI 在节点之间传递信息,如下所示:
https://www.rc.colorado.edu/crcdocs/openmpi-openmp

我的问题是这是否是实现这种并行化的“最佳”方式。我是一名经验丰富的 C 程序员,但在并行编程方面的经验非常有限(OpenMP 有一点,OpenMPI 没有;我过去的大部分工作都是令人尴尬的并行)。作为替代建议,OpenMPI 是否可以在单个主机上有效地共享内存?如果是这样,那么我可以避免使用 OpenMP,这会使事情稍微简单一些(一个 API 而不是两个)。

最佳答案

混合 OpenMP 和 MPI 编码最适用于可以清楚地识别两个独立的并行级别的问题 - 粗粒度级别和嵌套在每个粗子域中的细粒度级别。由于细粒度并行在使用消息传递实现时需要大量通信,因此无法扩展,因为通信开销可以与正在完成的工作量相媲美。由于OpenMP是共享内存范式,不需要数据通信,只需要访问同步,更适合细粒度的并行任务。 OpenMP 还受益于线程之间的数据共享(以及具有共享最后一级缓存的现代多核 CPU 上的相应缓存共享),并且通常比等效的消息传递代码需要更少的内存,其中一些数据可能需要复制到所有进程。另一端的 MPI 可以跨节点运行,并且不限于在单个共享内存系统上运行。

你的话表明你的并行化是非常粗粒度的,或者属于所谓的令人尴尬的并行问题。如果我是你,我会选择混合动力。如果您只使用 OpenMP 编译指示而不使用运行时调用(例如 omp_get_thread_num()),您的代码可以编译为纯 MPI(即使用非线程 MPI 进程)或混合编译,具体取决于您是否启用 OpenMP(您还可以提供一个虚拟的 OpenMP 运行时,以便将代码编译为串行)。这将为您提供 OpenMP(数据共享、缓存重用)和 MPI(透明网络、可扩展性、轻松启 Action 业)的好处,并增加了关闭 OpenMP 并在仅 MPI 模式下运行的选项。作为额外的奖励,您将能够迎接 future ,这看起来就像给我们带来了互连的多核 CPU。

关于parallel-processing - 用于混合分布式和共享内存的混合 OpenMP + OpenMPI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12321889/

相关文章:

c - MPI 异步发送和接收未按预期工作

LINQ 中的 C# 并行性

matlab - 防止 MATLAB 打开池

c++ - 更好的实现策略是什么?

mpi - OpenMPI 中的动态节点

c - 打开 mpi 没有足够的可用插槽

Clojure 结构多个计算/写入并行工作

c - 当线程执行for循环迭代时如何继续与master一起工作?

c - 如何使用 OpenMP 任务实现减少?

c - 具有多个 Pthread 的 MPI