如何在FPGA上为DNN使用FixedPoint16?卷积层定点累加精度维护
卷积通道累加的格式推导与精度维持方案
1. 累加范围与所需定点格式推导
先明确基础量化特性:
- 输入为Q1.15(范围[0,1)),权重为Q1.15(范围[-0.5,0.5)),单通道乘积为Q2.30,数值范围为**(-0.5, 0.5)**
- 对N个通道(64/128/256/512)累加后,整体数值范围为**(-N×0.5, N×0.5)**
对应不同N的具体范围:
- N=64:(-32, 32)
- N=128:(-64, 64)
- N=256:(-128, 128)
- N=512:(-256, 256)
要容纳该范围,累加器的整数位宽度需满足:补码下,整数位k需覆盖±(N×0.5),即2^(k-1) ≥ N×0.5。据此推导累加器格式:
- N=64:32=2^5 → k=6,累加器格式为Q6.30(整数位6,小数位30,范围-64~63)
- N=128:64=2^6 → k=7,格式为Q7.30(范围-128~127)
- N=256:128=2^7 → k=8,格式为Q8.30(范围-256~255)
- N=512:256=2^8 → k=9,格式为Q9.30(范围-512~511)
小数位保留乘积的30位,全程不截断,避免中间精度损失。
2. 累加过程的精度维持策略
全精度累加(优先方案)
在FPGA中直接用宽位宽寄存器实现累加器(如N=512时用39位寄存器),全程保留30位小数,直到所有通道累加完成后再做格式转换。这种方式无中间精度损失,且64512通道对应的累加器位宽(3639位)在FPGA中资源占用完全可控,无需额外复杂逻辑。
溢出保护
尽管理论范围已明确,硬件中仍需加入溢出饱和逻辑:当累加值超出当前格式的上下限时,直接钳位到格式的最大值/最小值。这在CNN中对模型精度影响极小,相当于硬限幅激活,可避免溢出导致的错误结果。
自适应移位(资源敏感场景可选)
若对资源占用有严格要求,可加入范围检测逻辑:每累加若干次后判断当前累加值的实际范围,若远未达到格式上限,可适当右移累加器(降低整数位,保留小数位)以减少位宽。但此方法需额外控制逻辑,仅在资源紧张时考虑。
3. 累加完成后的格式转换
累加完成后,需将宽位宽结果转换为适合后续处理的格式(如Q1.15),步骤如下:
- 范围映射:以N=512为例,Q9.30的累加范围是(-256,256),若要转换为Q1.15(范围(-1,1)),需将累加值乘以2^-8(即右移8位),得到Q1.30格式的数。
- 小数位截断/舍入:将Q1.30右移15位得到Q1.15,此时可采用银行家舍入(四舍六入五成双)代替简单截断,降低量化误差。
- 灵活适配后续层:若后续层支持更高精度,可保留更多小数位(如Q9.15),避免不必要的精度损失。
4. FPGA硬件实现要点
- 累加器资源利用:优先使用FPGA的DSP块实现累加(如Xilinx DSP48、Intel DSP Blocks),这类硬件原生支持宽位宽累加,效率远高于通用寄存器级联。
- 参数化设计:将通道数、累加器位宽设为可配置参数(如Verilog的
parameter),让加速器适配64/128/256/512等不同通道数场景。 - 舍入逻辑实现:用简单的组合逻辑实现银行家舍入,避免引入额外时序延迟。
内容的提问来源于stack exchange,提问作者Mohsin
相关产品推荐
相关产品推荐

