3. 计算与存储的能耗模型:MAC运算能耗、数据搬运能耗(内存墙)

好,咱们进入正题。今天聊的这个话题,说白了就是芯片部署里最烧钱的两个地方——算力和搬数据。我经常跟团队说,你搞懂了MAC运算和数据搬运的能耗,你就搞懂了模型部署优化的半壁江山。

3.1 MAC运算能耗:算力的真实成本

先说说MAC运算。MAC就是乘加运算,一个乘法加一个加法。神经网络里90%以上的计算都是这个。你想想看,一个卷积层,几百个MAC,一个模型几千万甚至上亿个MAC,这能耗能小吗?

我个人习惯把MAC运算能耗拆成三块来看:

  • 乘法器能耗:占大头,大概60%-70%
  • 加法器能耗:占20%-30%
  • 寄存器读写能耗:剩下的10%左右

嗯,这里要注意,不同工艺节点下这个比例会变。我在7nm项目上测过,乘法器能耗占比会更高一些,因为漏电流的影响变小了。

关键数据:一次32位浮点MAC运算,在28nm工艺下大约消耗3-5pJ。换成INT8量化后,能降到0.2-0.5pJ。差了10倍不止。所以量化为什么重要?这就是原因。

3.2 数据搬运能耗:被忽视的巨兽

接下来聊数据搬运。这个才是真正的能耗大户。我刚开始做部署时,总觉得计算最费电,后来一测才发现——搬数据才是真正的电老虎。

为什么会这样?我给你算笔账:

操作类型 能耗(相对值) 说明
一次MAC运算 1x 基准
读一次SRAM 5-10x 比计算贵5倍
读一次DRAM 200-500x 比计算贵几百倍

看到没?从DRAM搬一次数据,够你做几百次MAC运算了。这就是所谓的内存墙——计算速度跟上了,但数据搬运速度跟不上,能耗也跟不上。

避坑指南:我曾经在一个边缘设备项目上,模型算力优化得特别好,MAC次数压到了最低。结果一上板子,功耗还是超标。查了三天才发现,问题出在频繁的DRAM访问上。每次推理都要从外部DDR搬几MB的权重,这能耗比计算本身还高。从那以后,我每次做优化都会先看数据流,再看计算量。

3.3 内存墙的本质:存储层次与能耗

内存墙说白了就是存储层次的问题。现代芯片的存储结构像个金字塔:

  • 寄存器:最快,最贵,容量最小
  • SRAM(片上缓存):快,贵,容量有限
  • DRAM(片外内存):慢,便宜,容量大

你想想看,模型权重放在DRAM里,每次计算都要从DRAM搬到片上SRAM,再从SRAM搬到寄存器。这一趟下来,能耗全花在路上了。

我建议你记住这个原则:数据搬得越远,能耗越高;搬得越频繁,能耗越高。

3.4 实战中的优化策略

那怎么破?我总结了几条实战经验:

  1. 数据复用最大化:同一个权重尽量多用几次。比如卷积的权重共享,一次搬进来,算完所有通道再换。
  2. 片上缓存利用:能放SRAM的别放DRAM。我习惯把最常用的权重和激活值常驻片上。
  3. 计算与搬运重叠:用双缓冲或者乒乓操作,计算的同时搬下一批数据。这样搬运的延迟就被隐藏了。
  4. 量化压缩:INT8比FP32数据量少4倍,搬运能耗也少4倍。这个性价比极高。

个人经验:我在做某个视觉模型部署时,发现模型有大量重复的权重访问模式。于是做了个简单的数据预取策略——提前把下一层需要的权重搬到SRAM里。就这么一个小改动,整体功耗降了15%。有时候优化不需要多复杂,关键是找对方向。

3.5 能耗模型的计算公式

最后给个实用的能耗模型公式,我平时做方案评估时经常用:

总能耗 = 计算能耗 + 数据搬运能耗

计算能耗 = MAC次数 × 单次MAC能耗
数据搬运能耗 = Σ(各级存储访问次数 × 对应能耗)

其中:
- 单次MAC能耗 ≈ 0.2-5pJ(取决于数据类型和工艺)
- SRAM访问能耗 ≈ 1-5pJ/bit
- DRAM访问能耗 ≈ 50-100pJ/bit

嗯,这个公式看着简单,但用起来很有效。你只要把模型的计算图和存储层次画出来,就能估算出大概的能耗分布。我每次做方案选型前都会先跑一遍这个模型,看看瓶颈在哪。

好了,这一节就到这。记住一句话:算力是成本,数据搬运是更大的成本。下一节咱们聊聊具体的量化技术怎么落地。