可编程逻辑
(文章来源:infoq.com)
如果需要计算一些数据,最常用的方法是针对CPU或GPU这样基于指令的架构编写计算所需的软件。或者采取一种更麻烦的办法,专门针对特定的计算需求设计出一套专用电路,而非面向CPU和GPU这样的通用电路编写指令。在设计出自己的电路后,还要设法实现所需设计,以便真正开始计算。此时可以考虑的一种方式,需要非常深厚的技术能力,你需要真正创建出能实现所需设计的电路(这种方式也叫做ASIC,即专用集成电路)。
但此时还有一种更简单的方法,这也是本文的重点:使用现场可编程门阵列(Field Programmable Gate Array,FPGA)这种可重构的集成电路来实现自己的电路设计。我们可以将FPGA配置为自己需要的任何电路(只要FPGA能够容纳下)。这与很多程序员已经熟悉的,基于CPU、GPU指令的硬件编程方式有着很大差异。基于指令的硬件是通过软件配置的,而FPGA是通过指定所需硬件电路配置的。
为何要用FPGA来完成计算任务,而非选择更通用的CPU或GPU?这种方式与CPU和GPU的差异主要体现在下列几方面:延迟:完成计算工作需要多久? → FPGA在这方面更胜一筹。连接性:可以连接哪些输入/输出,带宽如何? → FPGA可以直接连接至输入,提供非常高的带宽。工程成本:为了表达所需计算,需要付出多少精力? → FPGA的工程成本通常远高于基于指令的架构,那么选择这种方式,肯定是因为其他方面的优势值得这样做。
能效:计算过程能耗如何? → 这往往是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芯片的基板,其每秒可处理的数据量甚至超过了位于阿姆斯特丹的互联网交换中心!
在深入讨论能效问题前,先来看看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资源,同时确保以尽可能短的路径实现所需结果。这是一种非常复杂的优化问题,整个过程需要投入巨大的运算能力。虽然英特尔提供了一种仿真器,让我们可以用较短时间测试最终结果的正确性,但确定并优化性能的过程依然要经历冗长的编译过程。
全部0条评论
快来发表一下你的评论吧 !