2、硬件加速基础概念:并行计算、流水线设计、数据复用、DMA与带宽优化
各位同学,咱们今天聊点实在的。硬件加速这四个字,说白了就是让图像处理跑得更快。我在ISP领域摸爬滚打这些年,见过太多算法在软件上跑得飞起,一上硬件就卡成PPT。为什么?因为没搞懂这几个基础概念。
这一章,我把硬件加速的四个核心支柱掰开揉碎了讲。你把这四个点吃透了,后面看整个ISP Pipeline的硬件实现,就跟看自家后院一样清楚。
2.1 并行计算:把一件事拆成一百份
先问个问题:一张1920x1080的图,要做一个3x3的滤波。软件怎么干?一个像素一个像素算。硬件怎么干?同时算一百个像素。
这就是并行计算的核心思想——把数据拆开,同时处理。
并行度三层次:
- 像素级并行:一个时钟周期处理多个像素。比如我做过一个设计,一次处理16个像素,吞吐量直接翻16倍。
- 行级并行:多行数据同时处理。3x3滤波需要3行数据,那就同时读3行。
- 帧级并行:多帧流水。这个在视频处理里常见,但延迟会变大,看场景取舍。
我个人习惯,在设计初期先算一笔账:目标帧率是多少?像素时钟多快?需要的并行度是多少?举个例子,4K@60fps,像素时钟大概600MHz。如果你逻辑只能跑300MHz,那就得把并行度做到2。说白了,用面积换速度。
避坑指南:我曾经在一个项目里把并行度拉得太高,结果布线拥塞,时序反而过不了。并行不是越多越好,够用就行。一般建议留20%的余量。
2.2 流水线设计:让每个阶段都不闲着
并行解决的是“同时做多件事”,流水线解决的是“让每个环节一直干活”。
你想想看,ISP Pipeline里有多少个处理阶段?黑电平校正、去噪、白平衡、去马赛克、颜色校正、Gamma……如果每个阶段等上一个做完再开始,那延迟就爆炸了。
流水线的思路很简单:把一个大任务切成N个小阶段,每个阶段用寄存器隔开。这样,第一帧在做阶段A的时候,第二帧就可以做阶段B了。
| 阶段 | 时钟1 | 时钟2 | 时钟3 | 时钟4 |
|---|---|---|---|---|
| 阶段1:读数据 | 像素0 | 像素1 | 像素2 | 像素3 |
| 阶段2:计算 | - | 像素0 | 像素1 | 像素2 |
| 阶段3:写结果 | - | - | 像素0 | 像素1 |
看到没?从第三个时钟开始,每个时钟都能出一个结果。这就是流水线的威力——吞吐量翻倍,延迟只增加一个阶段的时间。
注意:流水线有个坑——数据依赖。如果阶段B需要阶段A的结果做判断,那就得插入气泡(空拍)。我在做自适应去噪的时候就被这个坑过,后来加了旁路逻辑才解决。
2.3 数据复用:少搬砖,多干活
硬件里最贵的是什么?不是逻辑门,是数据搬运。搬一次数据,功耗是算一次的几十倍。
数据复用的核心思想:把数据留在本地,反复使用。
拿3x3滤波举例。你算完像素(0,0),需要像素(0,1)、(0,2)、(1,0)、(1,1)、(1,2)、(2,0)、(2,1)、(2,2)。算下一个像素(0,1)的时候,其实(0,1)、(0,2)、(1,1)、(1,2)、(2,1)、(2,2)都已经在寄存器里了。你只需要新读(0,3)、(1,3)、(2,3)三个像素。
这就是滑动窗口的数据复用策略。
常见数据复用策略:
- 行缓冲(Line Buffer):存N行数据,用于垂直方向的复用。我一般用FPGA的BRAM实现,深度设成图像宽度。
- 窗口寄存器(Window Register):存当前窗口的所有像素,用于水平方向的复用。用寄存器实现,速度快。
- 帧缓冲(Frame Buffer):存整帧数据,用于跨帧处理。这个最贵,能不用就不用。
我记得有个项目,做3x3中值滤波。一开始没做数据复用,每算一个像素都从DDR读9个像素,带宽直接爆了。后来改成行缓冲+窗口寄存器,带宽降到原来的1/9。嗯,这个优化做得值。
2.4 DMA与带宽优化:别让数据等总线
前面讲了并行、流水线、数据复用,但所有这一切都依赖一个前提——数据能及时送到。
DMA(直接存储器访问)就是干这个的。它不需要CPU插手,直接在DDR和ISP模块之间搬数据。
带宽优化的几个要点,我列一下:
- 突发传输(Burst Transfer):一次读一整行,别一个像素一个像素读。DDR的突发长度一般是8或16,对齐好能省一半时间。
- 双缓冲(Double Buffering):一个缓冲区在算,另一个在加载。这样计算和搬运可以重叠。
- 数据对齐:地址对齐到64字节,DDR效率最高。不对齐的话,DDR控制器要读两次,性能直接腰斩。
- 带宽预算:设计前先算清楚。4K@60fps,每个像素2字节,总带宽就是3840x2160x60x2 ≈ 1GB/s。加上overhead,至少留1.5GB/s。
个人经验:我习惯在DMA控制器里加一个FIFO,深度设成256。这样即使ISP模块偶尔卡一下,DMA也能继续搬数据,不会丢帧。这个技巧救过我两次流片。
2.5 四个概念的关系
这四个概念不是孤立的。我画了一张图,帮你理清它们的关系。
你看这张图就明白了。并行计算是基础,流水线让计算不停顿,数据复用减少搬数据的开销,DMA保证搬数据的效率。四个加起来,才是完整的硬件加速方案。
血的教训:我曾经在一个项目里,并行度和流水线都做得很好,结果带宽没算够,DMA读数据的速度跟不上处理速度。最后只能降帧率。从那以后,我每个项目第一件事就是算带宽预算。
2.6 小结
这一章的内容,说白了就是四个字——别让硬件闲着。并行计算让多个计算单元同时干活,流水线让每个时钟都有活干,数据复用让数据多干几次活,DMA让搬数据不占CPU时间。
你把这些概念吃透了,后面看ISP Pipeline的每个模块,都会发现它们都在用这些技巧。去噪模块用并行和流水线,去马赛克模块用数据复用,整个Pipeline用DMA搬数据。嗯,就是这么回事。