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模块之间搬数据。

带宽优化的几个要点,我列一下:

  1. 突发传输(Burst Transfer):一次读一整行,别一个像素一个像素读。DDR的突发长度一般是8或16,对齐好能省一半时间。
  2. 双缓冲(Double Buffering):一个缓冲区在算,另一个在加载。这样计算和搬运可以重叠。
  3. 数据对齐:地址对齐到64字节,DDR效率最高。不对齐的话,DDR控制器要读两次,性能直接腰斩。
  4. 带宽预算:设计前先算清楚。4K@60fps,每个像素2字节,总带宽就是3840x2160x60x2 ≈ 1GB/s。加上overhead,至少留1.5GB/s。

个人经验:我习惯在DMA控制器里加一个FIFO,深度设成256。这样即使ISP模块偶尔卡一下,DMA也能继续搬数据,不会丢帧。这个技巧救过我两次流片。

2.5 四个概念的关系

这四个概念不是孤立的。我画了一张图,帮你理清它们的关系。

硬件加速四大核心概念关系图 硬件加速目标 高吞吐 · 低延迟 · 低功耗 并行计算 同时处理多个像素 流水线设计 阶段间寄存器隔离 数据复用 减少DDR访问次数 DMA与带宽 高效数据搬运 核心逻辑 并行计算提供基础吞吐 → 流水线让吞吐持续 → 数据复用降低带宽需求 → DMA保证数据供给 四个概念环环相扣,缺一不可 设计原则:先算带宽,再定并行度,然后搭流水线,最后优化数据复用 —— 来自一个被带宽坑过三次的工程师

你看这张图就明白了。并行计算是基础,流水线让计算不停顿,数据复用减少搬数据的开销,DMA保证搬数据的效率。四个加起来,才是完整的硬件加速方案。

血的教训:我曾经在一个项目里,并行度和流水线都做得很好,结果带宽没算够,DMA读数据的速度跟不上处理速度。最后只能降帧率。从那以后,我每个项目第一件事就是算带宽预算。

2.6 小结

这一章的内容,说白了就是四个字——别让硬件闲着。并行计算让多个计算单元同时干活,流水线让每个时钟都有活干,数据复用让数据多干几次活,DMA让搬数据不占CPU时间。

你把这些概念吃透了,后面看ISP Pipeline的每个模块,都会发现它们都在用这些技巧。去噪模块用并行和流水线,去马赛克模块用数据复用,整个Pipeline用DMA搬数据。嗯,就是这么回事。