CANN编程 Global Memory 与 Local Memory 详解

CANN(Compute Architecture for Neural Networks,昇腾AI芯片算子开发架构)面向昇腾NPU(Ascend 310/310P/910/910B/310B等),两类内存是算子开发最核心的存储层级,带宽、延迟、容量、访问主体完全不同

一、Global Memory 全局内存

1. 定义

位于NPU外部的大容量DDR内存(设备显存),是芯片和主机CPU交互的唯一存储介质,也是算子输入输出数据的源头/终点。

  • 硬件位置:板载DDR,不属于AI核(Vector Core/Mac Core)片上存储
  • 访问主体:
    1. 主机CPU(通过PCIe读写)
    2. NPU的各计算核(Vector、Cube、Scalar单元)
    3. Data Copy单元(数据搬运硬件)

2. 核心特性

  1. 容量极大:GB级别,存放完整算子输入、输出、权重、偏置、中间大张量
  2. 带宽低、延迟高
    • 相比片上Local/Buffer,访存延迟数百周期
    • 大量随机读会严重拖慢算子性能,是性能瓶颈头号来源
  3. 所有核共享:多个AI Core共用同一块全局内存,存在访问竞争
  4. 数据持久:程序运行期间数据一直保留,不会随单次核执行销毁
  5. 数据交互唯一通道:
    CPU → Global Memory → AI Core;AI Core计算结果写回 Global Memory → CPU读取

3. 开发场景

  • 算子入参 gm_datagm_weightgm_output 都是全局内存指针
  • 必须通过 DataCopy 搬运数据到片上Local内存才能高速计算
  • 大尺寸特征图、模型权重全部存在Global Memory

二、Local Memory 局部内存(本地内存,片上存储)

1. 定义

每个AI Core独立独占的片上高速存储,集成在AI Core内部,只给当前这一个计算核使用,也常简称Local。
昇腾架构中Local包含两块关键存储:

  • L0A/L0B:Cube单元专用权重/输入缓存
  • L1 Buffer:Vector通用数据缓存(日常开发说的Local大多指L1)

2. 核心特性

  1. 核私有隔离:一个AI Core的Local,其他AI Core完全无法访问,无竞争
  2. 超高带宽、极低延迟:片上SRAM,访存延迟仅几个周期,计算读写最优介质
  3. 容量极小:KB~MB级别(如910B单Core L1仅数MB),空间极度受限
  4. 生命周期短:AI Core执行完一次任务后,Local数据自动失效清空
  5. 不能直接和CPU交互:CPU无法读写Local,必须先经过Global中转

3. 开发约束与用法

  1. 不能直接对Local做主机读写,流程固定:
    Global Memory → DataCopy → Local Memory → Vector/Cube计算 → DataCopy写回 Global
  2. 开发中用 LocalTensorLocalAddr 定义局部内存变量
  3. 受空间限制,必须做分块tiling:把Global大张量切分成小块,分批搬运到Local计算,否则直接报内存溢出

三、关键对比表

维度 Global Memory 全局内存 Local Memory 局部内存(片上L0/L1)
硬件位置 芯片外部DDR显存 单个AI Core内部片上SRAM
归属权限 所有AI Core共享 单AI Core独占,核间隔离
容量 GB级,超大 MB/KB级,极小,空间紧张
访存性能 低带宽、高延迟 极高带宽、极低延迟(计算最优)
CPU可直接访问 可以(PCIe) 完全不行,必须经Global中转
多核访问冲突 存在,多Core同时读会降速 无冲突,各核独立
数据生命周期 整个算子运行全程有效 当前AI Core任务执行完即清空
典型数据存放 完整输入输出张量、权重、大中间结果 分块后的小块数据、临时计算缓存
性能优化要点 减少随机访存、连续访存、分块搬运 最大化复用Local数据,减少搬运次数

四、CANN算子标准数据流(串联两者)

  1. CPU将模型数据拷贝至 Global Memory
  2. AI Core启动Data Copy硬件,从Global搬运一小块数据到 Local Memory
  3. Vector/Cube单元读取Local高速完成乘加、激活等计算
  4. 计算完将Local结果通过Data Copy写回 Global Memory
  5. 全部分块计算完成后,CPU从Global读取最终输出

五、常见开发踩坑点

  1. 直接循环读取Global做计算:性能暴跌,标准错误写法;必须先搬Local再计算
  2. Tiling分块过大:Local内存不足,编译/运行报out of local memory
  3. 多AI Core频繁并发读写同一块Global地址:产生访存瓶颈,吞吐量下降
  4. 忘记Local数据生命周期:单次任务结束后Local变量不可复用,需重新从Global加载
Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