4. 系统架构概览:典型的CNN加速器架构与数据流

各位同学,今天我们聊聊CNN加速器的系统架构。说实话,这块内容是我个人觉得最“硬核”的部分之一。你想想看,一个卷积神经网络要在硬件上跑得快,核心就三件事:数据怎么搬、计算怎么排、存储怎么管。这三件事搞定了,加速器就成功了一大半。

我在做第一个CNN加速器项目时,犯过一个低级错误——光顾着优化计算单元,结果数据搬运成了瓶颈,整个系统性能直接腰斩。嗯,从那以后,我对数据流的理解就深刻多了。

4.1 三种经典数据流:行固定、输出固定、权重固定

CNN加速器的数据流,说白了就是决定“谁不动、谁在动”。我习惯把这个问题想成一个流水线工厂:

  • 行固定(Row-Stationary, RS):把输入特征图的一行数据固定在处理单元(PE)里,权重和部分和不断流动。这种方案对局部数据复用很友好,适合小卷积核。
  • 输出固定(Output-Stationary, OS):把输出特征图的一个像素固定在PE里,输入和权重不断流入。这种方案能减少部分和的累加次数,我比较推荐在层数较深的网络中使用。
  • 权重固定(Weight-Stationary, WS):把权重固定在PE里,输入和部分和流动。这种方案适合权重变化不频繁的场景,比如推理阶段。

核心观点:没有绝对最优的数据流,只有最适合当前网络结构的数据流。我在项目中遇到过,同一个加速器跑VGG和ResNet,最优数据流完全不同。

4.2 数据流对比表

数据流类型 固定元素 流动元素 主要优点 主要缺点
行固定(RS) 输入行 权重、部分和 局部数据复用好 控制逻辑复杂
输出固定(OS) 输出像素 输入、权重 减少累加次数 存储开销大
权重固定(WS) 权重 输入、部分和 权重复用率高 输入数据搬运频繁

个人经验:如果你做的是边缘端推理芯片,我建议优先考虑输出固定。为什么?因为边缘端带宽有限,输出固定能减少片外访存。我曾经在一个项目里,把数据流从行固定改成输出固定,带宽需求直接降了40%。

4.3 脉动阵列(Systolic Array)的概念

脉动阵列,这个名字听起来挺玄乎,其实原理很简单。你想象一下,一排排的PE像心跳一样,有节奏地传递数据。每个PE只做一件事:从左边拿数据,从上面拿数据,算完往右边和下面传。

为什么会叫“脉动”?因为数据像血液一样,在阵列里有规律地流动。我刚开始学的时候,总觉得这东西效率不高——每个PE只算一个乘加,多浪费啊。后来才明白,脉动阵列的精髓在于:用简单的控制逻辑,实现极高的数据吞吐

4.4 脉动阵列的工作流程

以权重固定为例,一个典型的脉动阵列工作流程如下:

  1. 权重预加载:先把卷积核的权重加载到每个PE的寄存器里。这一步通常在计算开始前完成。
  2. 输入数据注入:输入特征图的数据从左到右,逐列流入阵列。每个时钟周期,数据向右移动一个PE。
  3. 部分和累加:每个PE计算当前输入与权重的乘积,然后与从上个PE传来的部分和相加,结果向下传递。
  4. 结果收集:最后一行的PE输出最终的部分和,经过累加器得到完整的输出像素。

注意:脉动阵列对数据对齐要求很高。我曾经因为输入数据的padding没处理好,导致整个阵列的计算结果全部错位。嗯,那次debug花了我整整两天。

4.5 脉动阵列结构图

下面我用一张SVG图来展示一个4x4的脉动阵列结构。这张图我画了很多次,每次讲课时都会拿出来用。

4x4 脉动阵列结构图(权重固定) 输入数据 PE00 PE01 PE02 PE03 PE10 PE11 PE12 PE13 PE20 PE21 PE22 PE23 PE30 PE31 PE32 PE33 部分和输出 权重 输入数据流(水平) 部分和流(垂直) 权重(预加载到PE) 每个PE执行:psum_out = psum_in + input × weight 数据在每个时钟周期向右/向下移动一个PE

4.6 脉动阵列的优缺点

说实话,脉动阵列不是万能的。我总结一下它的优缺点:

  • 优点
    • 控制逻辑简单,每个PE几乎一样,设计起来很规整
    • 数据流规律,便于实现高吞吐
    • 扩展性好,想做大阵列直接复制就行
  • 缺点
    • 对不规则卷积(比如空洞卷积)支持不好
    • 阵列利用率受限于卷积核大小和输入尺寸
    • 数据加载有延迟,需要流水线填充

避坑指南:我曾经在一个项目里,为了追求高利用率,把脉动阵列做得很大(32x32)。结果发现,小卷积核(比如3x3)根本填不满阵列,利用率不到30%。后来我改成多个小阵列(8x8 x 4组),利用率直接翻倍。所以,阵列大小要根据实际卷积核来定。

4.7 三种数据流在脉动阵列中的实现

最后,我简单说一下三种数据流在脉动阵列里怎么落地:

数据流 PE内固定 水平方向 垂直方向 典型应用
行固定 输入行数据 权重 部分和 小卷积核、高精度
输出固定 输出部分和 输入数据 权重 深层网络、带宽受限
权重固定 权重 输入数据 部分和 推理芯片、权重稳定

嗯,以上就是系统架构概览的核心内容。数据流和脉动阵列是CNN加速器的基石,理解透了,后面讲存储层次和调度策略就轻松多了。我个人建议,初学者可以先从权重固定的脉动阵列入手,因为它的数据流最直观,也最容易上手。


公众号:蓝海资料掘金营,微信deep3321