CANN编程 Global Memory 与 Local Memory 详解
·
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)片上存储
- 访问主体:
- 主机CPU(通过PCIe读写)
- NPU的各计算核(Vector、Cube、Scalar单元)
- Data Copy单元(数据搬运硬件)
2. 核心特性
- 容量极大:GB级别,存放完整算子输入、输出、权重、偏置、中间大张量
- 带宽低、延迟高
- 相比片上Local/Buffer,访存延迟数百周期
- 大量随机读会严重拖慢算子性能,是性能瓶颈头号来源
- 所有核共享:多个AI Core共用同一块全局内存,存在访问竞争
- 数据持久:程序运行期间数据一直保留,不会随单次核执行销毁
- 数据交互唯一通道:
CPU → Global Memory → AI Core;AI Core计算结果写回 Global Memory → CPU读取
3. 开发场景
- 算子入参
gm_data、gm_weight、gm_output都是全局内存指针 - 必须通过
DataCopy搬运数据到片上Local内存才能高速计算 - 大尺寸特征图、模型权重全部存在Global Memory
二、Local Memory 局部内存(本地内存,片上存储)
1. 定义
每个AI Core独立独占的片上高速存储,集成在AI Core内部,只给当前这一个计算核使用,也常简称Local。
昇腾架构中Local包含两块关键存储:
- L0A/L0B:Cube单元专用权重/输入缓存
- L1 Buffer:Vector通用数据缓存(日常开发说的Local大多指L1)
2. 核心特性
- 核私有隔离:一个AI Core的Local,其他AI Core完全无法访问,无竞争
- 超高带宽、极低延迟:片上SRAM,访存延迟仅几个周期,计算读写最优介质
- 容量极小:KB~MB级别(如910B单Core L1仅数MB),空间极度受限
- 生命周期短:AI Core执行完一次任务后,Local数据自动失效清空
- 不能直接和CPU交互:CPU无法读写Local,必须先经过Global中转
3. 开发约束与用法
- 不能直接对Local做主机读写,流程固定:
Global Memory → DataCopy → Local Memory → Vector/Cube计算 → DataCopy写回 Global - 开发中用
LocalTensor、LocalAddr定义局部内存变量 - 受空间限制,必须做分块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算子标准数据流(串联两者)
- CPU将模型数据拷贝至 Global Memory
- AI Core启动Data Copy硬件,从Global搬运一小块数据到 Local Memory
- Vector/Cube单元读取Local高速完成乘加、激活等计算
- 计算完将Local结果通过Data Copy写回 Global Memory
- 全部分块计算完成后,CPU从Global读取最终输出
五、常见开发踩坑点
- 直接循环读取Global做计算:性能暴跌,标准错误写法;必须先搬Local再计算
- Tiling分块过大:Local内存不足,编译/运行报out of local memory
- 多AI Core频繁并发读写同一块Global地址:产生访存瓶颈,吞吐量下降
- 忘记Local数据生命周期:单次任务结束后Local变量不可复用,需重新从Global加载
更多推荐



所有评论(0)