第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。它负责三件事:

  1. 指令解析:从外部DRAM加载指令,解码后生成控制信号
  2. 数据流调度:决定什么时候从GLB读数据,什么时候写回
  3. PE同步:确保所有PE在同一个节奏上工作

Eyeriss的主控逻辑里有一个指令队列,可以预取多条指令。我刚开始做的时候觉得这玩意儿可有可无,直到有一次发现PE阵列在等指令,利用率掉到60%以下。嗯,从那以后我再也不敢小看指令预取了。

4.5 模块协同:数据流全景

好了,四个模块都拆完了。咱们把它们串起来,看看一次卷积计算是怎么跑的:

  1. 主控逻辑从DRAM加载指令,解析出当前层的参数(卷积核大小、步长、通道数等)
  2. GLB从DRAM预取输入特征图和滤波器权重,按行固定数据流组织好
  3. 单播NoC把滤波器权重送到每个PE的本地RF
  4. 多播NoC把输入特征图广播到所有PE
  5. PE阵列并行计算乘累加,结果暂存在PE内部的psum寄存器
  6. 计算完成后,多播NoC把psum收集回GLB,进行累加和激活函数处理
  7. 主控逻辑判断当前层是否结束,如果结束,通知GLB把结果写回DRAM

你看,整个流程里,GLB是数据的,NoC是运输线,PE是加工厂,主控是调度中心。缺一个都不行。

注意:Eyeriss的协同有一个关键约束——PE阵列的计算速度必须和NoC的传输速度匹配。如果NoC太慢,PE会空等;如果NoC太快,GLB的带宽会爆。我见过一个团队,把NoC位宽翻了一倍,结果GLB的读写端口成了新瓶颈,性能反而没提升。所以,做架构设计时,一定要做瓶颈分析,别盲目堆资源。

4.6 架构总览图

下面这张图是我画的Eyeriss微架构总览。你可以看到数据从DRAM到GLB,再通过NoC分发到PE阵列,最后结果写回的完整路径。

Eyeriss芯片微架构总览 Eyeriss芯片微架构总览 DRAM(片外) 指令加载 主控逻辑 控制信号 数据加载 全局缓冲区(GLB) 108KB SRAM 数据分发 片上网络(NoC) 广播/单播 PE阵列(14×12 = 168个PE) 行固定数据流 · 本地RF psum写回 结果写回 图例 片外存储 控制模块

从这张图你可以看到,数据流是分层的。DRAM到GLB是粗粒度传输,GLB到PE是细粒度分发。主控逻辑像指挥家,控制着整个乐团的节奏。我每次看这张图都会提醒自己:架构设计的本质,就是管理数据流。

4.7 小结

这一章我们拆了Eyeriss的四个核心模块。GLB是数据仓库,PE阵列是计算引擎,NoC是运输网络,主控是调度中心。它们之间通过行固定数据流协同工作,实现了高能效的卷积计算。

嗯,说实话,Eyeriss的架构看起来复杂,但核心思想很简单——让数据尽量在片上流动,减少DRAM访问。你只要抓住这个主线,后面的细节就都好理解了。