【精华文章系列】第七期:高性能计算:从入门到"放弃"
发表于2024-07-05 11:02:46

一、引子

今日在书房偶然翻出一本《MIC:高性能计算编程指南》。书上落满灰尘,就像Intel的Xeon Phi已经退出历史舞台一样。

Intel虽然不young,但确实too naïve. 按照长者的话说:真的要学习一个Nvidia是怎么把CUDA生态做到一家独大的。

不过,今天不聊Intel, 也不聊Nvidia。咱们聊聊高性能计算(High Performance Computing,HPC).

2014年,一心想做理论物理的我误打误撞进入了计算物理的领域。眼一闭一睁,十年过去了。这十年里,我的学习和工作都是围绕着高性能计算展开的。

这次咱也好为人师一回:用这篇文章讲讲HPC,主要是给想入坑的人推荐一些该领域还不错的资料。

二、高性能计算的罪与罚

提到高性能计算,很多人都望而生畏:这是个什么脏东西(划掉)?

其实高性能计算离我们不能说遥不可及吧,至少也是休戚相关。

就算你没听过天河一号、天河二号、太湖之光这些超级计算机(Super Computer),但你每天出门前基本都会瞅两眼手机里的天气预报吧。

1.jpg

神威太湖之光,2016年LINPACK实测性能93PFLOPS,TOP 500排名第一,称为世界上最快的计算机,直到2018年被美国Summit超越

你有没有发现,现在的天气预报可比20年前准了很多?(虽然这么说很暴露年龄)

20年前,不看天气预报后悔一个小时,看天气预报后悔一天,看天气预报主打的就是一个心理安慰。

0年后的今天,手机端推送的预报可以精确到小时甚至分钟级别,而且你别说,你还真别说,还挺准的。

为啥现在的天气预报无论在时效性还是在精确度上都可以吊打20年前呢?

最主要原因是现在的计算机的算力水平有了数量级上的提升,因此计算机可以在更短的时间内处理更多的数据。

当然天气预报程序的运行,肯定不是在咱们的笔记本或家庭台式机上,而是运行在十几甚至几十台服务器(server)组成的集群(cluster)或者工作站(workstation)上,有的甚至是要运行在算力更强大的超级计算机上。

这些铁疙瘩上跑的不止有天气预报的程序,还有材料模拟、电磁学仿真、生命科学应用等科学计算的软件。运行得到的结果被广泛应用于民生、交通、医疗等领域。当然还关乎很多研究僧的毕业大计。

那么进入高性能计算领域,需要具备哪些知识或者技能呢?(唉,别走,我不是卖课的)主要技能点主要有两个:计算数学/数值分析和并行计算。

三、计算数学

首先,就是计算数学。

因为高性能计算本质上是要是求解科学问题(所以从现在开始,咱们都是科学家了)。

一般来说,求解科学问题就是要解方程,比如:麦克斯韦方程、薛定谔方程(对,就是薛定谔猫的薛定谔)、N-S方程(韦神的研究方向)等等。

很多人知道韦神 但很多人不知道的是他的研究方向是N-S方程

但是想通过计算机来求解方程,这件事并不容易。

因为你面临的第一个问题就是:怎么让计算机认识数学中最简单的微分符号?

cke_44509.png

这个微分符号对人类来讲是简单的。但对计算机来说,那就是:你不认识我,我不认识你。

这其中根因在于:人类可以处理连续的问题,而计算机只能处理离散问题。

cke_42664.png

最简单粗暴的方法就是:根据微分的原初定义,在待求解点周围取几个点做差,然后除以点与点之间的距离。用这样的方式"表示"微分。

cke_48857.png

差分的简单逻辑

换句话说,在计算机里我们用计算机能理解的"除法"带代替了数学中的"微分"。这种算法有专门的术语——差分法(difference methods)。注:这其实也是个不严谨的说法,因为计算机其实连除法都没法"理解",计算机只能理解0和1。

所以,你看:我们把计算机不能处理的连续问题转化成了计算机可以处理的离散问题。这个过程叫做离散化(discretization)。

上面讲的差分方法可以看作是最简单的离散化方法。其他常用的离散化方法还有:有限元法,有限体积法等等。

这些数学方法的研究太深太专了,研究透了也没啥实际用处,基本属于计算数学理论派干的事儿,咱们知道算法流程,会用就行了。

离散化后,就会得到一个数值方程。这个方程一般有如下两种形式:

第一种形式:给定 𝐴 𝑏 求解 𝑥 : [当然,这里的 𝐴 是矩阵, 𝑏 𝑥 都是向量]

𝐴𝑥=𝑏

第二种形式: 给定矩阵 𝐴 ,求满足下述方程的特征值 𝜆 和对应的特征向量 𝑥

𝐴𝑥=𝜆𝑥

看到这两个方程,是不是有种“死去的记忆在突然攻击我”的感觉?

