2. NPU内存层次结构:片上SRAM、全局内存、DDR带宽、HBM

做NPU系统工程师这些年,我最大的体会就是——内存层次结构决定了AI芯片的天花板。你想想看,算力再强,数据喂不进去,一切都是白搭。今天我们就来拆解NPU里这几层存储,看看它们各自扮演什么角色。

NPU 内存层次结构 片上SRAM (Scratchpad / L1 SRAM) 容量: 2~32 MB · 延迟: 1~5 ns · 带宽: 10~100 TB/s 全局内存 (Shared SRAM / L2) 容量: 32~256 MB · 延迟: 10~30 ns · 带宽: 2~10 TB/s HBM / DDR (片外内存) HBM容量: 4~64 GB · DDR容量: 8~256 GB · 延迟: 50~200 ns ⬆ 带宽递减 · 延迟递增 ⬇ ⬆ 带宽递减 · 延迟递增 ⬇ 数据路径:DDR/HBM → 全局内存 → 片上SRAM → 计算单元 程序员视角:手动管理SRAM,编译器/驱动管理全局内存与HBM

2.1 片上SRAM — 最快的那块“桌面”

片上SRAM,说白了就是NPU核心旁边的高速暂存区。我个人习惯叫它“计算单元的桌面”——你正在处理的数据必须摆在桌面上,手一伸就能拿到。容量不大,通常2~32 MB,但延迟只有1~5 ns,带宽能到恐怖的10 TB/s以上。

我在项目中遇到过一个典型的卷积层优化:如果能把输入特征图和权重全部塞进SRAM,算子耗时能降40%。但一旦塞不下,就得频繁搬数据,性能直接腰斩。所以很多NPU的编译器会做“分块tiling”,目的就是把数据切成小块,一块一块喂给SRAM。

💡 我的经验: 写算子时,优先把最内层循环的数据放在SRAM。比如矩阵乘的A、B矩阵分块,尽量让子块在SRAM里完成计算,再写回全局内存。我曾经因为没注意SRAM bank冲突,导致实际带宽只有理论值的60%……嗯,bank冲突是个坑,后面章节会细聊。

2.2 全局内存 — 片上的“共享仓库”

全局内存通常是更大的片上SRAM(也叫L2 SRAM或共享内存),容量32~256 MB,延迟10~30 ns。它介于SRAM和片外DDR之间,像个中转站。你想想看,多个计算核要交换数据,或者做Reduce、Gather操作,全局内存就是那个“共享白板”。

我记得有一次做BERT推理优化,发现Self-Attention的中间结果太大,片上SRAM放不下,但全局内存刚好能装下。于是我把QKT的结果暂存在全局内存,避免写回DDR,延迟直接降了3倍。这就是用好层次结构的好处。

🔑 关键认知: 全局内存是软件可控的。大部分NPU允许你通过DMA指令或者直接load/store访问它。用好它,能大幅减少对片外带宽的依赖。

2.3 DDR带宽 — 传统片外内存

DDR(比如DDR4/DDR5/LPDDR5)是NPU的传统片外内存。容量大(8~256 GB),但延迟高(50~100 ns),带宽相对有限(通常50~100 GB/s)。对于很多边缘端NPU,DDR就是主存。但说实话,对于大模型推理,DDR带宽经常是瓶颈。

我见过不少团队在DDR带宽上踩坑。举个例子,一个7B模型,权重就要14 GB(FP16),如果全部放在DDR里,每次推理都要把权重从DDR搬到片上,带宽很容易打满。这时候就得靠量化、权重压缩、甚至模型剪枝来“减负”。

⚠️ 避坑指南: 我曾经在项目里过度依赖DDR的随机访问能力,结果发现NPU对DDR的随机读性能很差(因为page激活开销)。后来改成连续读+预取,带宽利用率从30%提升到85%。记住:DDR喜欢顺序访问,别老跳着读。

2.4 HBM — 高带宽内存,大模型时代的“救星”

HBM(High Bandwidth Memory)是近年来AI芯片的标配。它通过3D堆叠和硅中介层,把多个DRAM die堆在一起,带宽轻松上1~3 TB/s。容量4~64 GB,延迟比DDR稍低(50~150 ns)。

为什么HBM这么重要?你想想看,训练一个GPT-3级别的模型,数据吞吐量是PB级,DDR那点带宽根本不够看。HBM的带宽是DDR的5~10倍,而且功耗还更低。我参与过的某款7nm NPU,用了4个HBM2E stack,总带宽2 TB/s,总算把训练效率提上来了。

但HBM也不是万能的。 它的容量相对有限(目前单颗HBM3最多32 GB),而且成本高。所以很多芯片会同时搭配DDR和HBM:HBM放热数据,DDR放冷数据。这就是所谓的“异构内存管理”。

内存层次典型容量延迟带宽管理方式
片上SRAM2~32 MB1~5 ns10~100 TB/s软件显式管理
全局内存 (L2 SRAM)32~256 MB10~30 ns2~10 TB/s软件/DMA管理
HBM4~64 GB50~150 ns1~3 TB/s硬件+驱动管理
DDR8~256 GB50~200 ns50~100 GB/s操作系统管理

2.5 如何选择 & 数据流设计

实际项目中,我一般遵循一个原则:能放片上不放片外,能放SRAM不放全局内存。但具体怎么搬、什么时候搬,得看算子特性。

举个例子,一个卷积层:

📌 实用技巧: 很多NPU提供“双缓冲”机制。你可以让DMA把下一块数据搬到SRAM的同时,计算单元处理当前块。这样访存和计算就重叠起来了。我习惯在代码里用ping-pong buffer,几乎每次都能白嫖20~30%的性能提升。

最后说一句,内存层次结构不是死的。不同NPU的SRAM大小、全局内存组织方式、HBM通道数都不一样。做系统优化时,一定要先看芯片手册,再结合profiling数据做决策。别光凭经验猜,我吃过这个亏。