这里说的性能优化不是计算性能优化,比如脉动阵列的优化,而是如何使硬件设计在FPGA后端流程中时序尽量不违例。
FPGA的好处挺多的,可以芯片的价格也是美丽的。资源越多,价格越贵,而且还有不同资源配比,满足不同需要。
一般来说,FPGA中的关键资源包括:
- DSP(乘加单元),代表了绝对算力,也是有一段短暂的时间FPGA可以和GPU叫板的主要支持因素。
- BRAM(片上存储),代表了Cache大小,大到可以把模型整个都放上来,不过实际上只需要放下提前prefetch的数据即可,通过pipeline屏蔽DDR读取latency。
- FF(锁存器),代表了寄存器总量,一般不太会不够用吧。
- 布线资源,影响通用逻辑复杂程度。
- LUT(查找表),影响通用逻辑复杂程度。
那个时候,大家的工艺节点还差不多,Xilinx猛怼DSP,单个封装内3D堆几个die,加上FPGA工程师使用的倍频技巧,实际计算效率还能和GPU比一比。
后来,NVIDIA财大气粗,逐步垄断市场,算力每代大跃进。Xilinx起初还想以ACAP1——同时集成ARM、FPGA、CGRA的巨兽——反超。
但无奈ACAP还是难产,大部分时间停留在励志吃下5G、自动驾驶、人工智能等多个领域的PPT中。即使真的大规模量产,成本也是可以想象的没有竞争力。最终,做FPGA加速器的,还是老老实实回去做芯片了。
FPGA后端指的是Synthesize和Implementation,Implementation包括Remapping,Placing、Routing等。
相比芯片要傻瓜的多。通过XDC约束布局布线,更换策略,画pblock等方法降低违例TNS(Total Negative Slack)。
通过阅读STA报告,我们基本能定位有问题(比如fan out过高,WNS明显过小,拥塞等级过高)的地方,反过来修改设计,比如插入寄存器,对跨时钟的逻辑set_false_path,或者手动复制寄存器等等。
DSP一般被用来搭建计算密集型算子,元素积或者自然指数通常用LUT搭乘法器,根据频率调整合适的pipeline级数,前后插入寄存器提高时序。
控制跨die信号总量,跨die频率尽可能的低,前后加寄存器。
多阅读官方文档,熟悉底层器件特性,明白自己写的代码映射到什么样的硬件结构上,参考示例工程。
Garbage in, grabage out。
- [1] Versal