我想知道是否可以在多个主机上运行 OpenMP 程序。到目前为止,我只听说过可以在多线程上执行但都在同一台物理计算机上的程序。是否可以在两个(或更多)客户端上执行程序?我不想使用 MPI。
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 支持的同名项目),但由于“客户普遍缺乏兴趣,而且它显示出好处的案例少于预期”而被放弃(从这里)。ClOMP 是 Intel 对 OpenMP 的扩展,它内置于 Intel 编译器套件中,例如,您不能将它与 GCC 一起使用(这个为 GCC 启动 ClOMP 开发的请求被搁置了)。如果您可以访问旧版本的英特尔编译器(从 9.1 到 11.1 的版本),则必须获得(试用)ClOMP 许可证,这可能几乎是不可能的,因为该产品已失效并且旧(试用)许可证已经已到期。再说一次,从 12.0 版开始,英特尔编译器不再支持 ClOMP。
存在其他研究项目(只需搜索“分布式共享内存”),但似乎只有 vSMP(ScaleMP 解决方案)对于生产 HPC 环境来说已经足够成熟(并且定价相应)。似乎现在大多数努力都转向了协数组语言(Co-Array Fortran、Unified Parallel C 等)的开发。我建议你看看Berkeley UPC或花一些时间学习 MPI,因为它在未来几年内肯定不会消失。
之前,有Cluster OpenMP。
Cluster OpenMP 是 OpenMP 的一种实现,它可以在不借助 MPI 的情况下使用多个 SMP 机器。这一进步的优势在于消除了编写显式消息传递代码的需要,以及不混合编程范式。Cluster OpenMP 中的共享内存通过分布式共享内存子系统在所有机器上维护。Cluster OpenMP 基于 OpenMP 宽松的内存一致性,允许共享变量仅在绝对必要时保持一致。来源
集群 OpenMP 的性能注意事项
一些内存操作比其他的要昂贵得多。为了使用 Cluster OpenMP 获得良好的性能,相对于受保护页面的访问次数,对未受保护页面的访问次数必须尽可能高。这意味着一旦页面在给定节点上更新,在下一次同步之前应该对其进行大量访问。为了实现这一点,程序应该尽可能少地同步,并尽可能多地重用给定页面上的数据。这转化为避免细粒度同步,例如原子构造或锁,并具有高数据局部性源。