一篇关于FPGA行业和HLS的文章

转一篇EE Journal (Electronics Engineering Journal,电子工程专辑) 主编Kevin Morris写的关于FPGA行业和HLS工具的文章的文章,里面也介绍了我们SLX FPGA的产品。该杂志是电子工程行业的权威媒体,是全球200多个国家/地区数十万工程师和技术专业人员的“必读杂志”。阅读英文原文可点击链接

一篇关于FPGA行业和HLS的文章

今天,“加速” (acceleration)已经成为了一个专有名词,用来指代通过专用硬件来对在传统的冯·诺依曼处理器(Von Neumann processor)上表现不佳的计算任务进行优化的处理方式。我们已经进入了一个由人工智能技术所驱动的“加速时代”,无数初创公司致力于开发新的芯片,使其架构可以用于对各种类型的计算密集型算法进行加速和并行化。可以想见,我们正身处一个异构计算的世界中,在这里,处理器和加速器在新一代应用程序中必须紧密合作。随着“加速”这个概念的普及和广义化,也许有一天它的含义会包含甚至取代我们当前的对于“”处理”的概念,这种异构的处理方法会成为一种新的“计算” (computing)”。

而在“加速”的赛道里,FPGA和SoC FPGA无疑位于最前沿和最中心的位置。因为每种算法都需要通过略微不同的专用硬件体系结构才能得到有效地执行,所以定制加速器芯片(如ASIC)必须做出重大妥协,才能起到某种程度的通用加速器的作用。从较高的层次上讲,这意味着系统设计人员将面临两种选择,要么选择异构系统,在系统中装载数量繁多的ASIC加速器芯片以处理各种类型问题,要么折衷选择一种单一芯片,来尽可能地处理多种类型算法。 FPGA的方案属于后者,因为FPGA提供了无限的可重配置逻辑,所以我们可以根据每一种算法设计相应的加速器,而唯一的妥协之处是加速器是通过可编程逻辑(programmable logic)而不是加固门(hardened gate)来实现。

然而,在FPGA加速的房间里,那头“看不见的大象”则是编程模型(programmingmodel)。在硬件中实现FPGA架构的算法通常需要硬件工程师具备特定的FPGA/HDL专业知识,并且需要大量时间进行编程。要知道,FPGA的编程需求比传统的软件编程模型的需求要大得多。其中,当前FPGA行业面临的最大挑战是如何建立起一套具有可行性的开发流程,从而可以让工程师使用类似于软件的方法来实现FPGA中算法,最后达到最佳的加速结果。

高层次综合(HLS)帮助从算法到FPGA的架构的实现,因此成为了填补专业知识不足和生产能力需求之间巨大差距的一项关键技术。 Xilinx和英特尔(两家最大的FPGA公司)都提供针对其FPGA系列的HLS流程。这些HLS工具有点像变魔术一样,它们将C/C++代码生成硬件设计语言(HDL)架构(例如寄存器传输级的Verilog),最后在FPGA中实现。

乍听之下,我们会高兴地想“太好了,问题解决了!”。只要把C / C ++转换成HDL,在FPGA硬件上运行,就可以直接把我们的软件算法在FPGA编译,然后实现FPGA加速,是这样吗?

可惜现实并不是那么美好。

事实证明,HLS工具只能处理非常有限数量的C和C ++代码。甚至可以说,它可以处理的代码是那么少,以至于我们想将常规软件引入HLS工具的成功几率几乎为零。虽然HLS工具可以处理C或C ++,但它们需要一些非常特定的编码样式(coding style)才能生成合理的硬件系统结构。实际情况是,大量的语言构造都是不可能综合(non-synthesizable)的, 所以说获得可综合的代码仅仅是一个开始。好在HLS能够针对任何特定算法生成各种架构,不过前提是得先让架构满足我们设计的约束条件,这就需要工具来提供指导了,同时还需要我们具备硬件设计知识。如果仅仅将一些可综合的C代码扔到HLS工具上得出一个解决方案,那最终效果肯定不能让人满意,甚至可能比最佳解决方案差上几个数量级。

基于上述原因,虽然HLS一开始被看作是一个允许软件设计者创建硬件的工具,然而现在则更像是硬件设计者可以运用的一种强大工具。硬件(和HLS)专家通过掌握HLS,C / C ++成为了高层次的替代性硬件描述语言,在设计中实现巨大的性能和效率提升。但这并不能解决我们在加速方面的根本问题,如何无需FPGA专家团队花费数月的工作前提下,充分发挥并利用FPGA加速的优势。

这就是Silexica的希望攻克的地方。

Silexica的SLX FPGA执行静态和动态代码分析,帮助我们能够对想要加速的C / C++代码进行深入洞察。SLX FPGA识别不可综合的C / C ++代码,检测不“支持硬件”的数据类型,还可在FPGA中加速的C / C ++代码中的并行性进行定位。除此之外,SLX FPGA可以对要用于HLS的代码进行自动或“指导”重构。最后,它可以对最终设计所需的HLS实用程序进行优化,优化的同时还会考虑性能目标和可用FPGA资源(例如DSP模块和存储器)。简而言之,SLX FPGA的角色就像是一个我们项目里的内部HLS / FPGA专家一样,将我们的算法从“软件”变为软件和基于FPGA的硬件加速器的组合。

实际情况很可能是,你的代码里在HLS里遇到了循环。这个循环(或嵌套循环,nested loop)含有一些算术运算,则通常有未展开循环和(或者)流水线循环会产生一些计算量巨大的操作,例如利用典型FPGA中的DSP资源进行内部的乘法累加(multiply-accumulate )。 FPGA可以具有数千个DSP模块,因此从理论上讲,可以在硬件中并行执行数千次循环迭代。至于并行化的数量和类型,则取决于FPGA中硬件的可用性以及循环结构中的数据依赖性。需要注意的是,因为一个迭代依赖于上一个迭代的结果,那么我们就无法并行地执行这个迭代。

除此之外,大多数算法的软件实现都是用标准数据类型编写的,很少考虑量化到最小单位所需的位宽(bit-widths)。当然这个问题在常规处理器上执行时不是那么重要,因为数据路径倾向于固定宽度,而算术处理单元都是针对这些特定宽度而设计的。但是,在定制FPGA硬件的世界中,我们可以通过尽可能减小位宽来获得巨大的收益,因为这可以在加速器架构中删除了大量的实际硬件。在将软件算法转移到基于FPGA的硬件加速器的过程中,大部分收益是由于量化(Quantizing)和并行化循环(parallelizing loops)技术所带来的。

从顺序代码到并行代码的转化,硬件优化的话题更像是一门可供欣赏的“艺术”,而不是可供应用的“科学”。尽管HLS可以极大地加快硬件体系结构的优化速度,但是它对设计人员的专业知识层面上的改变并不大,设计人员仅仅是从“ RTL设计专家”变为“具有HLS经验的硬件专家”。Silexica的 SLX FPGA的出现,虽然不会让我们完全摆脱对硬件专业知识的依赖,但它的确让我们看到了将硬件加速器优化的“艺术”变为“用数字来绘画”的巨大可能性。我们看到越来越多的计算密集型任务已经转移到具有FPGA加速器的异构计算环境中,团队会如何使用这一类的工具进行设计,又如何发挥出它的优势,我们将拭目以待。