聊聊高性能计算硬件

在美帝summit重回顶点之后,我们国内的超算厂商和单位也开始加足马力,完成下一次的超越。虽然之前无论是神威太湖之光还是天河2的算力都可以霸榜,但是一看功率就分分钟能气死桑伯格。但是今天不想聊这个,而是说一说未来高性能计算硬件上可以用到的技术展望。当然由于知识有限,只是简单的谈一谈实现计算功能的两大件:处理器+存储器。

处理器

处理器的发展到现在基本上可以分成4个阶段,一开始是洪荒之年,市场上还都是受制于摩尔定律的单核心处理器,那个时代是也是我们即使CPU架构本身变动很少可以靠voltage scaling来获得免费的馅饼,而这个时代也是程序员们的编程工具也是从面向机器设计的汇编语言慢慢的转向c/c++,java这样的更“人性”话的语言。直到千禧年之后,由于高频处理器面临一个两难的问题,频率还是散热(power complexity)?搞了很多年的摩尔定律开始失效了,硬件上开始从高频转向多核心,或者用更形象的话讲,是处理器变得更扁了。对称多处理器(SMP),NUMA等处理器架构开始出现,编程工具中加入了多线程部分(Pthread/Openmp)。但是一台机器中堆叠越多的处理器实际上边际效益是逐渐减小的,而且从可用性的角度考虑,一台机器是有可能出问题的,把所有的鸡蛋放在一个篮子里也不是一个明智的选择。(当然多核处理器也面临暗硅这样的问题) 而后我们进入了分布式系统的时代,其中比较有代表性的就是分布式的cluster集群,通过网络将许多主机连接起来,虽然会受限于通信成本,但是总体上还是一个比较好的原则,同时兼顾了性能和可用性,并且也推动了MPI标准的指定和MAP reduce框架的开发。而且我们换一种角度考虑的话,其实多核和分布式的时代的成果不是一个简单的淘汰的关系。我们并不会因为进入了分布式的时代就放弃了多核时代的所有,现在开发并行程序的时候,更多的是将多核时代的模型放到了单机上,分布式的编程模型则是多机器之前交互时候使用。这两者同时存在,但是各自代表的并行粒度是不一样的。近些年,随着机器学习,或者说人工智能市场比较大,我们进入了一个新的时代,异构计算的时代。在此之前我们用来计算的设备往往都是一个全能的多面手---通用处理器,但是有句话,叫啥都会,啥都不精。通用处理器很大的芯片面积放到了缓存和控制电路上,但是这两个部分是不提供算力的,通用处理器上真正用于计算芯片面积少的可怜。但是专门设计的异构处理器就不一样了,很大的芯片面积用到了计算上,甚至对于不同的计算目标,还可以单独设计电路,达到更好的计算效率。这就像现代社会的分工一样,专业的事还是要由专业的人来做效率才高。举个例子,这里我搜集了一个2014年的表格,其中记录了当年top 500超算的一些参数:

2014 rank Name Country Manufacture Accelerator Cores Rmax / TFlops
1 tianhe-2 china NUDT Xeon phi 3120k 33.8k
2 titan US cary NVIDIA k20x 560k 17.6k
3 Sequoia US IBM N.A 1572k 17.2k
4 k computer japen Fujitsu N.A 705k 10.5k
2012 rank Name Country Manufacture Accelerator Cores Rmax / TFlops
6 Jaguar US cray N.A 298k 1.9k

从2014年的表格中我们不难看出来,其实tianhe-2已经把其他在座的都轰成渣了。而且这一代超算我们用的还是intel x86 64 的cpu,所以还是很有比较的价值的(TOP 500表中基本上都是x86家庭成员,精简指令集系列还都是弟弟)。但是我想主要说明并不是这个国之重器,而是美帝2014年这个titan呢,实际上就是2012 rank中这个jaguar的加强版,换个马甲还就真让人刮目相看了。为啥,2012年的jaguar中并没有加速卡,但是加上了k20x这个计算卡之后,直接起飞(名次和功耗)。这也是加速卡这样的专业设备可以给超算机器带来的巨大优势。这里顺便说一句,如果我们追溯GPU的设计历史的话,GPU早期就是按照那个时候超算power PC /CELL机的思想构建的,所以后面又用在超算上算是一个历史的闭环?

主要的加速硬件有哪些呢?

GPU / GPGPU

GPU,也叫图形卡,早期的时候是用于图形处理的硬件。但是游戏玩家,或者说个人化的市场能带来的利润属实有限,而且即便是在GPU的本行,游戏开发中,由于软硬件编码不方便,实际上也影响了游戏的开发工作。所以NVIDIA开始搞了GPGPU这个概念,也就是一个General purpose的硬件,NVIDIA提供了硬件和开发工具。所以有的时候我们在说老黄坑钱的时候,不要总想着我们买的就是NVIDIA的卡,更多是其附带的计算能力和开发/运行服务。GPU往往是作为加速卡存在于超算中的,不想我们平时买来打游戏的卡,它们一般是不带显示输出接口的。这样的机器架构,一般情况下,也被称为HSA。

