1. 脉动阵列概述:从冯·诺依曼瓶颈到数据流架构
各位好,欢迎来到《脉动阵列设计进阶指南》的第一章。
说实话,我入行做芯片设计那会儿,脉动阵列还是个挺小众的概念。那时候大家更关心怎么把时钟频率跑高,怎么把门数压下来。直到后来我接手了一个视频处理的项目——数据量巨大,带宽死活不够用,我才真正意识到:计算架构的瓶颈,早就不在计算本身了。
1.1 冯·诺依曼瓶颈:你躲不开的墙
先聊聊冯·诺依曼架构。这个架构从1945年用到现在,核心思想很简单:指令和数据存在同一个存储器里,CPU一条一条取,一条一条算。
听起来挺合理的,对吧?但问题出在「取」这个动作上。
核心矛盾:处理器的运算速度增长远远快于存储器的访问速度。CPU空转等数据,这就是著名的「存储墙」问题。
我在一个4K视频实时处理项目里遇到过这种情况。算法已经优化到极致,逻辑门数也压到了最低,但系统帧率就是上不去。用示波器一抓总线——70%的时间都在等数据。处理器闲得发慌,存储器忙得冒烟,这就是典型的冯·诺依曼瓶颈。
为什么会这样?你想想看:
- 传统架构里,计算和存储是分离的
- 每次运算都要经过:取指→译码→取数→执行→写回
- 数据在总线上来回搬运,功耗高、延迟大
- 尤其是矩阵运算、卷积这类数据密集型任务,瓶颈尤其明显
注意:冯·诺依曼瓶颈不是「速度不够快」的问题,而是「架构不匹配」的问题。你换再快的处理器,只要数据还得一趟趟搬,瓶颈就在那里。
1.2 数据流架构:换个思路试试
既然「搬数据」是瓶颈,那能不能让数据自己流到计算单元里去?
这就是数据流架构的核心思想:数据驱动计算,而不是指令驱动计算。只要有数据到达,计算单元就自动执行;没有数据,就等着。
我个人习惯把这两种架构做个对比:
| 对比维度 | 冯·诺依曼架构 | 数据流架构 |
|---|---|---|
| 控制方式 | 指令流驱动 | 数据流驱动 |
| 存储方式 | 集中式存储 | 分布式存储 |
| 数据搬运 | 频繁总线传输 | 局部流水传递 |
| 并行粒度 | 指令级并行 | 数据级并行 |
| 典型瓶颈 | 存储墙 | 数据依赖 |
| 功耗效率 | 较低(搬运开销大) | 较高(局部化计算) |
数据流架构听起来很美好,但实际落地并不容易。我在一个早期的FPGA加速器项目里试过纯数据流设计——结果控制逻辑写了两千行,调试到崩溃。后来我才明白:纯数据流太灵活了,硬件资源扛不住。我们需要一种折中方案。
1.3 脉动阵列:一个优雅的折中
脉动阵列(Systolic Array)就是那个折中方案。它由H.T. Kung教授在1982年提出,名字来源于人体血液循环——数据像血液一样,在计算单元之间规律地「脉动」流动。
脉动阵列的核心特征:
- 规则化结构:由大量相同的处理单元(PE)组成阵列
- 局部互联:每个PE只和相邻的PE通信,没有全局总线
- 数据复用:数据在阵列中流动,每个数据被多个PE重复使用
- 流水化计算:所有PE同时工作,形成深度流水线
我的经验:脉动阵列最适合矩阵乘法、卷积、FIR滤波这类「规则计算」。不规则的控制流?别用它,那是通用处理器的活。
下面这张图展示了脉动阵列的基本结构。我特意画了一个4×4的二维阵列,数据从左侧和上方流入,结果从右侧和下方流出。
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年到现在,脉动阵列经历了几个阶段:
- 1980s - 理论奠基期:H.T. Kung提出概念,主要做矩阵运算加速
- 1990s - 专用芯片期:iWarp、Warp等专用处理器出现,但成本太高
- 2000s - FPGA复兴期:FPGA容量够了,大家开始在FPGA上实现脉动阵列
- 2010s - AI爆发期:Google TPU把脉动阵列推向主流,成为AI加速器的标配
- 2020s - 异构集成期:脉动阵列与RISC-V、存算一体等技术融合
我个人觉得,脉动阵列最妙的地方在于它的可扩展性。你可以在一个很小的FPGA里放一个4×4的阵列做原型验证,然后无缝扩展到256×256的ASIC实现。设计方法几乎是一样的,只是规模变了。
学习建议:刚开始接触脉动阵列,别急着看大阵列。先从1×4或4×4的小阵列入手,把数据流和控制逻辑搞清楚。我在教学时经常让学生用Verilog写一个4×4的矩阵乘法脉动阵列——做完这个,基本概念就通了。