第三章 硬件架构基础:数字电路基础回顾、存储层次与片上互联
各位同学,今天我们来聊聊AI加速器的硬件地基。说白了,不管你的算法多牛,最终都得落到硅片上跑。我这些年做芯片设计,最大的感触就是:算法和硬件的匹配,才是真正的功夫。
3.1 数字电路基础回顾
先快速过一下数字电路的核心。嗯,这部分可能有些同学觉得简单,但我要强调一点:在AI加速器里,我们用的不是教科书上的理想电路,而是要考虑时序、功耗、面积的真实电路。
3.1.1 组合逻辑与时序逻辑
组合逻辑就是没有记忆功能的电路,输出只取决于当前输入。比如加法器、多路选择器。时序逻辑则相反,它靠触发器(Flip-Flop)存储状态,输出不仅看当前输入,还看之前的状态。
我个人习惯把AI加速器里的计算单元想象成流水线。每个时钟周期,数据从一个寄存器传到下一个寄存器,中间经过组合逻辑做运算。这里有个坑——我曾经在一个项目里,因为组合逻辑路径太长,导致时序收敛不了,最后不得不拆成两级流水。
关键点:AI加速器里,乘法器和累加器是最常见的组合逻辑模块。它们的延迟直接决定了你能跑多高的频率。
3.1.2 时钟与同步设计
时钟是数字电路的“心跳”。所有时序逻辑都在时钟边沿采样数据。同步设计意味着所有触发器共享同一个时钟源,这样时序分析就简单多了。
但实际芯片里,时钟树综合(Clock Tree Synthesis)是个大工程。我记得有一次,时钟偏斜(Skew)差了50皮秒,整个芯片的时序就崩了。所以,做AI加速器时,我建议你们对时钟网络要格外小心。
3.1.3 常见计算单元
- 加法器:有行波进位加法器、超前进位加法器。AI里常用的是饱和加法器,防止数据溢出。
- 乘法器:Booth编码、Wallace树。我做过一个16位乘法器,用Wallace树比普通阵列快了30%。
- 累加器:其实就是加法器加寄存器。注意,累加器的位宽要足够,不然会溢出。
小技巧:在AI加速器里,经常需要做乘加运算(MAC)。你可以把乘法器和累加器合并成一个MAC单元,这样能省不少面积。
3.2 存储层次:SRAM与DRAM
存储是AI加速器的瓶颈。你想想看,模型参数动不动几百兆,甚至上G,怎么在芯片里存?怎么快速读取?这里我结合自己的项目经验,给大家拆解一下。
3.2.1 SRAM:片上缓存的主力
SRAM(静态随机存取存储器)速度快,但面积大、功耗高。它由6个晶体管组成一个存储单元,数据不需要刷新。在AI加速器里,SRAM通常用作片上缓存(Cache)或本地存储器。
我曾经在一个项目里,把权重存在SRAM里,结果发现读取带宽不够。后来改成双端口SRAM,一个端口读权重,一个端口读输入,才解决了问题。
| 特性 | SRAM | DRAM |
|---|---|---|
| 速度 | 快(1-2ns) | 慢(10-50ns) |
| 面积 | 大(6T/bit) | 小(1T+1C/bit) |
| 功耗 | 高(静态功耗大) | 低(但需刷新) |
| 用途 | 片上缓存 | 主存 |
3.2.2 DRAM:大容量主存
DRAM(动态随机存取存储器)容量大、成本低,但速度慢。它靠电容存储电荷,需要定期刷新。在AI加速器里,DRAM通常用作外部主存,存放模型参数和中间结果。
这里有个避坑指南:我曾经以为DRAM带宽够用,结果发现频繁的读写操作导致刷新冲突,性能直接腰斩。后来我改用DDR4,并优化了访问模式,才把带宽跑满。
注意:DRAM的访问延迟是SRAM的10倍以上。如果你的AI算法需要频繁随机访问,建议把热点数据放到SRAM里。
3.2.3 存储层次设计
现代AI加速器通常采用多级存储层次:
- L1缓存:SRAM,几KB到几十KB,单周期访问。
- L2缓存:SRAM,几百KB到几MB,几个周期访问。
- 主存:DRAM,几GB到几十GB,几十到上百周期访问。
我建议你们在设计时,先估算好数据重用率。如果重用率高,多放SRAM;如果重用率低,那就靠DRAM的大带宽。
3.3 片上互联:NoC与总线
芯片里那么多模块,怎么连起来?这就是片上互联干的事。我见过不少项目,计算单元设计得挺好,结果互联成了瓶颈,数据传不过去。
3.3.1 传统总线架构
总线就是一根共享的通信线路,所有模块都挂上去。优点是简单,缺点是带宽有限。比如AHB、AXI总线,在AI加速器里,总线通常用于控制通路,而不是数据通路。
我记得有一次,用AXI总线传权重数据,结果多个主设备同时请求,总线仲裁成了瓶颈。后来我改成点对点连接,才解决了问题。
3.3.2 片上网络(NoC)
NoC(Network-on-Chip)是解决大规模互联的方案。它把芯片当成一个微型网络,每个模块通过路由器连接。NoC的优点是带宽高、可扩展性好。
我做过一个16核的AI加速器,用的就是2D Mesh NoC。每个路由器有5个端口(东、南、西、北、本地),数据包按XY路由算法传输。嗯,这里要注意,路由器的延迟和面积要平衡好。
3.3.3 总线 vs NoC:怎么选?
我个人的经验是:如果模块少于10个,用总线就够了。如果超过10个,尤其是需要高带宽并行通信的,NoC是更好的选择。
举个例子,我做过一个8核的AI加速器,用AXI总线互联,带宽瓶颈在400MB/s。后来改成4x4的NoC,带宽直接飙到2GB/s。当然,NoC的面积和功耗也更大,需要权衡。
总结:数字电路是基础,存储层次决定数据能不能喂饱计算单元,片上互联决定数据能不能高效流动。这三者缺一不可。