这样的异构系统会有哪些问题呢?其实问题的根本在于CPU和GPU的共处模式。GPU是作为协处理器接入的,和CPU之间的协同其实不是很密切,例如cuda框架中很多的host端调用的function call就是弄blocking的,这些将在介绍cuda的文章中细做解释。所以两者之间沟通是比较大的瓶颈,CPU-GPU之间的联系是PCIE,intel + NVIDIA走的一般是PCIe 3.0,带宽也就是8.0Gb/s,这是北桥的带宽,CPU到北桥可能更少。(现代CPU中已经包含了北桥,这里是逻辑上的表达) 尤其是GPU对内存做zero copy的时候,不仅要求内存足够大(不换页),也要求访问的速度不慢嘛。另外就是我们可以把GPU想象成一个小机器,麻雀虽小五脏俱全,但是也由于这样的高度集成化,我们很难升级或在一个GPU中加入更多的显存。比起基本上可以随意堆叠的host memory,显存其实还是相当有限的,尤其是在处理较大的问题时,多卡基本上是必须的。

intel XEON phi

xeon phi这个东西其实我也不是很了解。我对硬件开始感兴趣的时候,这货基本上快 end of life 了。我记得当时是一节无聊的大气统计方法课,我翻出之前买的并行计算珠玑,好像是叫这个名字,不知道为啥,除了编程珠玑之外,一般叫这个名字的书都是 s* 。但是这个书中多次提到的硬件xeon phi倒是给我留下了很深的印象。我们之前介绍的GPU,执行的是与CPU不通的指令,编码的时候也需要一个PTX做中间层来翻译到具体的硬件上去。但是xeon phi这个东西就不一样,她是x86 的(32多cores),也就是原则上我们可以直接在她上面直接cpu的代码。这带来了一个极大的便利,大大的降低了异构系统编程上的麻烦。很多时候甚至只需要改动部分代码,然后在编译参数中加入xMIC指定使用MIC设备(也就是XEON phi)就可以开心的运行了。但是intel想的很好,这个xeon phi确实不是很好用,首先不能将所有的硬件core跑满,否则会出现莫名bug。另外由于在除了超算领域的市场上基本上没有人注意这个产品,就像现在的台积电对于intel的制程又是一样,很多时候产品的进步也来源于订单的增加,以及随后带来的用户反馈(bug/使用体验/寿命)。

现在还可以比较方便的体验到这个硬件的地方,就是tianhe-2以及coursera上intel课程中实验机器了。淘宝上的xeon phi服务器租赁都是大坑。

FPGA

其实CPU可以理解为一些简单的门电路的集合,这个集合可能不大,但是集合中某些元素的数量可能不小。CPU设计中也经常需要改变各种方案,除了电路访问之外,我们也需要物理上的验证。要是每次搞电路验证都需要单独的设计生产一个芯片成本就太高了。(当然,您老人家要是可以搞nm尺度的3D打印就当我没说) 所以FPGA这个概念就出现了,其主要是用于电路验证。之前只是在书上看过相关的介绍以及我的好朋友兴仁搞过(说起来,我一开始就是从兴仁哪里听到的这个设配,感谢他),我基本上对于这个东西是一篇空白。去年回南京玩的时候,听一个学长说这个设备可以用来加速计算流体力学的模型,啥时候我也搞块用用再说吧。

ASIC

其指的主要是对于特定的场景单独设计的芯片,也可以称之为专用集成电路。其实我们日常生活中ASIC的影子还是比较多的,早期的图形卡,只能叫GPU而不能叫GPGPU的时候其实就是一种ASIC。一般情况下,ASIC由于只是完成特定的功能,所以无论是制造成本还是能耗都是比较低的。它的概念其实和FPGA是对偶的,FPGA是可编程的通用硬件,而ASIC则是面向特定场景的专用硬件。考虑成本的话,单个ASIC一般制造成本低,能耗低,但是设计成本比较高;但是FPGA则是制造成本和能耗高,但是设计成本被平摊了。一般情况下,对于少量的芯片需求的话FPGA应该就够用了。

ASIC在计算加速上比较有名的就是GOOGLE的TPU了,当时我也看了TPU的新闻。对于 TPU V1 来说,影响比较深的就是这个东西主要解决的痛点是机器学习中模型训练好了而后推断这个过程。我所接触的在地学这个领域搞机器学习的同学,他们的工作时间主要是模型设计,调参和模型训练。毕竟用途是科学研究(数据科学也是科学),但是在工业界中,真正的痛点是模型训练好了之后可以快速的推断。也就是运用训练完之后存储好的模型,计算输入的数据,最后得到结果。这个过程和训练是不一样的,其要求的是高响应速度。而且对于投放到各个公共场合或个人用途的设备中,先不说成本问题,你把一堆CPU/显卡放进去,你能踏实?那可是金砖啊。TPU是一个很好的解决方案,利用了ASIC能效比好,制造成本低的优点,应用范围很广。另外,GOOGLE反正是掏得起设计成本的。

