近日,英特尔收购了Altera这一全球最大FPGA制造商之一,为此支付167亿美元,这也成了迄今为止英特尔最大手笔的一次收购。此外还有其他新闻表示,微软开始在自己的数据中心内使用FPGA,亚马逊也开始提供FPGA驱动的云服务。原本FPGA主要应用于电子工程领域,软件工程方面鲜少有人使用。这是否意味着FPGA已经开始迎来新的发展势头,成为CPU和GPU之外的另一个重要选择?
\\ \\FPGA到底是什么?
\\如果需要计算一些数据,最常用的方法是针对CPU或GPU这样基于指令的架构编写计算所需的软件。或者采取一种更麻烦的办法,专门针对特定的计算需求设计出一套专用电路,而非面向CPU和GPU这样的通用电路编写指令。
\\在设计出自己的电路后,还要设法实现所需设计,以便真正开始计算。此时可以考虑的一种方式,需要非常深厚的技术能力,你需要真正创建出能实现所需设计的电路(这种方式也叫做ASIC,即专用集成电路)。
\\但此时还有一种更简单的方法,这也是本文的重点:使用现场可编程门阵列(Field Programmable Gate Array,FPGA)这种可重构的集成电路来实现自己的电路设计。我们可以将FPGA配置为自己需要的任何电路(只要FPGA能够容纳下)。这与很多程序员已经熟悉的,基于CPU、GPU指令的硬件编程方式有着很大差异。基于指令的硬件是通过软件配置的,而FPGA是通过指定所需硬件电路配置的。
\\FPGA的优劣
\\为何要用FPGA来完成计算任务,而非选择更通用的CPU或GPU?这种方式与CPU和GPU的差异主要体现在下列几方面:
\\- 延迟:完成计算工作需要多久? → FPGA在这方面更胜一筹。\\t
- 连接性:可以连接哪些输入/输出,带宽如何? → FPGA可以直接连接至输入,提供非常高的带宽。\\t
- 工程成本:为了表达所需计算,需要付出多少精力? → FPGA的工程成本通常远高于基于指令的架构,那么选择这种方式,肯定是因为其他方面的优势值得这样做。\\t
- 能效:计算过程能耗如何? → 这往往是FPGA最大的优势,但FPGA是否真的能胜过CPU或GPU,这主要取决于具体应用。\
下文将深入探讨上述这几个差异。
\\低延迟
\\如果需要为喷气式战斗机的无人驾驶功能计算数据,或开发高频算法交易引擎,低延迟肯定是必须的,此时需要让输入数据和得出结果之间的等待时间尽可能短。这些领域中FPGA远远胜过CPU(或GPU,因为GPU也需要通过CPU进行通信)。
\\FPGA很容易可以实现1毫秒左右,甚至低于1毫秒的延迟,而就算表现最好的CPU,其延迟通常也在50毫秒左右。更重要的是,FPGA的延迟往往是确定的。能实现如此低的延迟,主要原因之一在于FPGA通常专用性更强:无需依赖通用操作系统,也无需通过通用总线(例如USB或PCIe)通信。
\\ \\连接性
\\我们可以借助FPGA将任何数据源,例如网络接口或传感器直接连接到芯片。而CPU和GPU的做法与此大为不同,它们必须通过标准化总线(如USB或PCIe)与数据源建立连接,并依赖操作系统向应用程序提供数据。与芯片直接连接可获得更高带宽(以及更低延迟)。
\\有些场合中,这样的高带宽是必不可少的,例如LOFAR和SKA这样的射电天文学应用程序。此类应用场景需要在现场部署大量专用传感器,并产生海量数据。但为了提高整个系统的可管理性,必须大幅减少传感器生成的数据量,随后传递给应用程序进行处理。因此荷兰射电天文研究所ASTRON设计了Uniboard²,这是一种包含四块FPGA芯片的基板,其每秒可处理的数据量甚至超过了位于阿姆斯特丹的互联网交换中心!
\\
\这些看似小巧的射电天线会生成海量数据。(图源:Svenlafe,en.wikipedia)
工程成本
\\在深入讨论能效问题前,先来看看FPGA一个最大的劣势:相比基于指令的架构(如CPU和GPU),它们的编程/配置工作实在是太难了!一般来说,这些硬件电路是通过硬件描述语言(Hardware Description Languages,HDL)描述的,如VHDL和Verilog,而软件则可通过各种编程语言,例如Java、C和Python编程而来。
\\从理论角度来看,硬件描述语言和编程语言都可用于表达任何计算(这两者都是图灵完备的),但工程方面的细节却存在极大差异。
\\该领域目前有一个新趋势:高级合成(High Level Synthesis,HLS),这是指使用诸如OpenCL或C++等常规编程语言为FPGA编程,借此也可实现更高级的抽象。然而就算使用此类编程语言,FPGA编程的困难程度依然要比为基于指令的系统编程高出一个数量级。
\\FPGA编程最困难的部分在于漫长的编译过程。例如在使用英特尔OpenCL编译器的情况下,典型的FPGA程序编译通常需要4-12小时,这是因为要进行繁琐的“布局和布线(Place-and-route)”操作,将我们需要的自定义电路映射到FPGA资源,同时确保以尽可能短的路径实现所需结果。这是一种非常复杂的优化问题,整个过程需要投入巨大的运算能力。虽然英特尔提供了一种仿真器,让我们可以用较短时间测试最终结果的正确性,但确定并优化性能的过程依然要经历冗长的编译过程。
\\
\FPGA编译过程为你的偷懒提供了一个好借口(图源:XKCD)。
能效
\\在对外交流中,英特尔始终将能效视作FPGA的一大显著优势。然而实际情况并不那么明显,浮点计算方面尤其如此。不过我们首先还是来看看FPGA在能效方面远远胜过CPU和GPU的应用场景。
\\FPGA的高能效主要体现在逻辑计算和固定精度计算领域(而非浮点计算领域)。在密码学货币(如比特币)挖矿方面,这一特点让FPGA呈现出巨大优势。时至今日,几乎每个人都已经习惯于通过FPGA挖矿了。
\\顺带一提,目前几乎所有人在挖矿时都会使用ASIC(专用集成电路),这就是一种针对某种具体应用专门设计的特殊集成电路。ASIC是一种能效更高的解决方案,但前期需要付出更多投资来设计芯片,同时芯片的产量必须足够大才能分摊高昂成本。接着还是继续说回FPGA吧。
\\ \\FPGA在能效方面的另一个优势在于,FPGA基板无需主机即可直接通电运行,它有自己的输入/输出,因此还可以在主机方面节约能耗和资金。这一点与GPU计算完全不同,GPU需要借助PCIe或NVLink与主机系统通信,因此必须装在主机中方能运行。(不过也有一个例外,NVidia Jetson无需主机即可运行,但这并不是什么高端GPU。)
\\浮点运算能效 —— FPGA vs GPU
\\诸如深度学习等很多高性能计算用例中,通常需要依赖浮点算法,这是GPU最擅长的领域之一。以前,FPGA浮点运算效能非常低,因为必须通过逻辑块组装浮点单元,这一过程会耗费大量资源。
\\一些新型FPGA,例如Arria 10和Stratix 10在FPGA构造中直接内置了浮点单元,浮点运算能力有了显著提升。额外增加的浮点运算单元是否可以改善FPGA的浮点计算能效?是否能比GPU能效更高?
\\那我们就用最先进的GPU和FPGA对比看看吧。目前市面上最先进的专业级GPU就是Tesla V100了,理论上最大运算速度可达15 TFLOPS(万亿次浮点运算/秒,一种衡量浮点运算能力的标准单位),该GPU功耗约250瓦特。而目前市面上最先进的FPGA应该是Nallatech 520C,其中搭载了Altera/英特尔联合研发的Statix 10芯片,该基板的理论最大运算速度为9.2 TFLOPS,功耗约为225瓦特。
\\如果从能效角度对比这两个设备,GPU的能效无疑更高,理论上可实现56 GFLOP/W(十亿次浮点运算/瓦特,这是一种衡量浮点运算能效的标准单位),而FPGA仅为40.9 GFLOP/W。因此如果你目前就需要购买新的浮点运算硬件设备,并且需要配合主机使用,GPU貌似会是更好的选择,至少从上述这种粗糙的对比中可以得出这样的结论。
\\然而两者的差距并不大,并且后续发布的新款FPGA,例如这块即将发布的基于Stratix 10的FPGA在浮点运算方面很可能会实现比Volta(译注:Tesla V100的开发代号)更高能效。更重要的是,上述对比涉及的两种产品本身也有本质差异,毕竟Tesla V100使用了12纳米制程,而Stratix 10使用了更古老的14纳米制程。
\\根据上述对比,如果需要能效更高的浮点运算设备,那么现阶段依然有必要继续坚持选择GPU,但这个对比并不能证明GPU在浮点运算方面能效始终更出色。浮点运算能效这场战役,目前的胜者是GPU,但不久的将来战果可能会有所变化。
\\ \\如果主机并非必须,那么就有必要对使用高端GPU的主机,和完全不使用主机的高端FPGA进行一下对比了。如果继续沿用上述对比中使用的数据,对于装备GPU的主机和不装备主机的FPGA,只有主机功耗为116.7瓦特(如果是多GPU主机,则为每颗GPU对应的主机功耗)时,两者的能效才能维持相同。通常,现代化主机的功耗介于50-250瓦特之间,这样看来FPGA的优势就比较大了。
\\综述和展望
\\FPGA在某些领域是必不可少的。例如军事领域的导弹导航系统中,使用FPGA主要是看中了低延迟的特性。射电天文学领域,FPGA的专用输入/输出是顺利处理海量数据的关键。在密码学货币挖矿应用中,高能效固定精度计算和逻辑计算也是FPGA的一大优势。
\\
\艺术家对在建的SKA射电天文望远镜的构想图(图源:SKA Organisation/Swinburne Astronomy Productions)
然而英特尔斥资167亿美元收购Altera可不仅仅是为了涉足这种利基市场,他们还有更远大的目标。据猜测,他们的目标在于高性能计算和云计算这两个市场(例如被用于亚马逊那样的数据中心)。
\\面向高性能计算的FPGA
\\依个人拙见,我觉得未来几年内,FPGA都不会在高性能计算市场引起太大轰动。就算FPGA在能效方面比GPU出色些,FPGA的软件开发依然要比GPU开发困难很多。HPC社区已经习惯于使用GPU,让大家从GPU改为使用FPGA明显需要更大的动力。着眼于更长远的未来,例如未来5年以上,届时FPGA也许可以提供足够大的收益和动力,而这可能恰恰就是英特尔所希望的。
\\面向云提供商的FPGA
\\云提供商也是个巨大的市场。在英特尔的愿景中,他们希望看到使用FPGA,或混合使用CPU和FPGA的云服务器。这种想法的目的在于将某些计算任务分摊给FPGA,并且/或者使用FPGA提供定制化的网络拓扑。
\\微软毫无疑问会与英特尔密切合作,他们正在实现使用FPGA的数据中心,并且已经搭建了包含100000块FPGA的网络。借此,微软的必应搜索引擎已经在性能和灵活性方面获得了巨大收益,现在一部分必应搜索的计算工作已经交由FPGA处理。亚马逊也在广受欢迎的EC2平台上提供了FPGA节点。这趋势是否会成为潮流?我们拭目以待吧。
\\展望
\\原本较为“小众”的FPGA能否成为主流?个人而言我很怀疑。我认为,FPGA如果要真正普遍起来,需要满足两个条件:
\\- 必须简化编程工作,尤其是缩短编译时间。\\t
- 执行浮点计算时,必须实现更高能效。\
英特尔正在努力解决这些问题,只不过摆在他们前方的障碍还有很多。
\\作者:Atze van der Ploeg,阅读英文原文:Why use an FPGA instead of a CPU or GPU?
\\感谢蔡芳芳对本文的审校。