没错,第一个方程就是线性方程组,第二个方程就是本征值问题。这两类方程占据90%的HPC应用。

顺便说一句,给超级计算机排名用的Benchmark(基准测试)叫做HPL(High Performance Linpack).

简单来说,哪台超级计算机HPL跑得快,哪台计算机就更加介于牛A和牛C之间。

说明一点,这里的"快"不是时间短,而是浮点计算速度FLOPS的含义。

HPL的本质就是求解矩阵方程 𝐴𝑥=𝑏 .

𝐴𝑥=𝑏 的求解速度来对超算计算机进行排名,其在HPC领域的重要性就可见一斑了。[参考文献:https://www.netlib.org/benchmark/hpl/]

HPL中的 𝐴 是稠密矩阵。随着HPC的不断发展,人们逐渐发现:在不少HPC应用中,求解 𝐴𝑥=𝑏 ,矩阵𝐴往往不是稠密的,而是稀疏的(像程序猿的头发一样orz)

也就是说,矩阵 𝐴 里面充斥着大量零元素。基于此,人们又提出了一个新的Benchmark: HPCG(High Performance Conjugate Gradient). 在HPCG benchmark中,矩阵 𝐴 是稀疏的,这个Benckmark目前不给超算排名,但给超算排名做参考。[参考:https://www.hpcg-benchmark.org/]

当然,HPC只有数学肯定是玩不转的,还需要了解并行计算。

四、并行计算

并行计算的思想很好理解。

假如你是个包工头,你招募了一个工人帮你搬砖,效率肯定很低。

于是你就想扩张队伍,做大做强,招10个工人“一起”搬砖。

虽然速度不一定是一个人的10倍(注意这句话,后续的文章中会考),但必然效率能提升不少。

这里的“一起搬砖”,用计算机领域的术语就是:并行(Parallel)

在并行计算领域,如果只考虑CPU通用计算,并行可粗略划分成两类:进程级并行和线程级并行

3.jpg

所谓“进程级并行”就是很多进程(Process)在“一起”干活;

所谓“线程级并行”就是很多线程(Thread)在“一起”干活。

如果你没学过计算机,甚至不知道进程和线程的区别。没关系,牢记一点就足够了:进程之间是不共享内存的,线程之间是可以共享内存的。

也就是说,进程之间如果想进行数据交互,必须要进行通信(communication)。处理这种通信的标准/协议或者编程模型就叫做MPI(Message Passing Interface)。中文翻译:消息传递接口(翻译的太难听了)。

4.jpg

由于线程之间本身就共享内存,它们之间天然共享数据,因此没有通信的必要。但同样需要统一的标准或编程模型来处理,这种编程模型就叫做OpenMP(Open Multi-Processing)。这个就别翻译成中文了吧。

因此,MPI和OpenMP这两种并行方式分别又被称为:分布式内存并行(distributed memory parallelism)和共享内存式的并行(shared memory parallelism).

当然了,大量HPC应用采用的是混合式编程,即:MPI+OpenMP。毕竟杂交的往往是坠好的。

事实证明,这样效率往往最高。

总结起来,HPC领域的两大支柱:计算数学和并行计算。

讲到这里,好学的你肯定会问:有没有一些系统介绍计算数学和并行计算的书籍或者资料呢?

当然是有的。不然咱这10年的HPC不白干了?如下就是我的压箱底的资料库。

五、计算数学の资料推荐环节

如果对这线性代数的知识有所遗忘,推荐一本书:工程数学—线性代数 第七版(同济大学数学科学学院编)。简称《线性代数(同济版)》。

同济版的线性代数已经算是国内教材的天花板了。鉴于咱们一向有着“学不明白就赖教材写得烂”的习惯。

这里推荐一本更好的线性代数教材:《线性代数应该这样学》阿克斯勒 著,杜现昆 刘大艳 马晶 译 人民邮电出版社

6.jpg

《线性代数应该这样学》封面

上面两本书偏重概念,具体到算法层面。个人强烈推荐:华东师范大学潘建瑜老师的《矩阵计算讲义》

值得一提的是,潘老师非常慷慨地把这本书的PDF版公布了出来,大家可自行下载。

https://math.ecnu.edu.cn/~jypan/Teaching/MatrixComp/mc.pdfmath.ecnu.edu.cn/~jypan/Teaching/MatrixComp/mc.pdf

如果这本书啃透了,线性代数的算法就可以包打天下了。

当然,只知道计算矩阵还是不够的,还需要知道计算机是如何处理数值积分、插值问题、求解最小二乘法的。这些短小精悍的算法对理解HPC是非常有帮助的。

推荐《数值方法简明教程》 聂玉峰 王振海 著 高等教育出版社。推荐这本书的理由是我第一次接触数值计算看的就是这本书(毕竟人总是对第一次念念不忘)。

另外,如果大家能获取到资源的话,推荐北京大学彭良友教授的《计算物理学A》。不要被名字吓到,虽然这门课程叫做计算物理学,但里面的绝大部分篇幅都是在讲数值计算。因为毫不夸张地说:计算物理是推动了数值计算发展的中坚力量。

可惜的是彭老师似乎没有公开他的讲义(至少我没搜到)。所以大家只能八仙过海,各显神通了。

六、并行计算の资料推荐环节

MPI的书籍推荐:清华大学都志辉老师的《高性能计算之并行编程技术——MPI并行程序设计》。这本书堪称我MPI的入门教程——当年我靠着从北大图书馆借来的这本书写出了自己的第一个MPI程序。

中科院测量与地球物理研究所把这本书的PDF版发布到网上,就是不知道有没有征得作者都志辉老师的同意(超小声)

http://www.whigg.cas.cn/resource/superComputer/201010/P020101023579409136210.pdfwww.whigg.cas.cn/resource/superComputer/201010/P020101023579409136210.pdf

OpenMP就没啥书可以推荐了:因为当年在我写OpenMP程序的时候,我发现了一个宝藏网站,这个网站就是中科大超算中心。

在教用户写MPI和OpenMP程序这方面,中科大超算中心可谓遥遥领先。先放张截图感受下:

7.jpg

中科大超算中心官网

如果想甩开厚重的教材,看简单高效的材料并快速上手。中科大超算中心官网的MPI和OpenMP的培训材料值得拥有。

中科大超算中心MPI资料库:

MPIscc.ustc.edu.cn/2009/1014/c397a3324/page.htm

中科大超算中心OpenMP资料库:

中国科学技术大学超级计算中心scc.ustc.edu.cn/zlsc/cxyy/200910/t20091014_13081.html

话说回来,MPI和OpenMP不乏好的教材,这里推荐一本国内的和一本外国的。

国内的推荐:《并行计算导论》张林波,迟学斌,莫则尧,李若 著 清华大学出版社。

看封面就知道这本书有些年头儿了。这本书是从并行计算最基本的概念开始说起,真正做到了深入浅出。

BTW,大家可自行百度这本书的四位作者,都是中国高性能计算领域的巨佬。

8.jpg

《并行计算导论》封面

国外的推荐:《并行程序设计导论》[美] 帕切克 著,邓倩妮 等译 著 机械工业出版社。

这本书可以直接下载PDF版本,可谓业界良心。话不多说,上链接:

https://kaywu-images.oss-cn-beijing.aliyuncs.com/book/code/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%AF%BC%E8%AE%BA.pdfkaywu-images.oss-cn-beijing.aliyuncs.com/book/code/%E5%B9%B6%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%AF%BC%E8%AE%BA.pdf

七、推荐材料总结

增加这一Part是为了方便大家做伸手党,快速找到材料的。如果不需要的话可直接跳过本章节。

计算数学方面:

[1]. 《工程数学 线性代数》 第七版 同济大学数学系编. 高等教育出版社.

[2]. 《线性代数应该这样学》 阿克斯勒 著,杜现昆 刘大艳 马晶 译 人民邮电出版社

[3]. 《矩阵计算讲义》华东师范大学 潘建瑜. (未出版讲义)

[4]. 《数值方法简明教程》 聂玉峰 王振海 著 高等教育出版社

[5]. 《计算物理学A》 北京大学 彭良友(未出版讲义)

并行计算方面:

[1]. 《高级能计算并行编程技术--MPI并行程序设计》 都志辉 著 清华大学出版社.

[2]. 《并行计算导论》张林波,迟学斌,莫则尧,李若 著 清华大学出版社

[3]. 并行程序设计导论》[美] 帕切克 著,邓倩妮 等译 著 机械工业出版社

[4]. 中国科技大学超级计算中心资料:

MPIhttps://scc.ustc.edu.cn/2009/1014/c397a3324/page.htm

OpenMP: https://scc.ustc.edu.cn/zlsc/cxyy/200910/t20091014_13081.html

八、总结

我的主管说:HPC有门槛,但他给人培训HPC时发现:没接触过HPC的人学HPC是会上瘾的。

我对此的评价是:学HPC不仅会上瘾,还会上头。上完头后,还会秃头。

秃头不是我说的,是我这10年的HPC经验沉淀下来的锃亮的脑袋说的。

不开玩笑地说:我觉得任何一个现代程序员最好都学点HPC的知识。因为HPC里面的很多知识在其他领域都用得到,比如最火的AI。

AI里面的通信优化、计算/通信隐藏想法都是HPC玩儿剩下的。

当然说这话,很多做AI的同学可能要来骂我。毕竟谁也不想承认自己做的优化是别人玩儿剩下的。

没关系,你看看我写的博客和我推荐的书就知道我说的对不对了。如果你觉得我说的不对,欢迎来评论区讨论。

既然都看到这儿了,点个赞再走呗。

大家还想了解HPC的哪些内容,也可以在评论区聊聊。

本帖最后由 匿名用户2024/07/05 11:46:07 编辑

发表于2024/07/05