当前位置: 首页 > 科技观察

开发人员应该如何为超级计算机编程?

时间:2023-03-21 21:24:11 科技观察

一些编程技术是针对当前或未来的超级计算机的。虽然它们已经存在了很长时间,但是现在很多开发者对这些技术并没有一个清晰的概念和理解。自从1960年代和70年代世界上第一台超级计算机CDC6600被SeymourCray开发出来后,超级计算机就成为了应用程序开发人员的另一个目标,使开发人员能够不断适应新的方法和不断变化的硬件和软件系统。开发人员所需的适应性在HPC领域尤为明显,开发人员通常需要优化目标节点架构以“挤出”可用的每一点性能。然后,1990年代的“raidofkillermicros”让一切都变成了小问题。随着节点数量的增加,应用程序开发人员不得不考虑PVM(并行计算机),然后在他们将应用程序并行化到大量没有任何矢量指令的节点的任务中使用MPI通信协议,这些节点包括商品COTS(off-现成的)芯片。如下图所示,从1995年到2010年,COTS芯片的时钟周期在下降。应用程序开发人员不再需要关心节点架构。随着AVX256、AVX512、SVE和GPU的出现,向量在过去5年开始重新回到我们的视线。最近,英特尔的Knight'sLanding(KNL)等核心系统以及Nvidia的GPU等附加加速器将需要重新检查应用程序,以便从新的更强大的节点性能中获得更好的性能。由于应用程序不能总是由编译器矢量化和/或并行化,因此应用程序开发人员必须做一些事情。从编写重要的内核到专门的编程模型(如用于NvidiaGPU的CUDA),再到使用编译器指令帮助编译器将输入的用户级代码转换为处理器的低级矢量化代码。然后是在节点上为GPU使用所有这些内核/产生数千个线程的问题。因为在所有节点上运行MPI非常高效,所以最初的多核系统的开发人员不需要使用共享内存线程来进行并行化。但是,Nvidia加速器绝对需要线程。OpenACC和OpenMP4.5是为GPU的线程化和矢量化解决方案而开发的。新架构的另一个启示是内存层次结构变得越来越复杂,尤其是当应用程序占用大量内存时。KNL和具有GPU加速器的节点具有两级内存,这带来了开发人员必须解决的新挑战。下图显示了KNL的内存层次结构和托管GPU之间的区别。如果应用程序适合高速内存,它将获得出色的内存性能。但是,如果应用程序需要更多内存,则必须以高效及时的方式在两者之间管理数据集。过去四到五年对坚持提高生产力的开发人员来说是一次文化冲击。他们现在面临着有效利用这些新的强大节点的严峻挑战。如果他们继续使用全MPI代码,并且不对多级并行代码执行必要的转换(通过矢量化和线程),那么他们的性能将只是节点数和时钟周期数的函数。虽然节点上的内核数量在缓慢增加,但这些内核的时钟速率却在下降,导致在没有软件优化的情况下对新硬件的投资回报率很低。