一、存算一体概述:从冯·诺依曼瓶颈到存算一体
大家好,我是你们的老朋友。今天咱们聊聊存算一体。说实话,这个领域我摸爬滚打了快十年,踩过的坑比走过的路还多。但每次看到新同学一头扎进来,我还是挺欣慰的——因为这条路,真的值得走。
先问个问题:你写代码的时候,有没有觉得CPU在等内存?明明算法算得飞快,数据却卡在搬运上。嗯,这就是冯·诺依曼架构的老毛病了。
1.1 冯·诺依曼瓶颈:到底卡在哪?
冯·诺依曼架构,说白了就是“存储”和“计算”分家。CPU只管算,内存只管存。中间靠总线传数据。这个设计在几十年前没问题,因为那时候CPU和内存速度差不多。
但现在呢?CPU主频已经飙到几GHz,内存带宽却跟不上。我做过一个统计:一个典型的深度学习推理任务,有60%~80%的时间和功耗都花在数据搬运上。真正用来计算的,少得可怜。
核心痛点:
- 带宽墙:内存带宽有限,数据搬不过来
- 功耗墙:搬运1比特数据的能耗,比做一次乘加运算高几个数量级
- 延迟墙:访存延迟远大于计算延迟,CPU经常空转等待
我当年做第一个AI加速器项目时,就吃了这个亏。算法跑在GPU上,看起来很快,但一分析profiling结果,发现大部分时间都在等数据从DDR搬过来。那时候我就想:要是计算和存储能离得近一点,甚至合在一起,该多好?
1.2 存算一体:换个思路解决问题
存算一体的想法其实很朴素:让计算发生在数据所在的地方。别把数据搬来搬去了,直接在存储单元里做运算。
你想想看,这就像你办公桌上堆满了文件。传统做法是把文件搬到另一个房间去处理,处理完再搬回来。存算一体呢?直接在办公桌上处理,省掉来回搬运的时间。
这个思路在学术界其实很早就有了。我记得上世纪90年代就有论文提出“智能存储器”的概念。但真正火起来,是最近五六年的事。为什么?因为AI推理对带宽和功耗的要求太苛刻了,传统架构实在扛不住。
1.3 存算一体的发展历程
存算一体不是一蹴而就的。它经历了几个阶段,我按时间线给大家捋一捋:
| 阶段 | 时间 | 特点 | 代表技术 |
|---|---|---|---|
| 萌芽期 | 1990s~2000s | 学术探索,概念验证 | 智能存储器、PIM概念 |
| 发展期 | 2010s~2015 | 近存计算兴起,HBM出现 | HBM、Hybrid Memory Cube |
| 爆发期 | 2016~2020 | AI驱动,存内计算芯片涌现 | Mythic、SambaNova、三星HBM-PIM |
| 成熟期 | 2021~至今 | 产品化落地,生态建设 | AMD MI300、Intel Ponte Vecchio |
我个人觉得,2016年是个分水岭。那年AlphaGo赢了李世石,AI一下子成了香饽饽。大家突然发现,传统架构跑AI推理太费劲了。于是存算一体从学术圈的小众话题,变成了工业界的香饽饽。
1.4 存算一体的三种分类
存算一体听起来简单,但实现方式五花八门。我习惯把它分成三类:近存计算、存内计算、模拟存算一体。这三者各有各的脾气,咱们一个一个说。
1.4.1 近存计算(Near-Memory Computing)
近存计算,说白了就是把计算单元搬到内存旁边。离得近,数据搬运距离就短,延迟和功耗自然降下来。
典型的例子是HBM(高带宽内存)。HBM把DRAM堆叠起来,中间夹一层逻辑芯片。逻辑芯片负责控制,也做一些简单的计算。我做过一个项目,用HBM跑矩阵乘法,比传统DDR方案快了3倍,功耗还降了一半。
我的经验:近存计算适合那些对带宽敏感、但对计算能力要求不高的场景。比如推荐系统里的embedding lookup,用近存计算效果就很好。但如果你要做复杂的矩阵运算,近存计算可能还不够。
1.4.2 存内计算(In-Memory Computing)
存内计算更进一步——直接在存储单元里做计算。存储单元本身就是一个计算单元。这听起来很酷,但实现起来坑不少。
存内计算通常用SRAM或RRAM(电阻式随机存取存储器)来实现。每个存储单元不仅能存数据,还能做简单的逻辑运算或乘加运算。我见过一个SRAM存内计算芯片,在跑CNN推理时,能效比达到了10 TOPS/W,比传统GPU高了一个数量级。
注意:存内计算有个大坑——精度问题。模拟计算容易受噪声影响,精度做不高。我当年做RRAM存内计算时,为了把精度从8bit提到16bit,折腾了整整三个月。最后发现,还是得靠数字辅助校正。
1.4.3 模拟存算一体(Analog Compute-in-Memory)
模拟存算一体,是存内计算的“激进版”。它用模拟电路做计算,比如用电流或电压来表示数据,直接在存储阵列里完成乘加运算。
这种方式的优势是能效极高。我见过一个模拟存算一体芯片,在跑ResNet-50时,能效比达到了50 TOPS/W。但代价是精度和可靠性。模拟电路对工艺偏差、温度变化都很敏感,稍微有点波动,结果就偏了。
我记得有一次,芯片在实验室跑得好好的,一拿到客户现场就出问题。查了半天,发现是温度变化导致模拟计算偏差。后来我们加了温度补偿电路,才算搞定。
1.5 三种方案的对比
为了让大家看得更清楚,我整理了一个对比表:
| 特性 | 近存计算 | 存内计算 | 模拟存算一体 |
|---|---|---|---|
| 计算位置 | 存储附近 | 存储内部 | 存储内部(模拟域) |
| 能效比 | 中等(~1 TOPS/W) | 较高(~10 TOPS/W) | 极高(~50 TOPS/W) |
| 精度 | 高(数字计算) | 中等(数字/混合) | 低(模拟计算) |
| 成熟度 | 高(已有产品) | 中等(部分产品) | 低(学术为主) |
| 适用场景 | 带宽敏感型任务 | 中等精度推理 | 低精度、高能效场景 |
你可能会问:那我该选哪种?我的建议是:看需求。如果追求快速落地,近存计算最稳妥。如果追求极致能效,模拟存算一体值得赌一把。存内计算则是个折中方案,适合大多数场景。
1.6 知识体系总览
为了让你对本章内容有个整体印象,我画了一张图。这张图把存算一体的核心逻辑串起来了:
这张图把本章的核心逻辑串起来了。从冯·诺依曼瓶颈出发,引出存算一体的核心思想,再分支出三种实现方式。每种方式都有它的优缺点和适用场景。
1.7 避坑指南
最后,分享几个我踩过的坑,希望能帮你少走弯路:
避坑1:别盲目追求极致能效
我曾经在一个项目中,为了追求50 TOPS/W的能效,选了模拟存算一体方案。结果精度做不上去,客户不买账。最后不得不降级到存内计算,虽然能效低了点,但精度达标了。记住:能效再高,精度不行也是白搭。
避坑2:近存计算不是万能药
近存计算虽然成熟,但它的能效提升有限。如果你需要10倍以上的能效提升,近存计算可能不够。我建议你先做系统级仿真,看看瓶颈到底在哪。有时候,优化算法比换硬件更有效。
避坑3:存内计算要关注工艺
存内计算对工艺很敏感。同样的设计,在28nm上跑得好,换到7nm可能就出问题。我建议你在选工艺时,多和foundry沟通,了解他们的存内计算IP支持情况。
好了,第一章就聊到这。存算一体是个大话题,后面我们会一步步深入。记住:没有最好的方案,只有最合适的方案。下一章,咱们聊聊近存计算的具体实现,我会带你看一个实际的项目案例。
想要更多资料,联系可可