第4章:数据复用策略:时间局部性与空间局部性,如何利用片上缓存减少对外带宽需求

大家好,我是你们的老朋友。

这一章咱们聊聊数据复用。说白了,就是怎么让片上那点宝贵的缓存,多干点活,少去外面DRAM折腾。我见过太多算子,性能瓶颈不在计算,而在数据搬运。你想想看,计算单元闲着等数据,多浪费。

4.1 时间局部性与空间局部性

这两个概念,教科书上讲得挺玄乎。我用自己的话解释一下。

时间局部性:一个数据被访问后,短时间内很可能再次被访问。比如循环体里的累加变量。

空间局部性:一个数据被访问后,它附近的数据很可能马上被访问。比如数组的连续读取。

嗯,这里要注意。NPU的算子优化,本质上就是利用这两种局部性,把数据留在片上缓存里,反复用。

核心思想:一次搬运,多次计算。减少对外部存储器的访问次数,就是降低带宽需求。

4.2 我在项目中遇到的典型问题

我记得有一次优化一个卷积算子。输入特征图是224x224x64,权重是3x3x64x128。按照最粗暴的方式,每算一个输出点,就要读一次输入和权重。那带宽需求,简直吓人。

我当时算了一笔账:

访问类型 一次卷积所需数据量 总访问次数 总数据量
输入特征图 3x3x64 = 576字节 222x222x128 ≈ 630万次 约3.6GB
权重 3x3x64x128 = 73,728字节 1次(理想情况) 约72KB

你看,输入特征图被反复读了630万次!这要是全走外部带宽,芯片得冒烟。

我的经验:遇到这种问题,第一反应不是加带宽,而是看能不能复用。加带宽是花钱,复用是花脑子。

4.3 利用片上缓存实现数据复用

NPU的片上缓存,一般分几级:L1、L2,有的还有L0。咱们得把数据安排得明明白白。

4.3.1 权重驻留策略

权重通常比较小,可以一次性加载到片上缓存,然后反复使用。这就是时间局部性的典型应用。

// 伪代码示例:权重驻留
load_weight_to_l2(weight_ptr, weight_size);  // 一次加载
for (int oh = 0; oh < output_height; oh++) {
    for (int ow = 0; ow < output_width; ow++) {
        // 每次计算都从L2读权重,不用去DRAM
        compute_conv(oh, ow, weight_l2, input_l1);
    }
}

这样做的好处很明显。权重只加载一次,后续所有计算都从片上缓存读取。带宽消耗从O(N)降到了O(1)。

4.3.2 输入数据滑动窗口

输入特征图比较大,不能全放片上。但我们可以利用空间局部性,用滑动窗口的方式,只加载当前计算需要的部分。

我习惯把输入特征图切成tile。每个tile大小刚好能放进L1缓存。计算完一个tile,再加载下一个。

关键点:tile的大小要精心设计。太小了,加载次数多,带宽没省下来。太大了,L1放不下,反而要频繁换入换出。

4.4 数据复用策略的SVG结构图

下面这张图,是我自己总结的数据复用策略框架。你看一眼就明白了。

数据复用策略框架 外部DRAM 片上缓存(L1/L2) 时间局部性 权重驻留、累加器复用 空间局部性 滑动窗口、Tile加载 混合策略 权重驻留+输入Tile NPU计算阵列 目标:一次搬运,多次计算,降低对外带宽需求

4.5 避坑指南

我曾经踩过一个坑:做矩阵乘法时,我把整个输入矩阵都加载到了片上缓存。结果矩阵太大,缓存装不下,频繁换入换出,性能反而比直接读DRAM还差。

后来我学乖了。先算好缓存能装多少数据,再决定tile大小。别贪心,够用就行。

4.6 实际案例:卷积算子的数据复用优化

咱们回到刚才那个卷积例子。我最终采用的策略是这样的:

  1. 权重全量驻留L2:72KB的权重,L2完全装得下。一次加载,反复使用。
  2. 输入特征图分Tile:每个Tile大小64x64x64,约256KB。L1缓存刚好能放下。
  3. 输出累加器驻留L0:每个输出点的累加结果,放在L0寄存器里,避免频繁写回。

优化后的带宽需求:

访问类型 优化前 优化后 节省比例
权重读取 630万次 x 72KB 1次 x 72KB 99.99%
输入读取 630万次 x 576字节 约1000次 x 256KB 约93%
输出写回 630万次 x 4字节 630万次 x 4字节 0%(但延迟降低)

你看,权重读取几乎省没了。输入读取也省了93%。这就是数据复用的威力。

我的建议:做算子优化时,先画一张数据流图。标出哪些数据被反复读取,哪些可以驻留缓存。然后针对性地设计复用策略。别一上来就写代码,先想清楚。

好了,这一章就到这里。数据复用是NPU优化的基本功,也是性价比最高的优化手段。你想想看,不用改硬件,不用加带宽,光靠软件策略就能省下90%以上的带宽,多划算。

想要更多资料,联系可可