高层次综合:解锁FPGA广阔应用的最后一块拼图
2019-10-16
我们为什么需要高层次综合
高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++、SystemC等,通常有着较高的抽象度,并且往往不具有时钟或时序的概念。相比之下,诸如Verilog、VHDL、SystemVerilog等低层次语言,通常用来描述时钟周期精确(cycle-accurate)的寄存器传输级电路模型,这也是当前ASIC或FPGA设计最为普遍使用的电路建模和描述方法。
然而,HLS技术在近十年来获得了大量的关注和飞速的发展,尤其是在FPGA领域。纵观近年来各大FPGA学术会议,HLS一直是学术界和工业界研究最集中的领域之一。究其原因,主要有以下几点。
第一,使用更高的抽象层次对电路建模,是集成电路设计发展的必然选择。集成电路伴随摩尔定律发展至今,其复杂性已经逐渐超过人类可以手工管理的范畴。例如,苹果iPhone11内置的A13芯片,就有着约85亿支晶体管。
(图片来自Stephen Shankland/CNET)
然而,根据NEC 2004年发布的研究,一个拥有100万逻辑门的芯片设计通常需要编写30万行RTL代码。因此,完全使用RTL级的逻辑抽象设计当代芯片是不现实的,并将对设计、验证、集成等各个环节造成巨大的压力。
相比之下,使用诸如C、C++等高层语言对系统建模,可以将代码密度压缩7到10倍,这极大的缓解了设计复杂度。
第二,高层语言能促进IP重用的效率。传统的基于RTL的IP往往需要定义固定的架构和接口标准,在IP重用时需要花费大量时间进行系统互联和接口验证。相比之下,高层语言隐藏了这些要求,转而由HLS工具负责具体实现。
对于FPGA而言,现代FPGA里有着大量成熟的IP单元,如嵌入式存储器、算术运算单元、嵌入式处理器,以及最近逐渐兴起的AI加速器、片上网络系统等等。这些FPGA IP有着固定的功能和位置,因此可以被HLS工具充分利用,在提升IP重用效率的同时,简化综合算法、提高综合后电路的性能。
第三,HLS能帮助软件和算法工程师参与、甚至主导芯片或FPGA设计。这是由于HLS工具能封装和隐藏硬件的实现细节,从而使软件和工程师能专注于上层算法的实现。对于硬件工程师而言,HLS也能帮助他们进行快速的设计迭代,并专注于对性能、面积或功耗敏感的模块和子系统的优化设计。
FPGA高层次综合的前世今生
伴随集成电路的复杂性的飞速增长,芯片设计方法学也在不断演进。早在FPGA出现之前,人们就已经开始尝试摆脱依靠人工检视芯片版图的设计方法,转而探索使用高层语言对电路逻辑进行行为级描述,并通过自动化工具将电路模型转化为实际的电路设计。
在上世纪八九十年代,面向集成电路设计的HLS工具就已经是学术界研究的热点。这其中比较有代表性的工作,包括卡耐基梅隆大学的CMU-DA(design automation)工具,以及加拿大卡尔顿大学提出的force-directed调度算法等等。
从现在看来,这些工作为当前的电路综合算法打下了基础,并为后来HLS研究提供了很多宝贵的经验和借鉴。然而,这个阶段的HLS工作在成果转化方面十分失败,并未有效的转化成工业实践。一个最主要的原因,就在于“在错误的时间,遇上了对的人”。
当时正值摩尔定律蓬勃兴起的时期,集成电路设计正在经历史上最大的变革。在后端,自动布局布线已经逐渐成为主流;在前端,RTL综合也在逐渐兴起。传统电路设计工程师都纷纷开始采用基于RTL的电路建模方法,取代传统的基于原理图和版图的设计,并由此带来RTL综合工具的飞速发展。相比之下,这个阶段的HLS研究往往使用了特殊的编程语言,如CMU-DA采用的名为“ISPS”的语言,因此很难获得那些正在和RTL处于“蜜月期”的工程师们的青睐。
伴随着一段时间的沉寂,HLS在2000年之后再次开始获得学术界和工业界的关注,比较有名的工具包括Bluespec和AutoPilot等。主导这一变化的主要原因是,HLS工具开始将C/C++作为主要的目标语言,从而被很多不了解RTL的系统和算法工程师所逐渐接受。同时,HLS工具综合生成的结果也有了长足进步,在某些应用领域甚至可以和人工手写RTL近似的性能水平。
此外,FPGA的逐渐兴起也对HLS的发展起到了重要的助推作用。和ASIC设计不同,FPGA有着固定数量的片上逻辑资源。因此HLS工具不用过度纠结于ASIC设计中面积、性能和功耗的绝对优化,而只需要将设计合理的映射到FPGA的固定架构上即可。这样,HLS就成为了在FPGA上快速实现目标算法的绝佳方式。
时至今日,高层次综合技术取得了进一步的发展。大型FPGA公司都推出了各自的HLS工具,如赛灵思的Vivado HLS和英特尔的HLS编译器、OpenCL SDK等。在学术界也有诸多成果涌现,如多伦多大学的LegUp等等。
接下来,老石将以AutoPilot这个HLS工具为例,简单介绍高层次综合的主要工作原理。
高层次综合的主要工作原理
AutoESL公司的AutoPilot工具,可以说是HLS领域最为成功的学术成果转化案例。AutoPilot源自于UCLA丛京生教授主导的xPilot项目,从随后与当时负责该课题的博士生张志如(现任康奈尔大学副教授)一起创办了AutoESL公司,并在2011年被赛灵思收购,成为了之后的Vivado HLS。
AutoPilot的工作流程框图如下图所示。在前端,它使用了基于LLVM的编译器架构,能够处理可综合的ANSI C、C++,以及OSCI SystemC等语言编写的模型。这个名为llvm-gcc的前端编译器会将高层语言模型转换为中间表达式(IR),并进行一系列针对代码复杂度、冗余、并行性等方面的代码优化。然后再根据具体的硬件平台,综合生成RTL代码、验证与仿真环境,以及必须的时序和布局约束等。
AutoPilot的成功之处在于,它的HLS结果在某些应用领域完胜人工优化RTL取得的结果。例如,在一个无线MIMO系统中使用的Sphere解码器IP中,AutoPilot将4000行C代码算法成功综合到Virtex5 FPGA上,运行在225MHz,并取得了比赛灵思Sphere解码器IP更少的逻辑资源使用量,见下图。这个结果放在现在也令人十分震撼,它很好的证明了HLS有潜力取得比RTL IP更为出色的性能。
获取有关AutoPilot的更多技术细节和论文内容,请在老石谈芯公众号后台回复“HLS”或“高层次综合”。
高层次综合工具常用的优化方法
传统的处理器编译器设计通常只有一个主要目标,那就是尽量提升性能。相比之下,高层次综合工具需要统筹考虑各种电路设计的主要指标,如性能、功耗、面积等等,同时也要兼顾工具本身的性能,比如占用的资源和运行时间等。因此,在开发HLS工具时,要额外考虑和采用更多的优化方法,而这些优化方法也是当今学术界和工业界在HLS领域重点研究的方向。总的来说,HLS工具的主流优化方法有以下几种。
01
字长分析和优化
FPGA的一个最主要特点就是可以使用任意字长的数据通路和运算。因此,FPGA的HLS工具不需要拘泥于某种固定长度(如常见的32位或64位)的表达方式,而可以对设计进行全局或局部的字长优化,从而达到性能提升和面积缩减的双重效果。
然而,字长分析和优化需要HLS的使用者对待综合的算法和数据集有深入的了解,这也是限制这种优化方式广泛使用的主要因素之一。
02
循环优化
循环优化一直是HLS优化方法的研究重点和热点,因为这是将原本顺序执行的高层软件循环有效映射到并行执行的硬件架构的重点环节。
循环优化的最终目的,就是尽量将循环里两次相邻的操作以最小的时延实现,理想情况下,相邻的循环操作可以完全并行执行。然而,由于硬件资源的限制,以及更多的是因为循环间存在嵌套和依赖关系,很难将循环完全展开。如何优化各种循环,以实现最优的硬件结构,就成为了学术界和工业界最为关心的要点。
一个流行的循环优化方法,就是所谓的多面体模型,即Polyhedral Model。多面体模型的应用非常广泛,在HLS里主要被用来将循环语句以空间多面体表示(见下图),然后根据边界约束和依赖关系,通过几何操作进行语句调度,从而实现循环的变换。
关于多面体模型的细节,本文不再展开,有兴趣的读者可以在公众号后台回复“HLS”或“高层次综合”获取更多相关信息。需要指出的是,多面体模型在FPGA HLS里已经取得了相当的成功,很多研究均证明多面体模型可以帮助实现性能和面积的优化,同时也能帮助提升FPGA片上内存的使用效率。
03
对软件并行性的支持
C/C++与RTL相比,一个主要的区别是,前者编写的程序被设计用来在处理器上顺序执行,而后者可以通过直接例化多个运算单元,实现任务的并行处理。随着处理器对并行性的逐步支持,以及如GPU等非处理器芯片的兴起,C/C++开始逐渐引入对并行性的支持。例如,出现了pthreads和OpenMP等多线程并行编程方法,以及OpenCL等针对GPU等异构系统进行并行编程的C语言扩展。
因此作为HLS工具,势必要增加对这些软件并行性的支持。例如,LegUp就整合了度pthreads和OpenMP的支持,从而可以实现任务和数据层面的并行性。
获取有关LegUp的更多技术细节和论文内容,请在老石谈芯公众号后台回复“HLS”或“高层次综合”。
另外,Altera在被英特尔收购之前就已经推出了OpenCL SDK,可以将OpenCL进行高层次综合,并生成FPGA电路逻辑与CPU代码两部分,从而实现FPGA作为硬件加速模块的快速开发。
高层次综合的发展前景
HLS经过十数年的发展,虽然有诸如AutoPilot、OpenCL SDK等FPGA HLS商业化成功的案例出现,但距离其完全替代人工RTL建模还有很长的路要走。
比如,对于FPGA而言,内存瓶颈一直是制约系统性能的重要因素。除片上的各类BRAM之外,还有各类片外存储单元,如DDR、QDR,以及近年兴起的HBM等等。因此,有效利用片上和片外各类存储单元一直是HLS的研究热点。
此外,HLS的仿真和调试也需要进一步探索。一方面,需要形式化方法证明HLS生成的RTL代码与高层次代码等效;另一方面,当需要进行软硬件分别和协同仿真、调试时,HLS工具要提供相关的测试环境、用例、脚本、调试方法等。当硬件出现问题时,如何向上调试软件中的漏洞,也需要方法论的支持。
近年来,越来越多的研究开始专注于特定领域(domain specific)的编程语言和对应的HLS,比如在之前文章中介绍过的P4,就是针对网络数据包领域的高层编程语言。随着人工智能的发展,也出现了针对AI应用的Python HLS。通过使用特定领域的HLS,可以进一步对工具进行领域的针对性优化,也能大幅提升系统性能、减少面积和功耗。
结语
业界普遍认为,GPU之所以在人工智能时代取得了非凡成功,很大程度上得益于对软件和算法工程师友好的编程语言和环境。与之相比,FPGA虽然也在不断扩展自己的应用范围,并在性能和功耗上相比GPU有着明显优势,其编程模型还是以硬件工程师进行RTL开发为主。
老石认为,FPGA的高层次综合是业界发展的必然趋势。相信随着HLS领域的难题不断被攻破,使用高层语言对FPGA进行高效编程也必然会实现,而这也将最终成为FPGA更广泛应用的最后一块拼图。