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