news 2026/7/11 15:32:26

CANN/cannbot-skills内存层次详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/cannbot-skills内存层次详解

内存层次详解

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

关键词:AddressSpace, GM, L1, L0A, L0B, L0C, UB, MTE2, MTE1, MTE3, FIX, 数据通路, 随路操作, 紧耦合缓冲区

概述

Ascend NPU 的内存层次是其计算性能的关键基础。与通用处理器不同,NPU 的各级存储空间与特定的计算单元和执行流水线紧密绑定,数据在不同存储层次之间的搬运由专用的 DMA 引擎(MTE 系列 Pipeline)完成,而非通过统一的缓存层次自动管理。

理解内存层次对于编写高效的 HIVM IR 至关重要:每个memref必须通过#hivm.address_space<...>属性标注其所在的存储空间,每个数据搬运操作必须使用正确的 Pipeline,且不同存储空间之间的数据通路存在严格的硬件约束。

本文档从 NPUTargetSpec.td 和 HIVMAttrs.td 中精确提取各级存储的容量、对齐要求和数据通路信息。

完整内存层次

通用可寻址存储空间

层次IR 标识符枚举值说明所属计算单元
GMgm1全局内存 (HBM/L2),设备外部存储所有单元共享
L1cbuf2一级缓存Cube 单元
L0Aca3矩阵 A 输入缓存Cube A 端
L0Bcb4矩阵 B 输入缓存Cube B 端
L0Ccc5矩阵乘法结果缓存Cube C 端
UBub6统一缓冲区Vector 单元

专用硬件缓冲区

缓冲区大小对齐说明访问方式
BT Buffer (BiasTable)1KB64B存放矩阵乘法的 Bias 数据通过copy_cbuf_to_bt从 L1 拷贝
FP Buffer (FixPipe)7KB128BFixPipe 流水线的中间缓冲区通过hivm.fixpipe隐式使用

各级存储的容量和对齐要求

Ascend910B / 910_93 系列

源文件:NPUTargetSpec.td:64-74

存储空间大小对齐要求源码值(bits)
UB192KB32BUbSize=1572864, UbAlignSize=256
L1512KB32BL1Size=4194304, L1AlignSize=256
L0A64KB-L0aSize=524288
L0B64KB-L0bSize=524288
L0C128KB512BL0cSize=1048576, L0cAlignSize=4096

Ascend310B 系列

源文件:NPUTargetSpec.td:156-166

存储空间大小对齐要求源码值(bits)
UB256KB32BUbSize=2097152, UbAlignSize=256
L11024KB32BL1Size=8388608, L1AlignSize=256
L0A64KB-L0aSize=524288
L0B64KB-L0bSize=524288
L0C128KB512BL0cSize=1048576, L0cAlignSize=4096

Ascend910_95 / 950PR / 950DT 系列

源文件:NPUTargetSpec.td:196-208

存储空间大小对齐要求源码值(bits)
UB248KB(预留 8KB)32BUbSize=2031616, UbAlignSize=256
DCache32KB ~ 120KB-MinimalDCacheSize=262144, MaximumDCacheSize=983040
L1512KB32BL1Size=4194304, L1AlignSize=256
L0A64KB-L0aSize=524288
L0B64KB-L0bSize=524288
L0C256KB512BL0cSize=2097152, L0cAlignSize=4096

数据通路详解

AddressSpace 枚举与硬件存储的完整映射表

源文件:HIVMAttrs.td:171-197

枚举值C++ 符号数值IR 标识符硬件存储说明
ZeroAddressSpace::Zero0zero-默认/零地址空间
GMAddressSpace::GM1gmHBM/L2全局内存
L1AddressSpace::L12cbufL1 CacheCube 一级缓存
L0AAddressSpace::L0A3caL0A Buffer矩阵 A 输入缓存
L0BAddressSpace::L0B4cbL0B Buffer矩阵 B 输入缓存
L0CAddressSpace::L0C5ccL0C Buffer矩阵乘法结果缓存
UBAddressSpace::UB6ubUB统一缓冲区

IR 使用示例:

memref<?x?x?x?xf32, #hivm.address_space<cbuf>> memref<?x?x?x?xf32, #hivm.address_space<cc>> memref<256x256xf16, #hivm.address_space<gm>>

源-目标地址空间到 Pipeline 的映射

源文件:HIVMDMAOps.cpp:616-622

