CANN/ops-tensor量化矩阵乘Block文档 Block Mmad A8W8 Fixpipe Quant【免费下载链接】ops-tensorops-tensor 是 CANN Compute Architecture for Neural Networks算子库中提供张量类计算的基础算子库采用模块化设计支持灵活的算子开发和管理。项目地址: https://gitcode.com/cann/ops-tensor代码位置功能说明Fixpipe 量化矩阵乘 Block基于 Tensor API 实现仅支持 AIC 计算。该组件执行由AType/BType指定的量化 A/B Cube Mmad 累加并在 L0C 搬出阶段通过 Fixpipe 完成反量化适用于 QBMM Cube Kernel 场景。文件名沿用 A8W8 路径命名但实际输入类型不限定为int8_t。继承自Block Mmad 基础框架特殊约束调度策略限制仅支持以下调度策略MatmulWithScaleFixpipeQuant非全载模式MatmulWithScaleFixpipeQuantA_FULL_LOAD_MODEA 矩阵全载模式MatmulWithScaleFixpipeQuant0, trueAtomic Add 非全载模式MatmulWithScaleFixpipeQuantA_FULL_LOAD_MODE, trueAtomic Add A 矩阵全载模式MatmulWithScaleFixpipeQuant的ScheduleType固定为KernelMmadWithScaleFixpipeQuant。Atomic Add 标志由 Kernel 层读取并配置Block 内部不直接设置 atomic 状态。不支持MatmulWithScaleMx、GroupedMatmulWithScaleMx、MatmulMultiBlockBasic或MatmulMultiBlockWithStreamK。量化数据类型支持数据类型说明C0_SIZEint8_tA8W8 量化输入由C0_ELEMENTAType决定通常为 32hifloat8_tHiFloat8 量化输入由C0_ELEMENTAType决定通常为 32fp8_e5m2_tFP8 E5M2 量化输入由C0_ELEMENTAType决定通常为 32fp8_e4m3fn_tFP8 E4M3FN 量化输入由C0_ELEMENTAType决定通常为 32说明A 矩阵类型由AType指定。B 矩阵模板参数为BTypeTuple其中第 0 个类型为 B 数据类型第 1 个类型为 X2 scale GM 类型。典型 A/B 组合包括int8_t/int8_t、hifloat8_t/hifloat8_t、fp8_e4m3fn_t/fp8_e4m3fn_t、fp8_e4m3fn_t/fp8_e5m2_t、fp8_e5m2_t/fp8_e4m3fn_t和fp8_e5m2_t/fp8_e5m2_t最终以 Tensor API Mmad 静态检查为准。L0C 累加类型由AscendC::GetMmDstTypeAType::Type推导int8_t输入通常累加为int32_tHiFloat8/FP8 输入通常累加为float。Scale 因子类型Fixpipe 反量化使用 X2 scale支持两类输入方式Scalar scaleoperator()的scaleGlobal为uint64_tFixpipe 搬出时使用标量 scale。Per-channel scalescaleGlobal为 TensorBlock 将当前 N 分片的 scale 搬入 L1并在 Fixpipe 搬出时使用 L1 scale Tensor。当CType为int32_t时结果直接以累加值搬出不使用 scale 反量化。计算模式仅支持 AIC 模式不支持 AIV 计算。输出目标结果直接输出到 GM不支持 workspace。输出类型由CType指定CType int32_tL0C 累加结果直接搬出。CType half/bfloat16_t/float通过 Fixpipe 搬出并应用 scalar/per-channel scale。L1 切分要求kAL1A 矩阵 L1 K 轴切分大小。kBL1B 矩阵 L1 K 轴切分大小。l1BufferNum支持 2 或 4 缓冲。非全载模式下当l1BufferNum 2时支持kAL1与kBL1不同并按 A/B 的 K-L1 大小选择复用策略。A 全载模式下A 常驻 L1kAL1跟随kBL1适用于 A 分片复用收益明显的场景。注意kAL1与kBL1不相等时必须满足整数倍关系。Mmad 计算模式使用默认 Mmad trait执行量化 A/B Cube Mmadusing MmadAtomT AscendC::Te::MmadAtom AscendC::Te::MmadTraits AscendC::Te::MmadOperation, AscendC::Te::MmadTraitDefault; AscendC::Te::Mmad(MmadAtomT{}.with(mmadParams), c1Local, l0aLocal, l0bLocal);Bias 仅在首个 K-L1/L0 迭代搬入 BT 并参与 Mmad。特殊静态常量常量说明WEIGHT_NZB 矩阵是否为 NZ 格式TRANS_AA 矩阵是否转置TRANS_BB 矩阵是否转置C0_SIZEA/B C0 对齐大小由AscendC::Te::C0_ELEMENTAType推导L0C_C0L0C C0 对齐大小固定为 16SCALE_BUFFER_NUMX2 scale L1 缓冲数量固定为 2AB_L1_TWO_BUFFERA/B L1 双缓冲标志固定为 2特殊类型别名类型说明BTypeBTypeTuple的第 0 个类型表示 B 矩阵数据类型X2ScaleTypeBTypeTuple的第 1 个类型表示 scale GM 类型L0CTypeMmad 累加输出类型由AType推导MakeLayoutAL1A 矩阵 L1 Layout 构建器根据 TRANS_A 选择 ZN/NZMakeLayoutBL1B 矩阵 L1 Layout 构建器根据 TRANS_B 选择 ZN/NZ特殊数据结构Paramsstruct Params { GM_ADDR aGmAddr{nullptr}; // A 矩阵 GM 地址 GM_ADDR bGmAddr{nullptr}; // B 矩阵 GM 地址 GM_ADDR cGmAddr{nullptr}; // C 矩阵 GM 地址 GM_ADDR biasGmAddr{nullptr}; // Bias GM 地址 GM_ADDR scaleAGmAddr{nullptr}; // A 矩阵 Scale GM 地址 GM_ADDR scaleBGmAddr{nullptr}; // B 矩阵 Scale GM 地址 };说明scaleAGmAddr由 Kernel 层用于 per-tensor scale 融合Block 主要消费传入的 scalar scale 或scaleBGmAddr对应的 per-channel scale Tensor。biasGmAddr可选无 bias 时 Kernel 会传入占位 Tensor Slice。接口概要Block 对外主要通过初始化接口和调用接口完成单 block 计算初始化阶段配置问题规模、L0 tile、kAL1/kBL1、L1 缓冲数量、X2 scale 模式、Bias 标志和 L0C 双缓冲标志。执行阶段接收当前 block 的 A/B/C/Bias Tensor以及 scalar scale 或 per-channel scale Tensor完成量化 Mmad 累加和 Fixpipe 搬出。非全载模式下l1BufferNum 2时可分别使用kAL1/kBL1l1BufferNum ! 2时使用统一 K-L1 窗口。A 全载模式下A 常驻 L1适用于 A 分片复用收益明显的场景。事件同步事件用途MTE1_MTE2 (0-3)A/B 数据 L1 缓冲同步MTE1_MTE2 (4-5)Bias L1 双缓冲同步FIX_MTE2 (0-1)X2 scale L1 双缓冲同步MTE2_FIX (0-1)scale GM 到 L1 后通知 FixpipeMTE2_MTE1GM 到 L1 搬运完成后触发 L1 到 L0MTE1_ML1 到 L0 搬运完成后触发 MmadM_MTE1Mmad 与下一轮 L0 搬运同步调用示例组件组装// 以下以 int8_t A/B 为例可按 Tensor API 支持组合替换为其他类型。 using AType int8_t; using BType int8_t; using CType bfloat16_t; using BiasType int32_t; using X2ScaleType uint64_t; using LayoutA AscendC::Te::NDExtLayoutPtn; using LayoutB AscendC::Te::NDExtLayoutPtn; using LayoutC AscendC::Te::NDExtLayoutPtn; using LayoutBias AscendC::Te::NDExtLayoutPtn; using BTypeTuple AscendC::Std::tupleBType, X2ScaleType; using DispatchPolicy Blaze::Gemm::MatmulWithScaleFixpipeQuant0, false; using BlockMmad Blaze::Gemm::Block::BlockMmad DispatchPolicy, AType, LayoutA, BTypeTuple, LayoutB, CType, LayoutC, BiasType, LayoutBias;组件初始化BlockMmad blockMmad; BlockMmad::ProblemShape problemShape{m, n, k, batch}; BlockMmad::BlockShape l0TileShape{baseM, baseN, baseK, 0}; blockMmad.Init( problemShape, l0TileShape, kAL1, kBL1, l1BufferNum, QuantMode::PERTENSOR_MODE, isBias, dbL0C);组件执行auto gmBlockA gmA.Slice(...); auto gmBlockB gmB.Slice(...); auto gmBlockBias gmBias.Slice(...); auto gmBlockC gmC.Slice(...); uint64_t scalarScale ...; BlockMmad::BlockShape singleShape{curM, curN, k, 0}; blockMmad(gmBlockA, gmBlockB, scalarScale, gmBlockBias, gmBlockC, singleShape);数据流存储层次GM (量化 A/B) GM (scale/bias) ↓ L1 (A/B 数据缓冲 X2 scale Bias) ↓ L0A/L0B (量化数据) BT (Bias) ↓ L0C (由 L0CType 决定的累加类型) ↓ Fixpipe (scale 反量化) ↓ GM (C 输出)L1 缓冲布局非全载 A0|B0|A1|B1|...|Scale0|Bias0|Scale1|Bias1 A 全载 B0|Scale0|Bias0|A|...|B1|Scale1|Bias1执行流程初始化 L1/L0 tile 和 scale/bias 缓冲 ↓ 搬运 scalar 或 per-channel scale ↓ 搬运 Bias 到 L1可选 ↓ 根据 kAL1/kBL1 选择 K-L1 主循环 ↓ K-L0 循环执行量化 Mmad ↓ Fixpipe 搬出并完成反量化性能优化建议L1 K 轴配置kAL1 kBL1A/B 同步推进控制逻辑最简单。kAL1 kBL1复用 A适合 A 搬运压力较大或 A 全载收益明显的场景。kBL1 kAL1复用 B适合 B 搬运压力较大或 B 数据复用较高的场景。L1 缓冲数量l1BufferNum 2支持 A/B 不同 K-L1 窗口。l1BufferNum 4提高数据搬运流水并行度但内部统一使用min(kAL1, kBL1)。Scale 模式选择per-tensor scale 使用 scalar 传入搬运开销最低。per-channel scale 需要将当前 N 分片 scale 搬入 L1适合精度要求更高的场景。L0C 双缓冲dbL0C 1时启用 L0C ping-pong可提升连续 block 搬出效率。CType int32_t时无反量化 scale 搬出适合调试或保留累加结果的场景。【免费下载链接】ops-tensorops-tensor 是 CANN Compute Architecture for Neural Networks算子库中提供张量类计算的基础算子库采用模块化设计支持灵活的算子开发和管理。项目地址: https://gitcode.com/cann/ops-tensor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考