4. 数字存算一体原理:基于SRAM的数字近存计算
各位同学,今天我们来聊聊数字存算一体里最接地气的一个分支——基于SRAM的近存计算。说实话,我刚入行那会儿,大家还在拼命把存储和计算分开优化,觉得“存算分离”是天经地义的事。直到后来做AI加速器项目,被数据搬运的功耗折磨得够呛,才真正意识到:把计算搬到存储边上,甚至揉进存储里,才是解决“存储墙”问题的关键。
我个人习惯把数字近存计算分成两类:一类是“离得近”,一类是“融进去”。前者就是SRAM紧挨着计算单元,后者则是直接在SRAM位线上做计算。今天我们先讲前者,也就是数字近存计算的核心——乘累加器设计。
4.1 为什么是SRAM?
你想想看,芯片里最常用的片上存储是什么?没错,就是SRAM。它的速度快、工艺成熟、密度也还行。更重要的是,SRAM的读写接口是数字的,天然适合跟数字计算单元对接。
我在项目中遇到过一个问题:用DRAM做近存计算,刷新周期和延迟让人头疼。换成SRAM之后,延迟直接降了一个数量级。所以现在主流数字近存方案,基本都围着SRAM转。
核心观点:SRAM近存计算不是把SRAM和计算单元简单拼在一起,而是让计算单元“寄生”在SRAM的读写通路上,减少数据搬运的距离和次数。
4.2 数字乘累加器(MAC)的基础结构
乘累加器,说白了就是做 y = Σ(a_i × w_i) 这个运算。在数字域里,乘法器加加法器,再配上累加寄存器,就构成了最基本的MAC单元。
但这里有个坑:位宽。我刚开始设计时,天真地以为8位乘8位累加,用16位加法器就够了。结果一跑仿真,溢出得乱七八糟。后来才明白,累加器的位宽必须考虑累加次数。比如累加256次,就要多8位。
| 输入位宽 | 累加次数 | 累加器位宽 |
|---|---|---|
| 8-bit | 64 | 8+8+6=22-bit |
| 8-bit | 256 | 8+8+8=24-bit |
| 4-bit | 1024 | 4+4+10=18-bit |
避坑指南:我曾经在一个项目里,因为累加器位宽少算了2位,导致最终结果在边界条件下出错。那两天排查得我头都大了。所以设计MAC时,请务必把累加次数考虑进去,宁可多留几位,也别省。
4.3 位串行架构:用时间换面积
位串行架构,说白了就是一次只处理1位数据。比如8位的乘法,串行做8次。听起来很慢对吧?但它的好处是硬件资源极省。
我做过一个对比:同样是做32个8×8的MAC,并行架构需要32个乘法器+32个加法器,面积大概占0.5mm²(28nm工艺)。而位串行架构只需要1个1位乘法器+1个累加器,面积不到0.05mm²。
位串行的基本流程是这样的:
- 把输入数据和权重按位拆开
- 从最低位开始,逐位相乘
- 每次乘法结果移位后累加
- 重复直到所有位处理完
// 位串行MAC的伪代码示例
for (bit = 0; bit < N; bit++) {
partial = (a >> bit) & 1; // 取输入的第bit位
result += partial * w << bit; // 乘权重并移位累加
}
个人经验:位串行架构特别适合那些对延迟不敏感、但对面积和功耗有严格要求的场景。比如可穿戴设备里的关键词检测,每秒只要处理几十次,用位串行完全够用,还能省下面积放电池。
4.4 位并行架构:用面积换速度
位并行就简单粗暴了——所有位同时处理。8位乘法,一次搞定。速度是位串行的8倍,但面积也是8倍以上。
你想想看,如果做卷积神经网络推理,一次要算几百上千个MAC,位并行架构可以在一个时钟周期内完成所有计算。而位串行可能要几百个周期。
但位并行也有它的烦恼:
- 布线拥堵:所有数据同时进出,SRAM的读写带宽要足够大
- 功耗峰值高:所有MAC同时翻转,瞬间电流可能很大
- 面积开销大:每个MAC都要完整的乘法器和加法器
我记得有一次做边缘AI芯片,客户要求延迟低于1ms。用位串行算了一下,需要800个周期,时钟200MHz,延迟4ms,超标了。换成位并行,8个周期搞定,延迟40μs,完美达标。当然,代价是芯片面积大了30%。
4.5 位串行 vs 位并行:如何选择?
这个问题没有标准答案。我个人的经验是看三个指标:
| 指标 | 位串行 | 位并行 |
|---|---|---|
| 面积 | 小(省) | 大(费) |
| 速度 | 慢(N个周期) | 快(1个周期) |
| 功耗 | 低且平稳 | 高且有峰值 |
| 适用场景 | IoT、可穿戴 | 云端、自动驾驶 |
说白了,这就是一个经典的“面积-速度-功耗”三角权衡。没有绝对的好坏,只有合不合适的方案。
4.6 混合架构:取长补短
在实际工程中,我很少看到纯位串行或纯位并行的设计。大多数方案都是混合的——比如4位并行、2位串行,这样总延迟是2个周期,面积介于两者之间。
举个例子:
- 8位乘法,拆成2组4位并行计算
- 每组内4位同时乘,组间串行累加
- 这样只需要2个周期,面积是纯并行的1/4
这种混合架构,我个人觉得是工程实践中最实用的方案。它给了设计师一个连续可调的“旋钮”,可以根据需求在面积和速度之间做精细权衡。
核心总结:数字近存计算的核心是MAC设计。位串行省面积但慢,位并行快但费面积。实际工程中多用混合架构,在两者之间找到最佳平衡点。记住,没有完美的架构,只有最适合你项目的架构。
最后说一句:数字近存计算这块,理论其实不难,难的是在工程中做权衡。我见过太多团队,要么一味追求速度把芯片做得巨大,要么死抠面积导致性能不达标。记住,好的设计是“刚刚好”的设计。