历史的角度
真的不可能说未来新的范式会是什么样子,例如一个好的历史视角我建议阅读 Ken Kennedy 的HPF 的兴衰。Kennedy 介绍了两种新兴模式,MPI 与智能编译器,并详细说明了 MPI 如何拥有适量的早期采用者和主导的灵活性。HPF 最终解决了它的问题,但为时已晚。
在许多方面,PGAS 和 OpenMP 等几种范例都遵循相同的 HPF 趋势。早期的代码不够灵活,无法很好地使用,并且在桌面上留下了很多性能。但是,不必编写并行算法的每一部分的承诺是一个有吸引力的目标。所以对新车型的追求一直在追求。
硬件趋势明显
现在,人们经常提到 MPI 的成功与它如何对其运行的硬件进行建模密切相关。大致每个节点都有几个进程,并且将消息传递到本地点对点或通过协调的集体操作很容易在集群空间中完成。正因为如此,我不相信任何给出不紧跟新硬件趋势的范式的人,实际上我是通过Vivak Sarakar的工作确信这一观点的。
与此保持一致的是,以下三个趋势显然在新架构中取得了进展。让我明确一点,现在有十二种不同的架构在 HPC 中销售。这比不到 5 年前仅支持 x86 有所上升,因此未来几天将看到许多以不同且有趣的方式使用硬件的机会
- 特殊用途芯片:想想像加速器这样的大型矢量单元(Nvidia 的 Bill Dally 支持的观点)
- 低功耗芯片:基于 ARM 的集群(以适应功耗预算)
- 芯片的平铺:考虑不同规格的芯片的平铺(Avant Argwal的作品)
当前型号
当前模型实际上是 3 级深度。虽然有很多代码很好地使用了其中两个级别,但使用这三个级别的代码并不多。我相信,要首先达到 exascale,需要投资确定您的代码是否可以在所有三个级别上运行。这可能是顺应当前趋势进行迭代的最安全路径。
让我迭代模型以及它们将如何根据预测的新硬件视图进行更改。
分散式
分布式级别的播放器主要属于 MPI 和 PGAS 语言。MPI 现在是一个明显的赢家,但是像 UPC 和 Chapel 这样的 PGAS 语言正在进入这个领域。一个很好的迹象是 HPC 基准挑战。PGAS 语言提供了非常优雅的基准测试实现。
这里最有趣的一点是,虽然这个模型目前只在节点级别工作,但它将成为 Tiled 架构节点内的一个重要模型。一个迹象是英特尔 SCC 芯片,它从根本上就像一个分布式系统。SCC 团队创建了自己的 MPI 实现,许多团队成功地将社区库移植到此架构。
但老实说,PGAS 确实有一个进入这个领域的好故事。您真的要对 MPI 节点间进行编程,然后必须在节点内执行相同的技巧吗?这些平铺架构的一个重要问题是它们在芯片上具有不同的时钟速度以及内存带宽的主要差异,因此高性能代码必须考虑到这一点。
节点共享内存
在这里,我们看到 MPI 通常“足够好”,但 PThreads(以及从 PThreads 派生的库,例如 Intel Parallel Building Blocks)和 OpenMP 仍然经常使用。普遍的观点是,当有足够多的共享内存线程时,MPI 的套接字模型会为 RPC 崩溃,或者您需要在核心上运行更轻量的进程。您已经可以看到 IBM Bluegene 系统存在共享内存 MPI 问题的迹象。
正如 Matt 评论的那样,计算密集型代码的最大性能提升是串行代码的矢量化。虽然许多人认为这在加速器中是正确的,但它对于节点机器也很重要。我相信 Westmere 有一个 4 宽的 FPU,因此如果没有矢量化,一个人只能获得四分之一的翻牌。
虽然我没有看到当前的 OpenMP 很好地进入了这个领域,但低功耗或平铺芯片有一个地方可以使用更多的轻线程。OpenMP 难以描述数据流的工作原理,并且随着使用的线程越来越多,我只看到这种趋势变得更加夸张,只需看看如何使用 OpenMP 进行正确预取的示例。
课程级别足够高的 OpenMP 和 PThreads 都可以利用必要的矢量化来获得良好的峰值百分比,但这样做需要以自然矢量化的方式分解您的算法。
协处理器
最后,协处理器(GPU、MIC、Cell加速器)的出现已经站稳脚跟。越来越清楚的是,没有它们,通往 exascale 的道路将是不完整的。在 SC11,每位贝尔奖的参赛者都非常有效地使用它们来达到低 petaflops。虽然 CUDA 和 OpenCL 主导了当前市场,但我希望 OpenACC 和 PGAS 编译器进入该领域。
现在要达到 exascale,一个建议是将低功率芯片与许多协处理器耦合。这将很好地杀死当前堆栈的中间层,并使用管理主芯片上的决策问题的代码并将工作转移到协处理器。这意味着要使代码非常有效地工作,人们必须根据内核(或小码)重新考虑算法,即无分支指令级并行片段。据我所知,这种演变的解决方案非常开放。
这对应用程序开发人员有何影响
现在来回答你的问题。如果你想保护自己免受即将到来的百亿亿级机器的复杂性,你应该做一些事情:
- 开发您的算法以适应至少三个级别的并行层次结构。
- 根据可以在层次结构之间移动的内核来设计您的算法。
- 放松您对任何顺序流程的需求,所有这些效果都将异步发生,因为同步执行是不可能的。
如果您想在今天表现出色,MPI + CUDA/OpenCL 就足够了,但 UPC 已经到了那里,所以花几天时间学习它不是一个坏主意。OpenMP 可以帮助您入门,但一旦需要重构代码就会导致问题。PThreads 需要将您的代码完全重写为它的风格。这使得 MPI + CUDA/OpenCL 成为当前最好的模型。
这里没有讨论什么
虽然所有这些关于 exascale 的讨论都很好,但这里没有真正讨论的是将数据输入和输出机器。尽管内存系统取得了许多进步,但我们在商品集群中看不到它们(太贵了)。现在数据密集型计算正在成为所有超级计算会议的一大焦点,势必会有更大的运动进入高内存带宽空间。
这带来了可能发生的另一个趋势(如果合适的资助机构参与其中)。对于所需的计算类型,机器将变得越来越专业。我们已经看到 NSF 资助了“数据密集型”机器,但这些机器与 2019 年的百亿亿次大挑战赛处于不同的轨道上。
这比预期的要长,请在评论中需要它们的地方提供参考