不同主机上的 OpenMP 程序

Posted

技术标签:

【中文标题】不同主机上的 OpenMP 程序【英文标题】:OpenMP program on different hosts 【发布时间】:2012-11-08 16:13:02 【问题描述】:

我想知道是否可以在多台主机上运行 OpenMP 程序。到目前为止,我只听说过可以在多线程上执行但都在同一台物理计算机上的程序。是否可以在两个(或更多)客户端上执行程序?我不想使用 MPI。

【问题讨论】:

【参考方案1】:

之前,有 Cluster OpenMP

Cluster OpenMP 是 OpenMP 的一种实现,它可以在不借助 MPI 的情况下使用多个 SMP 机器。这一进步的优势在于消除了编写显式消息传递代码的需要,以及不混合编程范式。 Cluster OpenMP 中的共享内存通过分布式共享内存子系统在所有机器上维护。 Cluster OpenMP 基于 OpenMP 宽松的内存一致性,允许共享变量仅在绝对必要时保持一致。 source

集群 OpenMP 的性能注意事项

某些内存操作比其他操作要更昂贵。为了使用 Cluster OpenMP 获得良好的性能,相对于受保护页面的访问次数,对未受保护页面的访问次数必须尽可能高。这意味着一旦页面在给定节点上更新,在下一次同步之前应该对其进行大量访问。为了实现这一点,程序应该尽可能少地同步,并尽可能多地重用给定页面上的数据。这转化为避免细粒度同步,例如原子构造或锁,并具有高数据局部性source。

【讨论】:

【参考方案2】:

是的,可以在分布式系统上运行 OpenMP 程序,但我怀疑它是否在每个用户的范围内。 ScaleMP 提供 vSMP - 一种昂贵的商业管理程序软件,它允许人们在许多联网主机之上创建虚拟 NUMA 机器,然后在此 VM 内运行常规操作系统(Linux 或 Windows)。它需要快速的网络互连(例如 InfiniBand)和专用主机(因为它在正常操作系统下作为管理程序运行)。我们这里有一个可操作的 vSMP 集群,它运行未经修改的 OpenMP 应用程序,但性能很大程度上取决于数据层次结构和访问模式。

NICTA 曾经开发过名为 vNUMA 的类似 SSI 虚拟机管理程序,但开发也停止了。除了他们的解决方案是特定于 IA64 的(IA64 是 Intel Itanium,不要与 Intel64 混淆,这是他们当前一代的 x86 CPU)。

英特尔曾经开发过 Cluster OpenMP(ClOMP;不要误认为是为 Clang 带来 OpenMP 支持的同名项目),但由于“客户普遍缺乏兴趣,而且它展示的案例比预期的少一个好处”(来自here)。 ClOMP 是英特尔对 OpenMP 的扩展,它内置于英特尔编译器套件中,例如你不能将它与 GCC 一起使用(这个 request 开始为 GCC 开发 ClOMP 陷入了困境)。如果您可以访问旧版本的英特尔编译器(从 9.1 到 11.1 的版本),则必须获得(试用)ClOMP 许可证,这可能几乎是不可能的,因为该产品已失效并且旧(试用)许可证已经已到期。再说一遍,从 12.0 版开始,英特尔编译器不再支持 ClOMP。

存在其他研究项目(只需搜索“分布式共享内存”),但似乎只有 vSMP(ScaleMP 解决方案)对于生产 HPC 环境来说已经足够成熟(并且定价相应)。似乎现在大多数努力都转向了协数组语言(Co-Array Fortran、Unified Parallel C 等)的开发。我建议你看看Berkeley UPC 或花一些时间学习 MPI,因为它在未来几年肯定不会消失。

【讨论】:

以上是关于不同主机上的 OpenMP 程序的主要内容,如果未能解决你的问题,请参考以下文章

确保混合 MPI / OpenMP 在不同的内核上运行每个 OpenMP 线程

在不同的线程下运行相同的代码有啥意义 - openMP?

OpenMP 没有给出正确的结果和不同的时间

为啥这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?

OpenMP 并行代码与串行代码的输出不同

C++:OpenMP 中的私有静态变量