CANN/cannbot-skills Blaze框架总览

📅 2026/7/16 18:20:23
CANN/cannbot-skills Blaze框架总览
Blaze 框架总览【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills适用平台DAV_3510 / Ascend 950 / CANN 9.1.0本文介绍 NPU 执行模型、三层抽象栈、Tensor API 核心概念、Blaze 分层架构和两条开发路径。1. NPU 执行模型1.1 存储层级与数据流昇腾 NPU Cube 单元的存储层级和数据流┌─────────────────────────────────────────────┐ │ GM (Global Memory / DDR) │ └────┬──────────────────────────────┬─────────┘ │ MTE1 │ MTE3 ▼ ▲ ┌─────────────────────────────────────────────┐ │ L1 (片上 SRAM, ~512 KB) │ └────┬──────────────┬──────────────┬──────────┘ │ MTE2 │ MTE2 │ ▼ ▼ │ ┌──────────┐ ┌──────────┐ │ │ L0A │ │ L0B │ │ │ (~64KB) │ │ (~64KB) │ │ └────┬─────┘ └────┬─────┘ │ └──────┬──────┘ │ ▼ │ ┌──────────────┐ │ │ MMAD │ │ │ C A × B │ │ └──────┬───────┘ │ ▼ │ ┌──────────────┐ │ │ L0C (~256KB)│ │ └──────┬───────┘ │ │ Fixpipe │ └──────────────────────┘1.2 传输引擎与计算单元组件功能方向MTE1GM ↔ L1 搬运矩阵 A/B 从 DDR 加载到片上MTE2L1 ↔ L0A/L0B/UB 搬运tile 从 L1 送入 Cube 输入或 Vector 工作区MTE3 (Fixpipe)L0C → GM 搬出累加结果写回 DDR支持 Cast/量化Cube (M)矩阵乘累加C_tile A_tile × B_tileVector (V)向量计算非矩阵乘运算加 bias、激活、Cast 等1.3 核心类型核心包含单元用途AIC(AI Cube)Cube Vector MTE1/2/3 Fixpipe矩阵乘主核AIV(AI Vector)Vector MTE2/3向量计算核用于 epilogue 后处理混合核启动__mix__(aicCount, aivCount)指定 AIC/AIV 核数比例。1.4 缓冲区尺寸DAV_3510缓冲区容量用途L1512 KBA/B 矩阵 tile 暂存支持双缓冲 ping-pongL0A64 KBCube 输入 AL0B64 KBCube 输入 BL0C256 KBCube 累加器FP32UB256 KBVector 工作区1.5 事件同步概述各引擎之间通过HardEvent同步。DataCopy/DataCopyPad 是异步 DMA必须通过SetFlag/WaitFlag确保消费者在读数据前生产者已完成。MTE1 ──SetFlag(MTE1_MTE2)──▶ MTE2 // GM→L1 完成后通知 L1→L0 MTE2 ──SetFlag(MTE2_MTE1)──▶ MTE1 // L1→L0 完成后通知下一轮 GM→L1 MTE1 ──SetFlag(MTE1_M)──▶ Cube // L0 加载完成通知 MMAD Cube ──SetFlag(M_FIX)──▶ Fixpipe // MMAD 完成通知 L0C 搬出完整的事件枚举、配对规则和 CrossCore 核间同步详见blaze-sync-patterns.md。2. 三层抽象栈Blaze 生态构建在三层抽象之上每层封装不同级别的硬件细节┌─────────────────────────────────────────────────────────┐ │ Blazeinclude/blaze/ │ │ 完整矩阵乘 Kernel 实现Block 调度、策略分发、Epilogue │ │ 组装式开发选择 Kernel BlockMmad Scheduler Epilogue│ ├─────────────────────────────────────────────────────────┤ │ Tensor APIinclude/tensor_api/ │ │ 张量抽象Layout 推导、Copy/Mmad 算法接口、Routing 派发 │ │ 编译时最大化Pattern 决定派发零运行时开销 │ ├─────────────────────────────────────────────────────────┤ │ AscendC 原语kernel_operator.h │ │ 硬件指令DataCopyPad、Mmad、SetFlag/WaitFlag │ │ 手动管理 buffer、layout、事件同步 │ └─────────────────────────────────────────────────────────┘层级开发者做什么框架封装什么AscendC 原语手动管理所有 buffer 偏移、layout 构造、事件同步无Tensor API指定 Pattern Type调用 Copy/MmadLayout 推导、Routing 派发、硬件指针类型安全Blaze选择组件Policy BlockMmad Scheduler填充 Params完整 tile 循环、双缓冲管理、事件同步、K 迭代3. Tensor API 核心概念Tensor API 是 header-only 库命名空间AscendC::Te唯一公共入口#include tensor_api/tensor.h。3.1 核心四元组概念类型说明ShapeStd::tuple...维度大小支持嵌套分形 layoutStrideStd::tuple...每维步长CoordStd::tuple...多维坐标LayoutShape Stride InfoInfo tuplePattern, Trait携带编译时标签3.2 Layout Pattern 体系Layout Pattern 是空标签结构体用于编译时路由。13 种 PatternPattern形态主要用途NDExtLayoutPtn二维嵌套 NDGM 入口A 行主序、C 输出DNExtLayoutPtn二维嵌套 DNGM 转置入口NDLayoutPtn普通 NDUB / 内层工作 TensorDNLayoutPtn普通 DNUB / 内层NZLayoutPtnNZ 分形L1 A/B、L0A、GM 入口NZ 预重排ZNLayoutPtnZN 分形L1 A/B转置、L0B、GM 入口ZN 预重排ZZLayoutPtnZZ 分形L1 ScaleAMX 量化NNLayoutPtnNN 分形C02L1 ScaleBMX 量化ScaleANDLayoutPtn/ScaleADNLayoutPtnA 侧 scaleGM → L1 ZZScaleBNDLayoutPtn/ScaleBDNLayoutPtnB 侧 scaleGM → L1 NNDefaultPtn占位内部使用Ext 后缀Ext Extended/外层用于 GM 外部入口的双层嵌套 shape非 Ext 用于内部连续缓冲。Routing 表对 GM ↔ 片上强制区分 Ext / 非 Ext。3.3 C0 速查C0 是分形格式中的元素粒度C0 32 / sizeof(dtype)fp4 例外dtypesizeofC0_ELEMENTbf16 / fp16216fp3248L0C 上仍按 16 处理int8 / fp8_e4m3 / fp8_e5m2132fp4×20.564LayoutTraitFP4fp8_e8m0scale12LayoutTraitScale关键常量FRACTAL_FIXED 16BLOCK_CUBE 16。DAV_3510 上 L0C cube 边长恒为 16不要写成32/sizeof(L0CType)。3.4 FrameLayout 工厂// 根据 Pattern Trait 自动推导正确的 Shape 和 Stride auto layout AscendC::Te::MakeFrameLayoutNDExtLayoutPtn, AscendC::Te::LayoutTraitDefaulthalf(M, K); // NZ 格式自动推导分形 shape ((FRACTAL_FIXED, M1), (C0, N1)) auto nzLayout AscendC::Te::MakeFrameLayoutNZLayoutPtn, AscendC::Te::LayoutTraitDefaulthalf(M, K);3.5 Copy/Mmad Atom 模式Tensor API 使用 Atom 模式封装搬运和计算操作// 1. 构造 Atom编译时 auto copyGM2L1 AscendC::Te::MakeCopy(AscendC::Te::CopyGM2L1{}); auto mmadAtom AscendC::Te::MakeMmad(AscendC::Te::MmadOperation{}, AscendC::Te::MmadTraitDefault{}); // 2. 注入运行时参数 mmadAtom mmadAtom.with(mmadParams); // cmatrixInitVal, unitFlag 等 // 3. 执行dst 在前 AscendC::Te::Copy(copyGM2L1, dstL1Tensor, srcGMTensor); AscendC::Te::Mmad(mmadAtom, dstL0C, srcL0A, srcL0B);3.6 两个关键设计点Pattern 决定派发Routing 表按(dstLocation, srcLocation, archVersion, dstPattern, srcPattern)做编译期派发。Pattern 不在白名单 →static_assert: Unsupported layout pattern。同步是用户责任Tensor API 不接管SetFlag/WaitFlag事件配对由调用方维护Blaze 在 BlockMmad 层封装了事件管理。tensor_api 各 API 的完整签名、参数类型和使用示例详见tensor-api-reference.md§2。 Copy 操作的合法 Pattern 组合路由表详见tensor-api-reference.md§3。4. Blaze 分层架构Blaze 是 header-only C 模板库命名空间Blaze::Gemm构建在 Tensor API 之上。4.1 五层架构┌─────────────────────────────────────────────────────────┐ │ Kernel 层GemmUniversal / MatmulKernel / ... │ │ 最外层入口SFINAE 按 ScheduleType 选择偏特化 │ ├─────────────────────────────────────────────────────────┤ │ Block 层BlockMmad BlockScheduler BlockEpilogue │ │ BlockMmad单 tile 的 K 迭代 双缓冲 事件同步 │ │ BlockSchedulertile 到核的映射蛇形遍历、尾块处理 │ │ BlockEpilogue后处理空操作等 │ ├─────────────────────────────────────────────────────────┤ │ Policy 层DispatchPolicy 标签 │ │ 编译时路由Policy → ScheduleType → SFINAE 选择实现 │ ├─────────────────────────────────────────────────────────┤ │ Tile 层底层搬运/转换原语 │ │ pad_mx_kl1、shift_w4_to_w8、copy_gm_to_ub 等 │ ├─────────────────────────────────────────────────────────┤ │ Epilogue 层后处理融合 │ │ RegBase__VEC_SCOPE__ Reg:: API/ MemBaseAscendC│ └─────────────────────────────────────────────────────────┘4.2 DispatchPolicy 路由DispatchPolicy 是编译时标签驱动 SFINAE 选择正确的 GemmUniversal 和 BlockMmad 偏特化// Policy 定义 struct MatmulMultiBlockBasic { using ScheduleType KernelMmadMultiBlockBasic; }; struct MatmulWithScaleMx { using ScheduleType KernelMmadWithScaleMx; }; // SFINAE 选择 template typename ProblemShape, typename BlockMmad, typename BlockEpilogue, typename BlockScheduler, typename Enable void struct GemmUniversal { static_assert(...); }; // 兜底 template typename PS, typename BM, typename BE, typename BS struct GemmUniversalPS, BM, BE, BS, enable_if_tis_same_vtypename BM::DispatchPolicy::ScheduleType, KernelMmadMultiBlockBasic { /* Basic 实现 */ };4.3 GemmUniversal 四组件组装using KernelImpl Blaze::Gemm::Kernel::GemmUniversal ProblemShape, // 问题规模类型如 MatmulShape 或 Shapeint64_t,int64_t,int64_t,int64_t BlockMmad, // 计算核心含 DispatchPolicy 数据类型 Layout BlockEpilogue, // 后处理void 或 BlockEpilogueEmpty 或自定义 BlockScheduler // tile 调度器 ;4.4 BlockMmad 10 参数签名template typename DispatchPolicy_, // 策略标签驱动 SFINAE typename AType, // A 矩阵数据类型 typename LayoutA, // A 矩阵 Layout Pattern typename BType, // B 矩阵数据类型 typename LayoutB, // B 矩阵 Layout Pattern typename CType, // C 输出数据类型 typename LayoutC, // C 输出 Layout Pattern typename BiasType void, // Bias 数据类型可选 typename LayoutBias void, // Bias Layout Pattern可选 typename Enable void // SFINAE 占位 struct BlockMmad;5. 两条开发路径根据算子类型选择不同的开发路径5.1 路径选择决策算子类型推荐路径理由普通 MatMul 单算子fp16/bf16/fp32路径 Bblaze 库直接组装KernelMatmulBasic BlockMmadMatmulBasic BlockSchedulerMatmulBasic BlockEpilogueEmpty已覆盖常规单算子场景MX 量化 matmulfp8/fp4路径 Bblaze 库直接组装blaze 已封装 Scale 反量化、fp4 shift、K-padding 等复杂逻辑A8W8 量化 matmul路径 Bblaze 库直接组装blaze 已封装 Fixpipe 反量化路径matmul vector epilogue 融合路径 A自定义AIC/AIV 混合核 CrossCore 同步 自定义 EpilogueGrouped matmul路径 A自定义需要 GroupScheduler per-group 迭代逻辑5.2 路径 A自定义tensor_api 手写 kernel/blockLauncher (.cpp) ├── 选择类型AType/BType/CType ├── 选择 LayoutNDExt/DNExt/NZ/ZN ├── 实例化MatmulKernelProblemShape, BlockMmad, BlockScheduler ├── 调用 Tiling 引擎 → 填充 Params └── kernelusedCoreNum(params) 组件来源matmul_blaze_templateinclude/kernel/, include/block/, include/policy/ 依赖仅 tensor_apithird_party/tensor_api/5.3 路径 Bblaze 库直接组装Launcher (.cpp) ├── 选择 blaze DispatchPolicy普通 MatMul 用 MatmulMultiBlockBasicMX 量化用 MatmulWithScaleMx ├── 实例化Blaze::Gemm::Block::BlockMmadDispatchPolicy, ... ├── 实例化Blaze::Gemm::Kernel::GemmUniversalProblemShape, BlockMmad, BlockEpilogue, BlockScheduler ├── 调用 Tiling 引擎 → 填充 Params └── kernelusedCoreNum(params) 组件来源ops-tensor 仓include/blaze/ 依赖tensor_api blazethird_party/tensor_api/ third_party/blaze/各路径的完整端到端组装代码详见blaze-matmul-assembly.md。 可用模板的完整清单和场景推荐详见blaze-template-catalog.md。6. NZ 分形格式NZ 是昇腾 NPU 的分形存储格式用于 Cube 硬件高效读取。6.1 物理排列对原始 tensor(dim0, dim1)的 ND 排布NZ 格式的物理排列为(dim1/C0, dim0/16, 16, C0)其中C0 32 / sizeof(dtype)。非对齐时先补 0 到 16 对齐。6.2 与 ND 的 shape 对应矩阵transformat物理排列LayoutPtnA[M,K]falseND(M, K)NDExtLayoutPtnA[M,K]falseNZ(K/C0, M/16, 16, C0)NZLayoutPtnA[M,K]trueND(K, M)DNExtLayoutPtnA[M,K]trueNZ(M/C0, K/16, 16, C0)ZNLayoutPtnB[K,N]falseND(K, N)NDExtLayoutPtnB[K,N]falseNZ(N/C0, K/16, 16, C0)NZLayoutPtnB[K,N]trueND(N, K)DNExtLayoutPtnB[K,N]trueNZ(K/C0, N/16, 16, C0)ZNLayoutPtnA/B 矩阵在全部 trans×format 组合下的 LayoutPtn 映射和数据生成方法详见blaze-matmul-layout.md§1-§2。7. 平台信息速查7.1 架构检测// 编译时 #if __NPU_ARCH__ 3510 // DAV_3510 特化代码 #endif // tensor_api 内部 constexpr uint32_t CURRENT_ARCH_VERSION GetArchVersion{}(); // 取自 __NPU_ARCH__7.2 Host 侧平台查询#include platform_ascendc.h auto mgr platform_ascendc::PlatformAscendCManager::GetInstance(); int aicNum mgr.GetCoreNumAiv(); // AIC 核数 int l1Size mgr.GetCoreMemSize(1); // L1 容量字节 int ubSize mgr.GetCoreMemSize(0); // UB 容量字节7.3 Kernel 侧编译时常量// BlockMmad 中常用 constexpr int HALF_L0_SIZE TOTAL_L0A_SIZE / 2 / sizeof(AType); constexpr int HALF_L1_SIZE TOTAL_L1_SIZE / 2; constexpr int MATMUL_L0C_SIZE 256 * 1024; // L0C 容量字节7.4 Kernel 侧运行时内建int blockIdx GetBlockIdx(); // 当前核 ID int blockNum GetBlockNum(); // 总核数 int taskRatio GetTaskRation(); // AIC/AIV 比例混合核场景【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考