有些编程技术针对的是当前或者未来的超级计算机,虽然它们已经存在了很长时间,但现在很多开发人员并没有对这些技术有一个清晰的概念和认识。
从上世纪六七十年代世界上首个超级计算机CDC6600被Seymour Cray研制出来起,超级计算机就成为了应用程序开发人员的另一目标,使开发人员不断适应新的方法,和持续变化的硬件和软件系统。在高性能计算领域,开发人员所需要的适应性尤为明显,这里,开发人员通常需要对目标节点架构进行优化,以“挤出”最后一点可用的性能。
然后,20世纪90年代的“杀手微指令的袭击”把一切都变成了一个小问题。随着节点数量的增加,应用程序开发人员不得不考虑PVM(并行计算机),然后是MPI通讯协议,在他们的任务中,在没有任何向量指令的情况下,将应用程序并行化到大量的节点上,这些节点包括商品的COTS (货架产品)芯片。如下图所示,从1995年到2010年,COTS芯片的时钟周期减少了。应用程序开发人员不再需要关心节点架构。
随着AVX256,AVX512,SVE和GPU的出现,在过去的5年里,矢量已经开始返回我们的视野。更近一点儿说,像英特尔的Knight ' s Landing(KNL)这样的核心系统,以及附加的加速器,如Nvidia的GPU,都需要重新检查应用程序,以从新的更强大的节点中获得更好的性能。由于应用程序不可能总是由编译器进行矢量化和/或并行化,因此应用程序开发人员必须做一些事情。
从编写重要的内核到Nvidia GPU的CUDA等专业编程模型,到使用编译器指令帮助编译器将输入的用户级代码转换为处理器的低级矢量化代码。然后还有一个问题,就是在节点/生成数千个线程上为GPU使用所有这些内核。因为在所有的节点上运行MPI是非常有效的,最初的多核系统的开发人员并不需要使用共享内存线程来并行化。然而,在Nvidia加速器上线程是绝对需要的。OpenACC和OpenMP 4.5是为GPU的线程化和矢量化解决方案开发的。
新体系结构中的另一个启示是,内存层次结构变得越来越复杂,尤其是当应用程序具有很大的内存占用时。KNL,以及带有GPU加速器的节点,有两个级别的内存,这将引入新的挑战,这些挑战必须由开发人员员来解决。下图显示了KNL的内存层次结构和承载的GPU之间的差异。如果一个应用程序适合于高速存储器,那么它将获得优秀的内存性能。但是,如果应用程序需要更多的内存,那么必须将数据集以高效和及时的方式在两者之间进行管理。
过去的四到五年对那些坚持提高生产力的开发人员来说是一种文化冲击。他们现在面临着有效利用这些新的强大节点的严峻挑战。如果它们继续使用全MPI代码,并没有对多层并行代码执行必要的转换(通过矢量化和线程化),那么它们的性能将只是节点数量和时钟周期的一个函数。虽然节点上的核心数量正在缓慢上升,但这些核心的时钟率正在下降,导致在没有软件优化的情况下,新硬件投资的回报率很低。