阅读 209

FPGA是伪通用加速器?或许只是抽象层走偏了路线

PGA 究竟是什么?

我觉得体系架构社区对此也没有一个公认的定义。先举三个备选答案来看看:

定义 1:FPGA 就是一组可以用来连接成任意电路图的晶体管。

可以把它看作是一块纳米级的电路板。你可以在一块 FPGA 上做出各种各样的芯片设计来,用不着每次去流片——但代价就是严重的效率损失。

我不喜欢这个定义。它既不严谨,也没有反映出 FPGA 的实际用法。

之所以说这个定义不严谨,是因为我们并不是在 FPGA 上连接电路——实际上它是一个由路由网络连接的 2D 网格查找表,其中包含一些额外的算术单元和存储器。FPGA 能很好地伪装成各种各样的电路,但伪装终究还是伪装,它本质上和电路仿真软件的模拟是一样的。

简单的比喻是行不通的,因为它过分简化了 FPGA 的实际用法。下面两个定义能更好地解释 FPGA 的用途。

定义 2:FPGA 是定制芯片的一种廉价的替代方案,适合用来设计原型芯片或小批量生产。

如果你正在构建一个路由器,你不需要花大价钱做一个全新的芯片,只要买个现成的 FPGA,然后把你需要的功能编程进去就行了。或者如果你正在设计新的 CPU,你可以用 FPGA 来做原型设计:去工厂流片以前你可以用这个芯片原型构建一个可引导的真实系统,用来测试或演示酷炫的功能。

电路仿真是 FPGA 的经典主流用例,也是 FPGA 最初诞生的原因。FPGA 的目的是将硬件设计的 HDL 代码用廉价的硬件实现出来,做出和最终生产出来的 ASIC 一样的效果。当然,你不可能在 FPGA 和真正的流片设计上套用完全相同的 Verilog 代码,但起码它们在抽象层面是一致的。

定义 3:FPGA 是一种伪通用计算加速器。

就像 GPGPU 一样,FPGA 很适合执行专用计算任务。对 FPGA 编程比对 CPU 编程更难,但是对某些特定计算任务来说这种代价是可以接受的:一个优秀的 FPGA 实现可以在某些任务中提供比 CPU 高出几个数量级的性能和功耗表现。

注:GPGPU,图形处理单元上的通用计算(英语:General-purpose computing on graphics processing units,简称 GPGPU 或 GP²U),是利用处理图形任务的图形处理器来计算原本由中央处理器处理的通用计算任务。这些通用计算任务通常与图形处理没有任何关系。

