第4章 Eyeriss芯片微架构:拆解内部模块与协同原理
好,咱们今天来拆Eyeriss芯片。说实话,我第一次看Eyeriss的架构图时,第一反应是——这玩意儿怎么这么绕?但后来真正上手做项目,才发现它的每个模块都卡在点子上。说白了,Eyeriss不是那种“堆料”的设计,它是用最小的代价,把数据搬移和计算效率拉满。
我个人习惯,看芯片先看数据流。Eyeriss的核心就四个大块:PE阵列、全局缓冲区(GLB)、片上网络(NoC)、主控逻辑。咱们一个一个拆,最后再串起来看它们怎么配合。
4.1 全局缓冲区(GLB):数据的
GLB,全称Global Buffer,说白了就是芯片上的“大仓库”。它有多大?我记得Eyeriss原版设计里,GLB是108KB的SRAM。你可能觉得108KB不算大,但你要知道,这玩意儿是给PE阵列喂数据的,带宽才是命根子。
GLB的关键参数:
- 容量:108 KB(SRAM实现)
- 位宽:可配置,通常支持多bank并行访问
- 功能:缓存输入特征图(ifmap)、滤波器权重(filter)、输出部分和(psum)
我在项目中遇到过一个问题:GLB的bank冲突。当时我们做的是一个类似Eyeriss的加速器,GLB分了4个bank,结果发现某些卷积层里,多个PE同时读同一个bank,导致带宽直接腰斩。后来怎么解决的?我们在主控逻辑里加了一个bank地址交错映射,把连续数据打散到不同bank里。嗯,这个坑你们以后大概率也会踩。
4.2 PE阵列:真正干活的“民工团”
PE阵列是Eyeriss的心脏。每个PE都是一个乘累加单元,带自己的本地寄存器文件(RF)。Eyeriss原版有14×12=168个PE,排成一个二维网格。
你想想看,168个PE同时干活,数据怎么喂?这就是Eyeriss的精妙之处——它用了一个行固定(Row-Stationary)的数据流。什么意思?就是每个PE负责计算输出特征图的一行,滤波器权重在PE内部复用,输入特征图在行间广播。
| 数据流类型 | 复用对象 | 适用场景 |
|---|---|---|
| 行固定(RS) | 滤波器权重 | 卷积层(Eyeriss默认) |
| 输出固定(OS) | 输出部分和 | 全连接层 |
| 输入固定(IS) | 输入特征图 | 深度可分离卷积 |
我个人建议,刚开始接触Eyeriss时,先把行固定数据流吃透。因为它是整个架构的基石。我曾经带过一个实习生,他上来就研究NoC,结果连PE怎么算卷积都没搞明白,最后绕了一大圈又回来补基础。
4.3 片上网络(NoC):数据的高速公路
NoC,Network-on-Chip。Eyeriss用了两种NoC:单播NoC和多播NoC。单播NoC负责把GLB的数据送到指定PE,多播NoC负责把数据广播到多个PE。
为什么需要两种?我举个例子。在卷积计算中,一个输入特征图像素会被多个滤波器复用。如果用单播,你得发N次,带宽浪费。用多播,一次广播,所有需要的PE同时收到。但多播也有代价——它需要额外的控制逻辑来管理广播域。
避坑指南:我曾经在NoC的仲裁器上吃过亏。当时为了省面积,用了简单的轮询仲裁,结果遇到某些层的数据分布不均匀,导致某些PE饿死。后来改成了加权轮询,给高优先级数据流多分配带宽。记住,NoC的瓶颈往往不在线宽,而在仲裁策略。
4.4 主控逻辑:芯片的“大脑”
主控逻辑,也叫Controller。它负责三件事:
- 指令解析:从外部DRAM加载指令,解码后生成控制信号
- 数据流调度:决定什么时候从GLB读数据,什么时候写回
- PE同步:确保所有PE在同一个节奏上工作
Eyeriss的主控逻辑里有一个指令队列,可以预取多条指令。我刚开始做的时候觉得这玩意儿可有可无,直到有一次发现PE阵列在等指令,利用率掉到60%以下。嗯,从那以后我再也不敢小看指令预取了。
4.5 模块协同:数据流全景
好了,四个模块都拆完了。咱们把它们串起来,看看一次卷积计算是怎么跑的:
- 主控逻辑从DRAM加载指令,解析出当前层的参数(卷积核大小、步长、通道数等)
- GLB从DRAM预取输入特征图和滤波器权重,按行固定数据流组织好
- 单播NoC把滤波器权重送到每个PE的本地RF
- 多播NoC把输入特征图广播到所有PE
- PE阵列并行计算乘累加,结果暂存在PE内部的psum寄存器
- 计算完成后,多播NoC把psum收集回GLB,进行累加和激活函数处理
- 主控逻辑判断当前层是否结束,如果结束,通知GLB把结果写回DRAM
你看,整个流程里,GLB是数据的,NoC是运输线,PE是加工厂,主控是调度中心。缺一个都不行。
注意:Eyeriss的协同有一个关键约束——PE阵列的计算速度必须和NoC的传输速度匹配。如果NoC太慢,PE会空等;如果NoC太快,GLB的带宽会爆。我见过一个团队,把NoC位宽翻了一倍,结果GLB的读写端口成了新瓶颈,性能反而没提升。所以,做架构设计时,一定要做瓶颈分析,别盲目堆资源。
4.6 架构总览图
下面这张图是我画的Eyeriss微架构总览。你可以看到数据从DRAM到GLB,再通过NoC分发到PE阵列,最后结果写回的完整路径。
从这张图你可以看到,数据流是分层的。DRAM到GLB是粗粒度传输,GLB到PE是细粒度分发。主控逻辑像指挥家,控制着整个乐团的节奏。我每次看这张图都会提醒自己:架构设计的本质,就是管理数据流。
4.7 小结
这一章我们拆了Eyeriss的四个核心模块。GLB是数据仓库,PE阵列是计算引擎,NoC是运输网络,主控是调度中心。它们之间通过行固定数据流协同工作,实现了高能效的卷积计算。
嗯,说实话,Eyeriss的架构看起来复杂,但核心思想很简单——让数据尽量在片上流动,减少DRAM访问。你只要抓住这个主线,后面的细节就都好理解了。