如何能够实现通用FPGA问题?

在 fpga 广泛应用的今天,康奈尔大学计算机科学助理教授 adrian sampson 思考它是否走在正确的路上,如何能够实现通用 fpga 等问题。
计算 fpga
什么是 fpga?
我认为架构社区对这个概念没有一致的定义。我们来看三个可能的答案:
定义 1:fpga 是一堆晶体管,你可以把它们连接(wire up)起来做出任何你想要的电路。它就像一个纳米级面包板。使用 fpga 就像芯片流片,但是你只需要买这一张芯片就可以搭建不一样的设计,作为交换,你需要付出一些效率上的代价。
我不喜欢这个答案。因为它既没有从字面上解释清楚人们是如何使用 fpga 的,也不是一个贴切的比喻。
从字面上讲这种说法并不对,因为你并不需要重连(rewire)fpga,它实际上是一个通过路由网络(routing network)连接的查找表 2d 网格,以及一些算术单元和内存。fpga 可以模拟任意电路,但它们实际上只是在模仿,就像软件电路仿真器模拟电路一样。
这个答案不恰当的地方在于,它过分简化了人们实际使用 fpga 的方式。接下来的两个定义能更好地描述 fpga。
定义 2:在原型设计和小批量生产中,fpga 相当于定制芯片的廉价替代方案。如果你要搭建一个路由器,你可以提供现成的 fpga,并根据你需要的功能编程,从而避免流片的巨大成本。或者如果你要设计一个 cpu,你可以将 fpga 作为原型:你可以围绕它构建一个真正可引导的系统,在把设计的 cpu 送到晶圆厂之前,用来测试和演示。
电路模拟是 fpga 的经典主流用例,这也是 fpga 最早出现的原因。fpga 的关键在于硬件设计是用 hdl 形式编码的,而且买一些便宜的硬件就可以得到和 asic 相同的效果。当然,你不可能在 fpga 和真正的芯片上使用完全相同的 verilog 代码,但至少它们的抽象范围是一样的。
定义 3:fpga 是一种伪通用计算加速器,与 gpgpu(通用 gpu)类似,fpga 可以很好地卸载特定类型的计算。从编程角度上讲,fpga 比 cpu 更难,但从工作负载角度上讲 fpga 是值得的:和 cpu 基线相比,好的 fpga 实现可以提供数量级的性能和能量优势。
这是与 asic 原型设计不同的一个用例。和电路仿真不同,计算加速是 fpga 的新兴用例。这也是微软最近成功加速搜索和深度神经网络的原因。而且关键的是,计算实例并不依赖于 fpga 和真正 asic 之间的关系:开发人员针对基于 fpga 的加速编写的 verilog 代码不需要与用来流片的 verilog 代码有任何的相似性。
这两种实例在编程、编译器和抽象方面存在巨大差异。我比较关注后者,我将其称为「计算 fpga 编程」(computational fpga programming)。我的论点是,目前计算 fpga 的编程方法都借鉴了传统的电路仿真编程模型,这是不对的。如果你想开发 asic 原型的话,verilog 和 vhdl 都是正确的选择。但如果目标是计算的话,我们可以也应该重新思考整个堆栈。
gpu 和 fpga 的类比
让我们开门见山地说吧。fpga 是一类很特殊的硬件,它用来高效执行模拟电路描述的特殊软件。fpga 配置需要一些底层软件——它是为了 isa 编写的程序。
这里可以用 gpu 做类比。在深度学习和区块链盛行之前,有一段时间 gpu 是用来处理图形的。在 21 世纪初,人们意识到他们在处理没有图形数据的计算密集型任务时,也会大量使用 gpu 作为加速器:gpu 设计师们已经构建了更通用的机器,3d 渲染只是其中一个应用而已。
计算 fpga 遵循了相同的轨迹。我们的想法是要多多使用这一时兴的硬件,当然不是为了电路仿真,而是利用适合电路执行的计算模式。用类比的形式来看 gpu 和 fpga,则:
「gpu 之于图形」相当于「fpga 之于电路仿真」
为了让 gpu 发展成今天的数据并行加速器,人们不得不重新定义 gpu 输入的概念。我们过去常常认为 gpu 接受奇特的、强烈的、特定领域的视觉效果描述。我们实现了 gpu 执行程序,从而解锁了它们真正的潜力。这样的实现让 gpu 的目标从单个应用域发展为整个计算域。我认为计算 fpga 正处于类似的转变中:
「gpu 的海量、常规数据并行」相当于「fpga 具有静态结构的不规则并行性」
现在还没有针对 fpga 擅长的基本计算模式的简洁描述。但它和潜在的不规则并行性、数据重用以及大多数静态的数据流有关。和 gpu 一样,fpga 也需要能够体现这种计算模式的硬件抽象:
「gpu 的 simt isa」相当于「fpga 的 ____」
上式缺少的内容即,在 fpga 运行的软件上类似 isa 的抽象。
rtl 不是 isa
verilog 用于计算 fpga 的问题在于它在低级硬件抽象中效果不好,在高级编程抽象中的效果也不好。让我们通过反证法想象一下,如果用 rtl(寄存器传输级)取代这些角色会是什么样。
角色 1:verilog 是一种符合人体工程学、面向较低级抽象的高级编程模型。在我们的思想实验中,计算 fpga 的 isa 比 rtl 的抽象层次更低:例如网表(netlist)和比特流(bitstream)。而 verilog 是更高效也更高级的编程模型。
甚至 rtl 专家可能也无法相信 verilog 是可以高效开发主流 fpga 的方式。它不会把编程逻辑推向主流。对于经验丰富的硬件黑客来说,rtl 设计似乎是友好而熟悉的,但它与软件语言之间的生产力差距是不可估量的。
角色 2:verilog 是 fpga 硬件资源的低级抽象。也就是说,verilog 之于 fpga 就像 isa 之于 cpu。verilog 可能没那么方便编程,但对于高级语言编译器来说,它是一个很好的目标,因为它直接描述了硬件中在发生什么。如果你需要维持最后几个百分点性能的时候,它是最后的编程语言选择。
事实上,对现在的计算 fpga 来说,verilog 实际上就是 isa。主要的 fpga 供应商工具链会将 verilog 作为输入,而高级语言的编译器则将 verilog 作为输出。供应商一般会对比特流格式保密,因此 verilog 在抽象层次结构中会处于尽可能低的位置。
把 verilog 当做 isa 的问题是它和硬件之间的距离太远了。rtl 和 fpga 硬件之间的抽象差距是巨大的:从传统角度讲它至少要包含合成、技术映射以及布局布线——每一个都是复杂而缓慢的过程。因此,fpga 上 rtl 编程的编译/编辑/运行周期需要数小时或数天,更糟糕的是,这是一个无法预测的过程:工具链的深层堆栈可能会掩盖 rtl 中的改变,这可能会影响设计性能和能源特性。
好的 isa 应该直接展示底层硬件未经修饰的真实情况。像汇编语言一样,它其实不需要很方便编程。但也像汇编语言一样,它的编译速度需要非常快,而且结果可预测。如果想要构建更高级的抽象和编译器,就需要一个不会出现意外的低级目标。而 rtl 不是这样的目标。
正确的抽象?
我不知道应该用什么样的抽象取代 rtl 在计算 fpga 中的位置。实际上,只要 fpga 供应商一直保持底层抽象的保密性和子 rtl 工具链的专有性,那就不可能替换 verilog。或许只有等到硬件发展了才能找到这一问题的长期解决方案,就像 gpu 之前做过的一样:
「gpu 和 gpgpu」相当于「fpga 和 ____」
如果计算 fpga 是特定类算法模式的加速器,那当前的 fpga 并不能理想地实现这一目标。在这个游戏规则下能够击败 fpga 的新硬件类型,才可能带来全新的抽象层次结构。新的软件栈应该摒弃 fpga 在电路仿真方面的遗留问题,以及 rtl 抽象。


冲压机器人为什么可以如此的灵活
RF电路板设计PCB板布局布线的事项总结
5G时代已至 运营商探索未来生存之道
瑞士企业开发出一款可穿戴设备Horus—盲人的第二双“眼睛”
4G智能手机仍具备潜在市场消费需求
如何能够实现通用FPGA问题?
Lyft上市:为全球共享出行初创 “定价”
远程教育满足不同应用场景多样化需求
GPS、LBS、AGPS、WiFi、iBeacon定位的区别与优异
什么是MEMS传感器?mems传感器的组成和应用分类有哪些?
BP选用Actel低成本FPGA作为编程器核心控制
阿里巴巴与联发科技达成合作 联手打造支持蓝牙mesh技术的Smartmesh无线连接方案
蓝牙音频分享将为助听器用户生活带来什么变化
节能型摩托车整流稳压器
MF73大功率型热敏电阻
黑车和白车有什么区别?便民车务网为您解答
大神教会你阻抗匹配原理及负载阻抗匹配
微软:Windows VR眼镜系列即使很昂贵 也将会成为消费品
信号线电阻对电压降的影响
学习嵌入式技术需要注意很多!