话说超级计算1)
2022-11-25李新亮
李新亮
(中国科学院力学研究所高温气体动力学国家重点实验室,北京 100190)
(中国科学院大学工程科学学院,北京 100049)
超级计算,又称大规模并行计算,是使用多个CPU 协同计算,形成强大算力的一种计算方式。并行计算是当前计算机发展的主流及趋势。发展并行计算的重要原因是当前单个CPU 的计算能力遇到了瓶颈,随着CPU 芯片电路尺寸越来越小,电路的漏电效应、量子效应等就显现出来了,其主频提升难度越来越大。当前主流个人计算机(PC 机)的CPU 主频大约为3G 赫兹左右,而十年前的主流CPU 主频也是3G 赫兹左右。单纯从主频来看,十年并没有明显提升,性能提升需要另辟途径,增加处理器核心的数目就是一条重要途径。除了CPU 之外,其他计算设备也是通过增加处理器的数目来提高性能,一块显卡内部包含了数百到数千个流处理器,高端显卡甚至有上万个流处理器,靠这些处理器协同工作以达到很高的计算性能。顶级计算机更是如此,神威·太湖之光计算机总共有上千万个CPU 核心,形成巨大的计算能力。依靠增加CPU 的数目来提升性能是当前超级计算机发展的主要趋势。随着人们对计算机性能的要求不断增长,未来计算机内处理器的数目还会不断提升。
人们对计算机性能的需求是永无止境的。以湍流数值模拟为例,对湍流最为精细的模拟方法是直接数值模拟(direct numerical simulation, DNS),这种模拟方法需要分辨湍流全部尺度的流动细节。湍流是多尺度的,最大尺度与最小尺度(即Kolmogorov尺度)相差非常悬殊。以一架大型飞机周围的流场为例,其计算区域至少要几十米的尺度,而最小尺度涡为亚毫米到微米的量级。如果实现该流场的直接数值模拟,网格的尺度为微米量级,网格需要覆盖几十米的区域,网格的总数将是一个天文数字,其模拟已超出了当前最强计算机的能力。以当前超级计算机的性能而言,只能实现飞行器局部流场的直接数值模拟。强劲的应用需求推动着计算机性能不断增长,无论超级计算机还是个人计算机,其CPU 的数目都不断增加,并行计算成为计算的主流。
并行计算机可分为共享存储式与分布存储式两类。共享存储计算机的多个CPU 共享内存资源,所有CPU 都有读写权限。当前的个人计算机(PC 机)就是共享内存式的。当前PC 机的CPU 通常有多个核心,例如4 核,8 核等。这些CPU 核心可以看成独立的CPU。这些CPU 共享PC 机的内存。共享存储系统程序编写比较容易,串行程序很容易改造成在共享存储系统上运行的并行程序。其主要原因就是由于存储空间是单一的,数据结构与串行系统相同,因而程序结构与算法无需太大改变。共享存储系统的不足之处在于其扩展性不强,CPU 规模难以做得很大。其主要原因是由于多个CPU 共享同一段内存,当CPU 数目增加后访存冲突就会很严重,此外访存带宽也会成为瓶颈,因而共享存储系统的CPU数目通常在百核以内。大规模并行系统通常采用分布存储,即机群(cluster) 构架。机群系统是由若干个独立的计算机(称为节点)通过高性能网络连接起来,节点内的CPU 只能访问本节点的内存,这样可以避免访存冲突与内存带宽瓶颈,可实现成千上万节点的高可扩展性。机群系统是当今超级计算机的主流构架,其可扩展性几乎是没有止境的。20 世纪末,中国科学院数学与系统科学研究院的张林波研究员建立了我国的第一个机群系统。该系统通过百兆以太网将32 台PC 机组成了一个局域网,并安装了Linux 系统及MPI 等并行软件。2000 年笔者在清华大学力学系做博士后,期间也搭建了一套每秒百亿次的PC 机群系统。
笔者20 余年来见证了我国并行计算机的飞速发展。1997 年笔者在中国科学院力学研究所做博士生,当时使用的是中国科学院计算中心的Power Challenge 并行机,它的性能约每秒十亿次(浮点运算),2000 年笔者使用的PC 机群的性能为每秒百亿次。随后使用过千亿次的神威1 号,万亿次的深腾6800,十万亿次的曙光4000,百万亿次的深腾7000,千万亿次的天河1 号,亿亿次的天河2 号以及十亿亿次级的神威·太湖之光。20 余年间,我国超级计算机的性能提升了一亿倍。天河1 号、天河2 号和神威·太湖之光都曾排名世界第一,展示了我国在超级计算领域的实力。当前,排名世界第一的机器是日本的“富岳”,其性能为400P 左右[1],即每秒40 亿亿次,而E 级计算机(百亿亿次计算机)也将很快面世。
1 异构并行计算
异构并行是当前超级计算机的发展趋势,排名前列的超级计算机大多采用异构体系。所谓“异构”就是采用CPU 以外的加速部件来辅助计算,提升计算性能。当前最常用的加速部件是GPU,也就是常说的显卡。GPU 的计算性能非常强,浮点计算性能远远超过CPU,这主要是因为GPU 要快速处理图像,每秒钟实现数十上百帧图像的计算,每帧图像有上百万像素,必须有强大的计算能力,才能处理如此巨大的运算量。GPU 内的处理器数目非常多,目前的高端显卡通常有数千甚至上万个流处理器。例如NVIDA RTX2080Ti 显卡里面流处理器的数目为4352 个,而最新推出的NVIDA RTX3090 显卡里面的流处理器数目达到了10 496 个。每一个流处理器相当于一个小CPU,这些小CPU 协同工作,以提供强大的计算性能。天河1 号就是使用GPU 作为加速器的。除了GPU,还有其他类型的加速芯片,例如英特尔的MIC 加速卡,一块MIC 卡里有61 个处理器,这些处理器与英特尔CPU 执行相同的指令集,只是主频略低些。天河2 号就是使用MIC 卡来加速的。另外,还有片内众核系统,将加速部件放到CPU内部。片内众核系统的典型例子是神威·太湖之光,其CPU 称为“申威”,每个CPU 内有4 个核组,每个核组包含1 个主核及64 个从核。每个CPU 内包含了260 个CPU 核心(4 主核,256 从核)。可以看出,异构并行是依靠处理器数目的优势以实现强大的计算性能。
2 并行程序设计
超级计算机包含了大量的处理器,必须采用并行程序才能发挥其性能优势。不同硬件体系对编程的要求是不同的。共享存储系统编程相对简单,推荐大家使用OpenMP 程序设计。OpenMP 是一个多线程编程工具,嵌入到原编程语言中,对原始程序改动非常小。OpenMP 常用的并行编程方式是在原有程序的循环体前添加类似编译指示符的语句,指示编译器将紧邻的循环体切割成多个线程并发执行。由于共享存储系统内存中的数据所有处理器都能访问,因而不需为了并行化而改变数据结构,程序移植非常便捷。当然,受共享存储系统的扩展性限制,计算难以扩展到很大规模。
大规模并行通常采用分布式存储系统。对于分布式存储系统,推荐采用MPI 并行编程方式。消息传递接口(message passing interface, MPI)是当前应用最为广泛的并行编程工具。MPI 既可在分布式存储系统上运行,也可以在共享存储系统上运行。MPI是一个并行函数库,可以嵌入到C, Fortran 等编程语言中。MPI 程序的运行机制是:前端机将MPI 程序编译成可执行代码后,将代码拷贝N份,由N个进程执行,通常每个CPU(或节点) 运行一个进程。虽然各进程运行的代码相同,但是其计算的任务是不同的。因为MPI 程序设计时,通常先要调用MPI库函数得到本进程的ID 号,然后通过程序设计安排不同ID 号的进程做不同的工作。每个MPI 进程有自己独立的内存空间,各进程只能访问自己的内存。如果需要其他进程的数据,可以调用MPI 的通信函数(MPI SEND,MPIRECV 等),以进程间通信的形式实现。
总之,通过大量CPU 并行的超级计算是当今高性能计算机及数值计算技术发展的趋势。关注及学习并行计算技术是十分必要的。关于并行编程方面的内容可以参考笔者在中国科学院大学讲授《计算流体力学》的第14 和15 讲,课件和录像可从笔者网盘下载[2]。此外,推荐“超算习堂” 网站[3], 该网站内有大量并行程序设计的课程及资料。