源地址空间目标地址空间PipelineIR 操作说明
GML1PIPE_MTE2hivm.nd2nzGM 到 L1,支持 ND->NZ 转换
GMUBPIPE_MTE2hivm.loadGM 到 UB,支持 Padding
L1GMPIPE_MTE2copy_cbuf_to_gmL1 到 GM,支持 NZ->ND 转换
L1L0APIPE_MTE1内部指令L1 到矩阵 A 缓存
L1L0BPIPE_MTE1内部指令L1 到矩阵 B 缓存
L1BT BufferPIPE_MTE1copy_cbuf_to_btL1 到 Bias Table 缓存
L1UBPIPE_MTE1hivm.l12ubL1 到 UB
L0A/L0BL0CPIPE_MCube 计算矩阵乘法
L0CGMPIPE_FIXhivm.fixpipeL0C 到全局内存
L0CL1PIPE_FIXhivm.fixpipeL0C 到 L1 缓存
L0CUBPIPE_FIXhivm.fixpipeL0C 到 UB(仅 950 系列)
UBUBPIPE_Vhivm.copyUB 内复制
UBGMPIPE_MTE3hivm.storeUB 到全局内存
UBL1PIPE_MTE3hivm.copyUB 到 L1(仅 950 系列)

Cube 数据通路

Cube 计算路径涉及从 GM 加载数据到 L1,再从 L1 加载到 L0A/L0B,经 Cube 计算后结果写入 L0C,最后通过 FixPipe 输出。

GM ──[MTE2]──▶ L1 ──[MTE1]──▶ L0A/L0B/BT Buffer ──[M]──▶ L0C ──[FIX]──▶ GM/L1/UB

详细步骤:

  1. MTE2: 从 GM 加载矩阵 A、矩阵 B 数据到 L1
  2. MTE2: 从 GM 加载 Bias 数据到 L1
  3. MTE1: 从 L1 加载矩阵 A 数据到 L0A
  4. MTE1: 从 L1 加载矩阵 B 数据到 L0B
  5. MTE1: 从 L1 加载 Bias 数据到 BT Buffer
  6. M: Cube 执行矩阵乘法,结果写入 L0C
  7. FIX: L0C 数据通过 FixPipe 输出到 GM/L1/UB

Vector 数据通路

Vector 计算路径从 GM 加载数据到 UB,在 UB 中完成向量计算后写回 GM。

GM ──[MTE2]──▶ UB ──[V]──▶ UB ──[MTE3]──▶ GM

910_95 特殊通路

Ascend950 架构引入了两条特殊数据通路:

L0C -> UB 直通通路:Cube 计算结果可直接通过 FixPipe 输出到 UB,无需经过 GM 中转。这使得 Cube-Vector 混合计算路径更高效:

910_95: GM ──[MTE2]──▶ L1 ──[MTE1]──▶ L0A/L0B ──[M]──▶ L0C ──[FIX]──▶ UB ──[V]──▶ UB ──[MTE3]──▶ GM 非910_95: GM ──[MTE2]──▶ L1 ──[MTE1]──▶ L0A/L0B ──[M]──▶ L0C ──[FIX]──▶ GM ──[MTE2]──▶ UB ──[V]──▶ UB ──[MTE3]──▶ GM

UB -> L1 通路:Vector 处理后的数据可从 UB 搬运到 L1,供后续 Cube 操作使用。

随路操作汇总表

随路操作是指在数据搬运过程中,由硬件 DMA 引擎自动完成的附加操作,无需额外的计算指令。

Pipeline数据流向支持的随路操作IR 属性/操作备注
MTE1L1 -> L0A/L0B矩阵转置a_transpose/b_transposemmadL1等操作中设置
MTE1L1 -> L0A/L0B布局转换zN <-> nZ支持格式互转
MTE2GM -> L1ND -> NZ 布局转换hivm.nd2nz将 ND 格式转为 NZ 格式
MTE2L1 -> GMNZ -> ND 布局转换hivm.nz2nd将 NZ 格式转为 ND 格式
MTE2GM -> UBPaddingpad_mode,pad_value,left_padding_num,right_padding_numhivm.load中设置
MTE2GM -> UB隐式转置may_implicit_transpose_with_last_axishivm.load中设置
MTE3UB -> GM原子操作atomic_kind支持 add, max, min, and, or, xor, CAS, XCHG
MTE3UB -> GM隐式转置may_implicit_transpose_with_last_axishivm.store中设置
FIXL0C -> GM/L1/UB预量化pre_quantFP32->FP16, FP32->BF16, INT32->INT8
FIXL0C -> GM/L1/UB预激活pre_reluReLU, Leaky ReLU, P-ReLU
FIXL0C -> GM/L1/UB布局转换dma_modeNZ2ND, NZ2DN, NZ2NZ
FIXL0C -> UB双目标模式dual_dst_modeROW_SPLIT, COLUMN_SPLIT(仅 950 系列)
FIXL0C -> GM/L1/UBChannel Splitchannel_split仅 950 系列

