权重驻留与数据复用:加速器设计的第一问题——让哪种数据不动
更新时间:2026-09-25。在 AI 加速器架构:脉动阵列、数据流与内存层级 一篇里我们看到,加速器能效的根源是「数据读一次、在片上反复用」。但那句话还藏着一个必须先回答的设计问题:阵列里有三种数据——权重、激活、部分和——每一种都可以复用,片上 SRAM 和 PE 寄存器的位置却只有那么多,到底让哪一种数据不动、让哪几种数据流动?这就是数据流(dataflow)策略要决定的事,也是一颗 NPU 在画第一版微架构时就要拍板的问题。本篇把 Weight Stationary、Output Stationary、Input Stationary、Row Stationary 四种经典策略摆在一起,算清各自复用什么、控制电路要付出什么代价。阵列的计算细胞与精度位宽细节见 MAC 单元与精度设计,片上存储与喂数网络见 SRAM、NoC 与数据供给。
本文要回答的问题
- 为什么说「让哪种数据不动」是加速器设计的第一问题?三种数据各自的复用机会从哪来?
- Weight Stationary(权重驻留)怎样工作?为什么它成为最经典、产品最多的策略?
- Output Stationary 让部分和驻留累加,省掉的是什么开销,代价又是什么?
- Input Stationary 和 Row Stationary(Eyeriss)分别在什么场景下更优?
- 数据流策略为什么不仅决定能效,还决定控制电路的面积与复杂度?
一、第一问题:三种数据,三种复用,只能先保一种
先把账算清楚。一个 GEMM 输出元素 C[i][j] = Σₖ A[i][k]·B[k][j],对应到神经网络:B 是权重(weight),A 是激活(activation,输入特征),逐次累加的中间值是部分和(partial sum)。在一个 N×N 阵列完成的一批计算里,三种数据各自存在复用机会:
- 权重复用:一个权重 B[k][j] 要与同一列的所有激活 A[0][k]…A[N−1][k] 相乘,被用 N 次;
- 激活复用:一个激活 A[i][k] 要与同一行的所有权重 B[k][0]…B[k][N−1] 相乘,也被用 N 次;
- 部分和累加:每个输出由 N 个乘积相加而成,累加发生在本地寄存器里几乎免费,一旦要把部分和搬出阵列、写进 SRAM 再读回来继续加,就要付两次昂贵的访存。
卷积层还多出两类结构性复用:卷积核在整张特征图上滑动,同一组权重被成千上万个空间位置复用;相邻输出窗口共享输入像素(一个 3×3 步长为 1 的卷积,中间位置的输入像素被九个输出共用)。
为什么不能三种复用全都要?因为驻留需要寄存器,而寄存器在 PE 里是稀缺资源。每个 PE 只能给一两种数据配本地寄存器并安排固定方向的连线:权重寄存器的位置决定了预装通道,累加器的位置决定了部分和的流向。连线一旦流片就不可更改——让数据沿行流动还是沿列流动,是硅片上的几何事实,不是软件配置项。所以数据流选型的本质是一道排序题:在目标网络族里,哪种数据的搬运量最大、单位搬运能耗最值钱,就把它钉在原地,其余数据为它流动。
能耗的量级差距让这道排序题值得认真做:先进工艺下,一次 32bit 加法约 0.1~1pJ,一次片上 SRAM 访问约几 pJ,一次片外 DRAM 访问约 50~100pJ,而相邻 PE 间寄存器传一步只耗约 0.1~0.3pJ。同样的 MAC 数量,数据流选对与选错,端到端能效可以差出数倍——差距几乎全部来自数据移动,而不是乘法器本身。
用一个边长 256 的阵列把搬运量算具体。假设权重、激活都是 INT8,一批计算要完成 256×256 个输出、每个输出累加 256 次,共约 1678 万次 MAC。若三种数据每次使用都回 SRAM 取,仅权重一侧就要读 256³ 次、约 1600 万字节;驻留之后权重只读 256×256 次、共 65536 字节,读取量降到 1/256。阵列外只需要以每拍几百字节的稳定速率喂激活,内部却每拍产生 6 万多次乘加。这个「外部流量 O(N)、内部计算 O(N²)」的解耦,就是数据流策略存在的全部理由;而策略选错,等于主动放弃这个剪刀差里属于自己的那一份。
二、Weight Stationary:把权重装进阵列,让激活流过去
Weight Stationary(WS,权重驻留)是最经典的策略:阵列开始计算前,权重被预载(preload)进每个 PE 的寄存器,之后整个计算过程中权重留在原地不动;激活从阵列一侧按错位节拍注入,沿行流过每个 PE;部分和沿列流动或在列底汇聚。
WS 最大化的是权重复用:权重从 SRAM 到 PE 寄存器只走一次,之后与一长串激活相乘,每个权重的读取成本摊到 N 次 MAC 上。矩阵边长越大、batch 越大,这笔摊销越划算——这正是大 GEMM、大批量全连接层和注意力矩阵乘的典型形态,也是 Google TPU 系列一脉采用 WS 的原因。
WS 流行还因为它的控制最简单。数据节拍是固定的空间波前:激活每拍向右走一步,部分和每拍向下一步,控制单元不需要知道「现在算到矩阵的哪个位置」,错位排布的几何关系自动保证每个乘积累加到正确的输出上。没有逐 PE 的地址计算,没有动态路由,控制逻辑摊到几万次 MAC 上面积近乎为零。
代价有两处。其一,部分和必须沿列移动并在阵列边缘汇聚,部分和的位宽通常比操作数宽(INT8 相乘常用 32bit 累加),部分和的移动规模随阵列边长线性增长,是 WS 阵列内部最主要的连线开销。其二,每换一批权重要重新预装整个阵列,权重装填期间 PE 空闲;网络层多、每层权重块又装不满阵列时,预装气泡会明显拉低利用率——这也是 WS 更适合「大块权重、长时间驻留」场景的原因。
工程上配套 WS 的做法由此定型。权重 SRAM 按阵列边界分 bank,一次突发刚好装满一行 PE 的寄存器,预装带宽按「在多少拍内填满阵列」倒推;编译器分块时优先沿输出通道切权重,让一块权重驻留期间尽量多扫几个 batch、多行激活,把预装成本摊薄。反过来,一个训练有素的评审看到 WS 阵列跑小 batch 卷积,第一反应一定是去算「预装拍数 / 计算拍数」之比——这个比值一旦超过两三成,WS 在权重复用上省的能量就被装填气泡吃光了。
三、Output Stationary:让部分和待在累加器里不动
Output Stationary(OS,输出驻留)把优先级反过来:每个输出元素(及其累加器)固定在一个 PE 上,权重和激活轮流流入该 PE,N 个乘积在本地依次累加完成,部分和从不跨 PE 移动,算完后才作为最终输出送出一次。
OS 省掉的是 WS 最头疼的东西:部分和的搬运与中间写回。当累加维 K 很长时,这笔节省非常可观——部分和位宽宽、搬运次数等于累加次数,WS 下它沿列走的总距离随 K 增长;OS 下它自始至终待在同一个累加器里,成本降为零。对「每个输出要累加很多项」的层(高通道数卷积、大 K 维 GEMM),OS 的能效账因此很好看。
代价转移到了输入侧。权重和激活两种数据都要持续、按节奏流入每个 PE,数据供给速率要求高,PE 之间通常需要广播或动态分发网络:一个激活可能要同时送给负责不同输出的多个 PE。每算完一个输出换新一轮累加时,权重和激活都要重新装填。因此 OS 的控制复杂度居中——累加器逻辑简单,但喂数网络和调度比 WS 复杂,PE 利用率对数据供给节奏更敏感,供给稍断就出现空拍。
举一个量化的例子:K=1024 的矩阵乘,每个输出要累加 1024 个乘积。WS 下宽位的部分和最多时要在列间逐级流动,一个 32bit 部分和每走一步的连线翻转都比 8bit 操作数贵四倍;OS 下这 1024 次累加全部发生在同一个寄存器上,部分和侧的互联能量趋近于零。OS 的账本翻转点就在这里:当 K 大到部分和搬运能量超过输入分发网络的额外能耗时,OS 就比 WS 划算。这也解释了为什么 OS 常见于高通道卷积和大 K 维 GEMM 的映射,而窄矩阵乘上它反而吃亏。
四、Input Stationary:让激活驻留,权重流动
Input Stationary(IS,输入驻留)让激活固定在 PE 或行缓存中不动,权重流过阵列,每个驻留的激活与一串权重相乘,最大化的是激活复用。
它在两种情形下有吸引力。第一,激活本身金贵且复用度高:卷积特征图被滑动窗口反复使用,stride 越小、窗口越大,相邻窗口共享的输入像素越多;第二,batch 很小甚至 batch=1 的推理场景,比如自回归解码每步只产生一个新激活向量,激活相对权重更稀缺,让它驻留、让权重流动反而均衡。早期不少面向视觉卷积的加速器和部分可配置 NPU 采用 IS 或 IS/WS 混合映射。
IS 的工程难点是权重的分发与更换:权重数量通常远多于激活,让权重流动意味着高频读取权重存储,权重侧带宽压力大;卷积换组、换输出通道时要快速换流。纯 IS 的商业芯片不如 WS、OS 普遍,它更多作为可配置阵列的一种工作模式存在。
还有一个容易被忽略的细节:激活驻留的理想位置常常不是 PE 寄存器,而是行缓存(line buffer)——按特征图行组织的移位寄存器组,新的一行像素从一端移入,滑动窗口需要的邻域像素在寄存器间直接取用,每个输入像素只读一次就被九个窗口共享。这其实已经把 IS 的思想和卷积的数据几何焊在了一起,也是 RS 出现之前视觉加速器最常用的结构。从这个角度看,IS 与 RS 的亲缘关系,比它与 OS 的关系近得多。
五、Row Stationary:Eyeriss 的三方折中
Row Stationary(RS,行驻留)由 MIT Eyeriss 提出,不再只押注一种数据,而是按卷积的多维结构把三种复用分别做成局部最短路径:权重的一行(一个卷积核行)在一组 PE 上沿一个方向展开并驻留,输入激活的一行沿另一方向流动并经行缓存复用,部分和沿第三个方向在本地逐级累加。
对 stride=1 的小窗口卷积,RS 把卷积核复用、输入特征图复用、部分和累加同时压到很低的能耗水平——Eyeriss 的实测能效在同类工艺下显著优于朴素的 WS/OS 映射。它的哲学是:卷积天然是多维的,硬把它塞进单一驻留策略必然有一类数据要长途跋涉,不如让阵列的几何形状直接贴合卷积的三重复用结构。
代价是控制和互联最复杂:数据沿多个方向以不同节拍流动,编译器要把每个卷积层精心映射到 PE 行,阵列边界、通道数不匹配时的调度远比固定波前麻烦。这也是 RS 在学术界影响巨大、商业产品中却常以「受 RS 启发的可配置数据流」形式出现的原因。
Eyeriss 团队给出过一个被反复引用的分析框架:把卷积的能量拆成滤波器权重、输入特征图、部分和三类访问,逐层统计在不同数据流下去 SRAM 的次数。结论是没有一种策略在所有层上全胜——第一层(通道少、特征图大)激活金贵,深层(通道多、特征图小)权重和部分和金贵——而 RS 的总能量之所以最低,靠的是让每一类数据的大部分访问都降级成 PE 行内的寄存器传递。这个分析方法本身比 RS 架构流传得更广:今天几乎每篇加速器论文的评估章节,都在沿用这张「三类数据访问次数」的账本。
六、四种策略对照:驻留什么、流动什么、谁在做
| 策略 | 驻留数据 | 流动数据 | 优化的复用 | 主要优点 | 主要代价 | 代表芯片/工作 |
|---|---|---|---|---|---|---|
| WS 权重驻留 | 权重(PE 寄存器) | 激活、部分和 | 权重复用 | 控制最简单,大 GEMM 能效高 | 部分和沿列移动,换权重有预装气泡 | Google TPU 系列 |
| OS 输出驻留 | 输出/部分和(累加器) | 权重、激活 | 部分和本地累加 | 部分和零搬运,适合长 K 维 | 输入侧带宽压力大,需分发网络 | 多种 NPU 阵列配置 |
| IS 输入驻留 | 激活(PE/行缓存) | 权重 | 激活复用 | 适合卷积滑窗与小 batch | 权重侧带宽压力大,换流频繁 | 视觉加速器、混合模式 NPU |
| RS 行驻留 | 权重行(局部) | 激活行、部分和 | 三类复用折中 | 卷积综合能效最优 | 互联与调度最复杂 | MIT Eyeriss |
表中有一个贯穿性的规律:驻留谁,就省谁的访存;流动谁,就要为谁修分发网络和控制电路。WS 省下权重网络却要修部分和汇聚通道,OS 省掉部分和搬运却要同时供给两种输入,RS 三者兼顾但付出最高的调度复杂度。能效与控制面积因此是同一决策的一体两面。
表中还能读出一条选型经验法则:层形状(batch、K、通道数)决定金贵数据,而同一网络内各层形状可能完全不同,早期视觉网络浅层适 IS/RS、深层适 WS,这正是单一固定数据流芯片总会在某些层上空转、可配置设计应运而生的根因。对自回归解码的 batch=1 场景,GEMM 退化为矩阵乘向量,权重复用次数骤减,WS 阵列利用率跌至谷底——此时让权重快速流动、激活和 KV 驻留的调度反而更合理,部署侧的连续批处理(continuous batching)则从系统层面把多个请求拼回大 batch,把 WS 的经济性救回来。
理解这一点也就能看懂当代芯片的两个趋势。一是「可配置数据流」:同一阵列通过寄存器和连线的多工配置支持 WS/OS 两三种模式,让编译器按层形状选择,代价是每种模式都达不到原生极致,且多工器本身占面积。二是数据流决策与存储层级联动:驻留数据要放得下,scratchpad 的分块容量、NoC 的分发方向必须与数据流匹配,否则策略再好也会在喂数环节断流。大矩阵分块、双缓冲与显式 DMA 如何保证阵列无气泡,见 SRAM、NoC 与数据供给;每种策略每拍执行的那一次乘加的位宽、累加与精度取舍,见 MAC 单元与精度设计。
这一篇在知识体系里的位置
- 全景与脉动阵列结构:AI 加速器架构:脉动阵列、数据流与内存层级——本篇是其数据流章节的展开与细化;
- 计算细胞:MAC 单元与精度设计——乘加器、累加位宽与 INT8/INT4 精度;
- 存储与喂数:SRAM、NoC 与数据供给——驻留数据放哪、流动数据谁来送;
- 另一条通用并行路线:GPU 架构与 Warp 调度——对照专用阵列的固定数据流。
总结
权重驻留 数据复用回答的是加速器设计的第一问题——三种数据只能先保一种不动:WS 把权重钉在 PE 寄存器、激活流过,控制最简单、大 GEMM 最划算,是 TPU 为代表的经典路线;OS 让部分和驻留累加、零搬运,适合长 K 维但输入供给压力大;IS 让激活驻留,利于卷积滑窗与小 batch;RS(Eyeriss)让权重行、激活行、部分和各走短路,卷积综合能效最优而调度最复杂。驻留谁就省谁的访存、流动谁就要为谁修分发网络——数据流在硅片上同时决定了能效(TOPS/W)和控制电路的面积,这也是它必须在架构第一天就拍板、而后续 SRAM 分块与 NoC 设计都要围着它转的原因。