存储器

其实这个部分和上面部分是离不开的,处理器和存储器就像鱼儿和水一样,相互之间是离不开的。这里就从最熟悉的CPU配套和GPU中使用的存储器聊起。
我们买显卡的时候,一般都会货比三家,尤其是对于刀法精湛的老黄家产品。基本上1000块到万元级,你有多少银子,就能买到对应的一张显卡。而在这些产品的比较中,一个指标就是显存类型。我们一般使用的GTX/RTX游戏卡,比专业卡除了阉割掉了双精度浮点计算单元外,比较大的差异就是显存类型。

GDDR

GDDR的老祖宗是DDR3,从GDDR3到GDDR6,已经有4代产品了。DDR前面加的这个G就是说明其是对显示有优化的。而且GDDR也继承了DDR内存的优良传统,在始终上升沿和下降沿采样,传输速率提高了两倍。但是实际上这样说还不是很严谨,因为从GDDR5开始,data rate实际上增加到了4倍。其中采用的技术应该是使用word clock取代上升沿下降沿采样(没了解过),所以严格来讲,这东西就不能叫啥GDDR5了。GDDR5之后显存又有多次的技术改进,在省电的同时,数据传输率也提高了很多。

HBM

全称既解释,High Bandwidth Memory。一般一个HBM是由4个HBM die堆叠形成,可以称作一个stack。stack和stack之间是独立的,也就是各自独立的地址空间。每个die独立的两个128bit的channel,4个die就有8个channel总共1024bit的位宽。诸君可以想想,我们现在电脑内存搞个双通道都可以在广告上吹一吹,在手机上甚至可以搞个大新闻,但是这个在HBM memory中都是渣渣的存在!

此外HBM的频率更是高于GDDR一倍,加上前面说的128Gb/s的带宽,直接把GDDR轰成渣有没有。当然我还没说HBM2更是变态的把stack中放了8个die,带宽x2. 我们也可以根据先前的描述,自然的联想到,这样设计的HBM,由于单stack中可以放这样多的die,所以内存的容量和封装的体积都会下降。

比较

总的来说,HBM比GDDR来说带宽高,封装小,省电,成本ok的情况下,我们要GDDR干啥?甚至我们要DDR干啥?

资本家可不是傻子,目前DDR5上马的消息也开始流行,说明这个东西肯定不是一无是处。GDDR相对于DDR有显著的缺点,首先是延迟高,对于CPU随机访问,延迟会非常重要;第二就是容量小,GDDR由于封装等问题,不能组成大容量的内存;第三就是成本问题,毕竟GDDR这东西word clock采样,时序会更复杂;最后就是CPU cache line的问题,后面的文章中会有解释。

HBM缺点倒比较少,主要是一分钱难倒英雄汉,它贵!

计算的未来

说了这么多,我觉得未来高性能计算应该上上述设备的有机组合。一般来讲,我们处理得任务是复杂得,在提取了并行性之后,我们会进行任务划分,机器中通用处理器的计算压力可以控制的比较小,主要是使用异构处理/协处理器/加速卡的模式进行。也即是对于单机上细粒度并行,我们考虑单节点的核心利用,可以使用共享内存的模式减少通信成本,将计算分配到加速卡中,通用处理器负责控制,这中间也需要加速卡厂商和CPU厂商指定响应的标准,使得加速卡的内存访问更灵活;跨节点间,我们可以使用消息传递的模式,尽可能的减小由于专业计算/加速卡中内存不足的问题。必要的时候可以根据经常需要的计算任务,使用ASIC/FPGA进行加速,进一步提高能效比。

存储器上,不难联想,本上计算机就是一个多层的存储架构。不同的存储器在不同的层级上工作,在latency,容量,成本上平衡。可以考虑在机器中引入组合内存,形成一个为高性能计算优化的内存层级结构。HBM在一种就是cache一般的存在,快,带宽高,少;DDR内存更多,居中;最后是傲腾内存,最慢但是量也最大。三种内存关系就像是CPU core中缓存的自然延申。可以设计一个优化的操作系统,根据任务的特性和运行时情况,特定的选择存储位置。例如我们在run 模式的时候,对于计算密集的变量,由于经常需要迭代改变其值,所以可以放在HBM这样高带宽的硬件中,但是对于准备写文件的file,就可以并发的放置在傲腾中,既保证了断电或意外情况写操作不丢失,同时I/O延迟不明显。或许,这就可以叫异构内存系统吧!

当然高性能计算的互联网络也是很大的一部分,但是我对这个部分了解有限,以后有时间可以调研下。🤣

高性能计算,no,no,no, 应该是高兴能计算!😃

posted @ 2020-03-18 15:40  gabriel_sun  阅读(944)  评论(0编辑  收藏  举报