1. 脉动阵列概述:从冯·诺依曼瓶颈到数据流架构

各位好,欢迎来到《脉动阵列设计进阶指南》的第一章。

说实话,我入行做芯片设计那会儿,脉动阵列还是个挺小众的概念。那时候大家更关心怎么把时钟频率跑高,怎么把门数压下来。直到后来我接手了一个视频处理的项目——数据量巨大,带宽死活不够用,我才真正意识到:计算架构的瓶颈,早就不在计算本身了。

1.1 冯·诺依曼瓶颈:你躲不开的墙

先聊聊冯·诺依曼架构。这个架构从1945年用到现在,核心思想很简单:指令和数据存在同一个存储器里,CPU一条一条取,一条一条算。

听起来挺合理的,对吧?但问题出在「取」这个动作上。

核心矛盾:处理器的运算速度增长远远快于存储器的访问速度。CPU空转等数据,这就是著名的「存储墙」问题。

我在一个4K视频实时处理项目里遇到过这种情况。算法已经优化到极致,逻辑门数也压到了最低,但系统帧率就是上不去。用示波器一抓总线——70%的时间都在等数据。处理器闲得发慌,存储器忙得冒烟,这就是典型的冯·诺依曼瓶颈。

为什么会这样?你想想看:

  • 传统架构里,计算和存储是分离的
  • 每次运算都要经过:取指→译码→取数→执行→写回
  • 数据在总线上来回搬运,功耗高、延迟大
  • 尤其是矩阵运算、卷积这类数据密集型任务,瓶颈尤其明显

注意:冯·诺依曼瓶颈不是「速度不够快」的问题,而是「架构不匹配」的问题。你换再快的处理器,只要数据还得一趟趟搬,瓶颈就在那里。

1.2 数据流架构:换个思路试试

既然「搬数据」是瓶颈,那能不能让数据自己流到计算单元里去?

这就是数据流架构的核心思想:数据驱动计算,而不是指令驱动计算。只要有数据到达,计算单元就自动执行;没有数据,就等着。

我个人习惯把这两种架构做个对比:

对比维度 冯·诺依曼架构 数据流架构
控制方式 指令流驱动 数据流驱动
存储方式 集中式存储 分布式存储
数据搬运 频繁总线传输 局部流水传递
并行粒度 指令级并行 数据级并行
典型瓶颈 存储墙 数据依赖
功耗效率 较低(搬运开销大) 较高(局部化计算)

数据流架构听起来很美好,但实际落地并不容易。我在一个早期的FPGA加速器项目里试过纯数据流设计——结果控制逻辑写了两千行,调试到崩溃。后来我才明白:纯数据流太灵活了,硬件资源扛不住。我们需要一种折中方案。

1.3 脉动阵列:一个优雅的折中

脉动阵列(Systolic Array)就是那个折中方案。它由H.T. Kung教授在1982年提出,名字来源于人体血液循环——数据像血液一样,在计算单元之间规律地「脉动」流动。

脉动阵列的核心特征:

  1. 规则化结构:由大量相同的处理单元(PE)组成阵列
  2. 局部互联:每个PE只和相邻的PE通信,没有全局总线
  3. 数据复用:数据在阵列中流动,每个数据被多个PE重复使用
  4. 流水化计算:所有PE同时工作,形成深度流水线

我的经验:脉动阵列最适合矩阵乘法、卷积、FIR滤波这类「规则计算」。不规则的控制流?别用它,那是通用处理器的活。

下面这张图展示了脉动阵列的基本结构。我特意画了一个4×4的二维阵列,数据从左侧和上方流入,结果从右侧和下方流出。

脉动阵列基本结构图 脉动阵列基本结构(4×4) 数据从左侧(输入)和上方(权重)流入阵列,每个PE执行乘加运算,结果向右和向下传递。 输入数据 权重 输出 PE₀₀ PE₀₁ PE₀₂ PE₀₃ PE₁₀ PE₁₁ PE₁₂ PE₁₃ PE₂₀ PE₂₁ PE₂₂ PE₂₃ PE₃₀ PE₃₁ PE₃₂ PE₃₃ 部分和输出 部分和输出 部分和输出 部分和输出

1.4 为什么我们需要脉动阵列?

你可能要问:现在GPU不是挺能算的吗?为什么还要搞脉动阵列?

嗯,这个问题我当年也问过导师。答案其实很直接:能效比。

GPU虽然算力强,但功耗也高得吓人。一个数据中心级的GPU,功耗轻松上300W。而脉动阵列在同样的算力下,功耗可以低一个数量级。为什么?

  • 数据局部性:数据只在相邻PE间传递,不需要全局总线
  • 规则化设计:所有PE结构相同,布局布线效率高
  • 高利用率:每个时钟周期所有PE都在工作,没有空转
  • 低控制开销:不需要复杂的调度和分支预测

关键数据:Google的TPU v1使用了256×256的脉动阵列,在INT8精度下达到92 TOPS算力,功耗仅75W。相比同算力的GPU,能效比提升了约3-5倍。

我在一个边缘AI芯片项目里也用了脉动阵列。当时客户要求:5W功耗内跑通MobileNet v2。用传统架构试了几版,功耗都压不下来。最后换成8×8的小型脉动阵列,配合数据复用策略,功耗降到了3.2W,帧率还提升了15%。

脉动阵列的典型应用场景:

应用领域 典型计算 阵列规模 关键优势
深度学习推理 矩阵乘法、卷积 64×64 ~ 256×256 高吞吐、低功耗
信号处理 FIR滤波、FFT 8×8 ~ 32×32 确定性延迟
科学计算 矩阵分解、求解器 16×16 ~ 128×128 高精度、可扩展
视频处理 运动估计、滤波 4×4 ~ 16×16 实时性、低延迟

避坑指南:我曾经在一个项目里把脉动阵列用在了不规则的数据处理上——结果PE利用率不到30%,大部分时间都在空转。脉动阵列不是万能药,它只适合数据流规则、计算模式固定的场景。如果你的算法有大量条件分支或稀疏数据,趁早换方案。

1.5 脉动阵列的演进脉络

从1982年到现在,脉动阵列经历了几个阶段:

  1. 1980s - 理论奠基期:H.T. Kung提出概念,主要做矩阵运算加速
  2. 1990s - 专用芯片期:iWarp、Warp等专用处理器出现,但成本太高
  3. 2000s - FPGA复兴期:FPGA容量够了,大家开始在FPGA上实现脉动阵列
  4. 2010s - AI爆发期:Google TPU把脉动阵列推向主流,成为AI加速器的标配
  5. 2020s - 异构集成期:脉动阵列与RISC-V、存算一体等技术融合

我个人觉得,脉动阵列最妙的地方在于它的可扩展性。你可以在一个很小的FPGA里放一个4×4的阵列做原型验证,然后无缝扩展到256×256的ASIC实现。设计方法几乎是一样的,只是规模变了。

学习建议:刚开始接触脉动阵列,别急着看大阵列。先从1×4或4×4的小阵列入手,把数据流和控制逻辑搞清楚。我在教学时经常让学生用Verilog写一个4×4的矩阵乘法脉动阵列——做完这个,基本概念就通了。