相比电路仿真,计算加速是 FPGA 领域的新兴使用场景。微软最近在搜索(https://www.microsoft.com/en-us/research/project/project-catapult/)和深度神经网络领域(https://www.microsoft.com/en-us/research/project/project-brainwave/)的成就背后就有 FPGA 的功劳。而且关键在于,专用计算场景不涉及芯片设计模拟的问题:人们为 FPGA 加速器写的 Verilog 代码不需要和定制流片的芯片代码长得一样。

这两个用例在编程、编译器和抽象等层面有很大区别。本文主要讨论第二种用例,我将其称为计算用 FPGA 编程。我的论点是,当前的计算用 FPGA 编程方法借鉴了传统的电路仿真编程模型,这种思路是不对的。如果你想设计一个 ASIC 原型,那么用 Verilog 和 VHDL 就没错;但如果你要专门做计算,那么就应该重新思考整个技术栈了。

GPU 和 FPGA 的类比

简单直接地讲,FPGA 就是一种特殊的,可以实现一种电路设计的硬件,用于高效地运行一类特殊的程序。一组 FPGA 配置是一种很酷炫的程序,但终究还是软件而非硬件——它是为一种奇怪的 ISA 编写的程序。

GPU 和 FPGA 很相似。在深度学习和数字货币兴起之前,GPU 仅仅是用来渲染图像的。在 21 世纪初(https://graphics.stanford.edu/papers/gpumatrixmult/gpumatrixmult.pdf),人们意识到 GPU 可以用作许多与图形无关的计算密集型应用的加速器:那时 GPU 设计师已经构建了一种通用性很好的硬件,而 3D 渲染只是跑在 GPU 上的一种应用而已。

计算用 FPGA 的发展历史也是类似的。我们发现它不仅可以用来做电路仿真,还可以执行很多特定的计算模式。类比来说:

图像相对于 GPU 的关系 = 电路仿真相对于 FPGA 的关系

在 GPU 发展为如今应用广泛的数据并行加速器的过程中,人们不得不重新定义向 GPU 输入的事物概念。我们曾认为输入 GPU 的就是特殊的、非常领域特定化的视觉效果描述信息,最后我们意识到 GPU 执行的就是程序,这种观念的变革也释放了 GPU 的真正潜力。这种实现使 GPU 可以执行的任务类型从单一领域发展到了整个计算域。我认为计算用 FPGA 也在经历类似的变革:

GPU——大规模规律数据并行计算;FPGA——具有静态结构的不规律数据并行计算

业界还没有对 FPGA 应该擅长的基本计算模式给出一个简洁的定义。但它擅长的计算与潜在的不规则并行性、数据复用和静态为主的数据流有很大关联。与 GPU 一样,FPGA 需要一个体现这种计算模式的硬件抽象:

GPU——SIMT(单指令多线程硬件结构);FPGA——暂缺

这里缺少的是 FPGA 运行的软件在 ISA 层面上的抽象

RTL 并不是 ISA

用 Verilog 来设计计算用 FPGA 的问题在于,它在低级硬件抽象和高级编程抽象层面表现都不好。想象一下,如果 RTL 在这两方面都表现很出色意味着什么。

场景 1:Verilog 是一种符合人类直觉的高级编程模型,面向的是较底层的硬件抽象。

在这个思想实验中,计算用 FPGA 的 ISA 的抽象级别比 RTL 更低——前者涉及的是网表或比特流之类的东西,而 Verilog 是面向人类的,效率更高的高级编程模型。

就算是 RTL 专家可能也不认为 Verilog 是一种高效的主流 FPGA 开发方式。它不会推动可编程逻辑成为主流。对于经验丰富的硬件黑客来说 RTL 设计可能看起来很亲切,但它在生产力层面的缺陷是难以弥补的。

场景 2:Verilog 是 FPGA 硬件资源的底层抽象。

也就是说 Verilog 对 FPGA 而言就像是 CPU 中 ISA 的角色一样。直接对 FPGA 编程可能不容易,但它可以扮演好高级语言编译器的目标角色,因为它直接描述了硬件中发生的事情。而当你需要挖掘硬件最后一点潜力的时候还可以直接使用这个语言。

其实 Verilog 就是当今计算用 FPGA 事实上的 ISA。主流 FPGA 供应商的工具链将 Verilog 作为输入,而来自更高级语言的编译器将 Verilog 作为输出。这些供应商将比特流格式当作商业机密(http://www.megacz.com/thoughts/bitstream.secrecy.html),因此 Verilog 就是你能接触到的最底层抽象了。

Verilog 作为 ISA 的问题在于它和硬件的距离太远了。RTL 和 FPGA 硬件之间的抽象差异太大了:这种差异一般来说至少包括综合、技术映射和布局布线等内容——都是复杂、缓慢的流程。因此,在 FPGA 上用 RTL 编程的编译 / 编辑 / 运行周期都需要数小时乃至数天,更糟糕的是这种差异都没法预测:RTL 的变化如何影响硬件层面的性能和功耗表现?答案是模糊不清的。

一个好的 ISA 应该直接暴露底层硬件的未经修饰的真相。汇编语言的编程也不是很方便,但是汇编的编译速度非常快,并且可以产生可预测的结果。如果我们希望为高级抽象和编译器构建一个合适的,稳定的底层目标,RTL 并不能满足这个需求。

正确的抽象在哪里?

我不知道应该用哪种抽象取代计算用 FPGA 的 RTL。实际上,如果 FPGA 供应商依旧把底层硬件抽象和底层工具链当作机密,那么想要做出 Verilog 的替代品就很困难。想要解决这个问题可能还需要等待硬件进一步发展,就像 GPU 过去经历的那样:

GPU——发展成为 GPGPU;FPGA——发展成为?

如果想把计算用 FPGA 当作特定算法模式的加速器,那么当今的 FPGA 并不是这一目标的理想实现。FPGA 未来应该诞生一个全新的抽象层次结构;新的软件堆栈应该清除 FPGA 的电路仿真领域遗留问题,并淘汰掉它的 RTL 抽象。


©著作权归作者所有:来自51CTO博客作者mb5fdb0a1b25659的原创作品,如需转载,请注明出处,否则将追究法律责任


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