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存储空间大小对齐要求源码值bitsUB192KB32BUbSize1572864, UbAlignSize256L1512KB32BL1Size4194304, L1AlignSize256L0A64KB-L0aSize524288L0B64KB-L0bSize524288L0C128KB512BL0cSize1048576, L0cAlignSize4096Ascend310B 系列源文件NPUTargetSpec.td:156-166存储空间大小对齐要求源码值bitsUB256KB32BUbSize2097152, UbAlignSize256L11024KB32BL1Size8388608, L1AlignSize256L0A64KB-L0aSize524288L0B64KB-L0bSize524288L0C128KB512BL0cSize1048576, L0cAlignSize4096Ascend910_95 / 950PR / 950DT 系列源文件NPUTargetSpec.td:196-208存储空间大小对齐要求源码值bitsUB248KB预留 8KB32BUbSize2031616, UbAlignSize256DCache32KB ~ 120KB-MinimalDCacheSize262144, MaximumDCacheSize983040L1512KB32BL1Size4194304, L1AlignSize256L0A64KB-L0aSize524288L0B64KB-L0bSize524288L0C256KB512BL0cSize2097152, L0cAlignSize4096数据通路详解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_spacecbuf memref?x?x?x?xf32, #hivm.address_spacecc memref256x256xf16, #hivm.address_spacegm源-目标地址空间到 Pipeline 的映射源文件HIVMDMAOps.cpp:616-622源地址空间目标地址空间PipelineIR 操作说明GML1PIPE_MTE2hivm.nd2nzGM 到 L1支持 ND-NZ 转换GMUBPIPE_MTE2hivm.loadGM 到 UB支持 PaddingL1GMPIPE_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 到 UBL0A/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详细步骤MTE2: 从 GM 加载矩阵 A、矩阵 B 数据到 L1MTE2: 从 GM 加载 Bias 数据到 L1MTE1: 从 L1 加载矩阵 A 数据到 L0AMTE1: 从 L1 加载矩阵 B 数据到 L0BMTE1: 从 L1 加载 Bias 数据到 BT BufferM: Cube 执行矩阵乘法结果写入 L0CFIX: L0C 数据通过 FixPipe 输出到 GM/L1/UBVector 数据通路Vector 计算路径从 GM 加载数据到 UB在 UB 中完成向量计算后写回 GM。GM ──[MTE2]──▶ UB ──[V]──▶ UB ──[MTE3]──▶ GM910_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]──▶ GMUB - L1 通路Vector 处理后的数据可从 UB 搬运到 L1供后续 Cube 操作使用。随路操作汇总表随路操作是指在数据搬运过程中由硬件 DMA 引擎自动完成的附加操作无需额外的计算指令。Pipeline数据流向支持的随路操作IR 属性/操作备注MTE1L1 - L0A/L0B矩阵转置a_transpose/b_transpose在mmadL1等操作中设置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_num在hivm.load中设置MTE2GM - UB隐式转置may_implicit_transpose_with_last_axis在hivm.load中设置MTE3UB - GM原子操作atomic_kind支持 add, max, min, and, or, xor, CAS, XCHGMTE3UB - GM隐式转置may_implicit_transpose_with_last_axis在hivm.store中设置FIXL0C - GM/L1/UB预量化pre_quantFP32-FP16, FP32-BF16, INT32-INT8FIXL0C - GM/L1/UB预激活pre_reluReLU, Leaky ReLU, P-ReLUFIXL0C - GM/L1/UB布局转换dma_modeNZ2ND, NZ2DN, NZ2NZFIXL0C - UB双目标模式dual_dst_modeROW_SPLIT, COLUMN_SPLIT仅 950 系列FIXL0C - GM/L1/UBChannel Splitchannel_split仅 950 系列紧耦合缓冲区TightlyCoupledBuffer源文件HIVMAttrs.td:1010-1017紧耦合缓冲区是Ascend950 架构特有的 CVCube-Vector通信机制用于在 Cube 操作和 Vector 操作之间高效传递数据无需经过全局内存中转。IR 表示#hivm.tightly_coupled_bufferid : optionali32工作原理紧耦合缓冲区通过InsertCVTightCoupledBufferPass 在 Fixpipe 和 Vector 操作之间插入支持两种数据搬运模式模式数据流向说明MoveToUbL0C - UB将 Cube 计算结果从 L0C 直接搬运到 UBMoveToL1UB - L1将 Vector 处理后的数据从 UB 搬运到 L1Pipeline 选择逻辑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基类中只定义了UbAlignSize、L1AlignSize和L0cAlignSize三个对齐字段L0A/L0B 的对齐要求未在 TableGen 中显式描述。Q: 950 系列的 UB - L1 通路使用哪个 PipelineA: 根据源码 HIVMDMAOps.cpp:616-622{AddressSpace::UB, AddressSpace::L1}映射到PIPE::PIPE_MTE3。Q:hivm.copy操作支持哪些地址空间组合A: 根据源码 HIVMDMAOps.cpp:440-448copy支持的组合为UB - UB和GM - 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),仅供参考