紧耦合缓冲区(TightlyCoupledBuffer)

源文件:HIVMAttrs.td:1010-1017

紧耦合缓冲区是Ascend950 架构特有的 CV(Cube-Vector)通信机制,用于在 Cube 操作和 Vector 操作之间高效传递数据,无需经过全局内存中转。

IR 表示

#hivm.tightly_coupled_buffer<id : optional<i32>>

工作原理

紧耦合缓冲区通过InsertCVTightCoupledBufferPass 在 Fixpipe 和 Vector 操作之间插入,支持两种数据搬运模式:

模式数据流向说明
MoveToUbL0C -> UB将 Cube 计算结果从 L0C 直接搬运到 UB
MoveToL1UB -> L1将 Vector 处理后的数据从 UB 搬运到 L1

Pipeline 选择逻辑

if (isAscend950(target)) { if (enableLayoutOptimization) { InsertCVDataMovement // A5 新布局优化路径 } else { InsertCVTightCoupledBuffer // 传统紧耦合缓冲区路径 } } else { InsertLoadStoreForMixCV // 非 950 设备的混合 CV 路径 }

数据流 ASCII 图

Ascend910B / 910_93 架构

+-----------------------------------------------------------------------------+ | Global Memory (GM / HBM) | +---------------------------------------+-------------------------------------+ | +-------------------+-------------------+ | | +-----v-----+ +-----v-----+ | MTE2 | | MTE2 | | GM -> L1 | | GM -> UB | | (双向) | | (单向) | +-----+-----+ +-----+-----+ | | v v +-----------------------+ +-----------------+ | L1 | | UB | | (cbuf, 512KB) | | (ub, 192KB) | | Cube输入缓存 | | Vector工作区 | +-----------+-----------+ +--------+--------+ | | +-----------+-----------+ | | | | | +-----v-----+ +---v---+ +-----v-----+ | | MTE1 | | MTE1 | | MTE1 | | | L1 -> L0A | |L1->L0B| |L1 -> BT Buf| | +-----+-----+ +---+---+ +-----+-----+ | | | | | v v v | +-----------+ +-----------+ +-----------+ | | L0A | | L0B | | BT Buffer | | | (ca,64KB) | | (cb,64KB) | | (1KB) | | | 矩阵A输入 | | 矩阵B输入 | | Bias数据 | | +-----+-----+ +-----+-----+ +-----+-----+ | | | | | +-------------+-------------+ | | | v | +------------------+ | | Cube | | | (MatMul) | | +--------+---------+ | | | v | +------------------+ | | L0C | | | (cc, 128KB) | | | 矩阵乘法结果 | | +--------+---------+ | | | +-----------+-----------+ | | | | | +-----v-----+ +---v---+ | | FIX | | FIX | | | L0C -> GM | |L0C->L1| | +-----+-----+ +---+---+ | | | | v v | +-----------+ +-----------+ | | GM | | L1 | | +-----------+ +-----------+ | | +-------------------------------+ | +-----v-----+ | MTE3 | | UB -> GM | | (单向) | +-----+-----+ | v +-----------+ | GM | +-----------+

Ascend910_95 / 950PR / 950DT 架构

+-----------------------------------------------------------------------------+ | Global Memory (GM / HBM) | +---------------------------------------+-------------------------------------+ | +-------------------+-------------------+ | | +-----v-----+ +-----v-----+ | MTE2 | | MTE2 | | GM -> L1 | | GM -> UB | | (双向) | | (单向) | +-----+-----+ +-----+-----+ | | v v +-----------------------+ +----------------------+ | L1 | | UB | | (cbuf, 512KB) | | (ub, 248KB,预留8KB) | | Cube输入缓存 | | Vector工作区 | +-----------+-----------+ +--------+-------------+ | | +-----------+-----------+ | | | | | +-----v-----+ +---v---+ +-----v-----+ | | MTE1 | | MTE1 | | MTE1 | | | L1 -> L0A | |L1->L0B| |L1 -> BT Buf| | +-----+-----+ +---+---+ +-----+-----+ | | | | | v v v | +-----------+ +-----------+ +-----------+ | | L0A | | L0B | | BT Buffer | | | (ca,64KB) | | (cb,64KB) | | (1KB) | | | 矩阵A输入 | | 矩阵B输入 | | Bias数据 | | +-----+-----+ +-----+-----+ +-----+-----+ | | | | | +-------------+-------------+ | | | v | +------------------+ | | Cube | | | (MatMul) | | +--------+---------+ | | | v | +------------------+ | | L0C | | | (cc, 256KB) | | | 矩阵乘法结果 | | +--------+---------+ | | | +-----------+-----------+-----------+ | | | | | | +-----v-----+ +---v---+ +-----v-----+ | | | FIX | | FIX | | FIX | | | | L0C -> GM | |L0C->L1| | L0C -> UB |<----+ | | | | | | (950特有) | | +-----+-----+ +---+---+ +-----+-----+ | | | | | v v v | +-----------+ +-----------+ +----------------------+ | | GM | | L1 | | UB (紧耦合缓冲区) |<---------+ +-----------+ +-----------+ +----------+-----------+ | | | +-----v-----+ | | MTE3 | | | UB -> GM | | +-----+-----+ | | | v | +-----------+ | | GM | | +-----------+ |

常见问题

Q: 为什么 L0A/L0B 没有对齐要求字段?A: 在 NPUTargetSpec.td 的TargetSpec基类中,只定义了UbAlignSizeL1AlignSizeL0cAlignSize三个对齐字段,L0A/L0B 的对齐要求未在 TableGen 中显式描述。

Q: 950 系列的 UB -> L1 通路使用哪个 Pipeline?A: 根据源码 HIVMDMAOps.cpp:616-622,{AddressSpace::UB, AddressSpace::L1}映射到PIPE::PIPE_MTE3

Q:hivm.copy操作支持哪些地址空间组合?A: 根据源码 HIVMDMAOps.cpp:440-448,copy支持的组合为:UB -> UBGM -> L1。对于 950 系列还额外支持UB -> L1

Q: 紧耦合缓冲区和普通数据通路有什么区别?A: 紧耦合缓冲区是 950 架构特有的 CV 通信机制,它允许 Cube 和 Vector 之间直接传递数据而无需经过 GM 中转。普通数据通路中,非 950 设备的 Cube 结果必须先写回 GM,再由 Vector 从 GM 加载到 UB。

相关文档

  • 源码参考:NPUTargetSpec.td
  • 源码参考:HIVMAttrs.td
  • 源码参考:HIVMDMAOps.td
  • 源码参考:HIVMDMAOps.cpp
  • 上一节:01-npu-hardware-overview.md — NPU 硬件架构总览
  • 下一节:03-pipeline-execution-model.md — Pipeline 执行模型

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 15:32:14

Support App API参考:开发者接口使用详解

Support App API参考&#xff1a;开发者接口使用详解 【免费下载链接】SupportApp The Support App is developed by Root3, specialized in managing Apple devices. Root3 offers consultancy and support for organizations to get the most out of their Apple devices and…

作者头像 李华
网站建设 2026/7/11 15:27:01

Flipper Zero固件本地化实战:如何为开源硬件添加多语言支持

Flipper Zero固件本地化实战&#xff1a;如何为开源硬件添加多语言支持 【免费下载链接】flipperzero-firmware Flipper Zero firmware source code 项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware Flipper Zero作为一款功能强大的开源硬件平台…

作者头像 李华
网站建设 2026/7/11 15:21:37

终极Windows更新修复指南:一键重置工具让你轻松搞定更新问题

终极Windows更新修复指南&#xff1a;一键重置工具让你轻松搞定更新问题 【免费下载链接】Script-Reset-Windows-Update-Tool This script reset the Windows Update Components. 项目地址: https://gitcode.com/gh_mirrors/sc/Script-Reset-Windows-Update-Tool 你是否…

作者头像 李华
网站建设 2026/7/11 15:08:32

CANNBot IR分析优化器

IR 分析优化器 【免费下载链接】cannbot-skills CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体&#xff0c;本仓库为其提供可复用的 Skills 模块。 项目地址: https://gitcode.com/cann/cannbot-skills 概述 IR&#xff08;中间表示&#xff09;分析优化器通…

作者头像 李华
网站建设 2026/7/11 15:04:15

Firestorm安全最佳实践:保护你的社区数据

Firestorm安全最佳实践&#xff1a;保护你的社区数据 【免费下载链接】firestorm An open-source forum engine, with an ElixirPhoenix backend and an Elm frontend. 项目地址: https://gitcode.com/gh_mirrors/fi/firestorm Firestorm作为一款开源论坛引擎&#xff0…

作者头像 李华