
pto-isa 量化指令 TQUANT 完全指南MXFP8/MXFP4 微缩量化与 INT8 仿射量化实现解析【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isaTQUANT 是 CANN pto-isaParallel Tile Operation 虚拟指令集中负责将高精度 Tile 量化为低精度格式的核心指令覆盖 MXFP8e4m3、MXFP4e2m1两种微缩Microscaling格式以及 INT8 对称/非对称仿射量化。本文基于 docs/isa/TQUANT.md 展开结合 include/pto/npu/a5/TQuant.hpp 源码实现与 tquant_dn 测试用例系统讲解量化流程、C 内建接口、Tile 尺寸与约束、布局转换ND/DN → NZ/ZZ、汇编语法与完整工程示例。读完本文你将能够在 pto-isa 的 Auto 与 Manual 两种编程模式下正确调用 TQUANT为 FlashAttention、量化推理等场景产出可直接供 Cube 单元消费的 FP8/FP4 数据与 E8M0 指数。图TQUANT 指令的 tile 级操作示意量化数据 Tile 每组指数/最大值/缩放辅助 Tile。一、指令概览与能力边界TQUANT 将一个高精度 TileFP32/BF16/FP16量化为低精度格式同时生成量化的数据 Tile 以及辅助的每组指数 / 最大值 / 缩放Tile。目标格式、缩放算法和分组轴均为编译期模板参数这意味着不同的量化配置不会带来运行时开销也便于编译器在 Auto 模式下进行深度优化。目标格式族格式分组方式缩放算法Microscaling (MX)MXFP8 (e4m3)、MXFP4 (e2m1)每 32 个元素共享一个指数OCP、NVIntegerINT8对称 / 非对称每 Tile 一个 scale 可选 offset仿射能力边界需要特别说明详见后文支持的输入 dtype小节微缩量化MXFP8/MXFP4仅在 A5 上支持A2/A3 仅支持INT8路径且输入必须为 FP32。二、量化流程2.1 MX 格式3 阶段组大小 G 32对于 Tile $x \in \mathbb{R}^{M \times N}$沿grp_axis分组NDaxis-1/列DNaxis-0/行阶段操作输出1. 组内最大值$m_g \max_{i \in g} |x_i|$maxscratchFP2. 指数 缩放$s_g \mathrm{biasedExp}(m_g) - e_{\max}$$\alpha_g 2^{254 - s_g}$expE8M01 字节/组、scalingscratchFP3. 缩放 类型转换$q_i \mathrm{clip}_{[-V_{\max},V_{\max}]}(x_i \cdot \alpha_g) \to$ 目标格式dstFP8 / 打包 FP4其中$e_{\max}$ 目标格式最大指数e4m3 为 8e2m1 为 1。$V_{\max}$ 目标格式 MAX_NORMe4m3 为 448e2m1 为 6。阶段 1–2 使用精确的 IEEE-754 位操作无 FPlog/floor阶段 3 使用硬件类型转换 随机舍入SPR.CTRL[50]1。NDnormal directiongrp_axis1每 32 个连续列为一组——默认/标准分组方式。DNgrp_axis0每 32 个连续行为一组——转置式 axis-0 分组指数 Tile 形状 $\hat{M}\times N$$\hat{M} M/32$。在 A5 源码实现中三个阶段分别对应 TQuant.hpp 中的三组核心函数组内最大值AbsReduceMax_f32_opt/AbsReduceMax_b16_ND/AbsReduceMax_b16_ND_2D等系列函数通过vldsvabsvmax/vcmax/vcgmax完成绝对值归约。B16 路径还针对loop_num1与多窗口流式存储vstus/vstas做了分支处理避免写入未对齐触发 VSTAI 异常见AbsReduceMax_b16_ND中的注释说明。指数 缩放提取按缩放算法分派。OCP 算法走ExtractF32OcpExponentAndScaling/ExtractMxOcpExponentAndScalingNV 算法走ExtractNVExponentAndScalingF32/ExtractNVExponentAndScalingB16统一入口为ExtractB8ExponentAndScalingVL按OcpF8E4M3Alg、NvF8E4M3Alg等算法 tag 做 constexpr 分派。OCP 的 e4m3 与 e2m1 差异封装在OcpMxFp8E4M3Spec/OcpMxFp4E2M1SpecmaxExp 0x0400/0x0100中NV 算法则通过descaleMultipliere4m3 为1/448e2m1 为1/6先缩放再取上取整指数对应源码中RoundUpNvSharedExponent的ceil(log2(...))语义。缩放 类型转换CalcQuantizedFP8ValuesFP32→FP8含_Unroll2展开变体、CalcQuantizedFP4E2M1Values_HalfFP16→打包 FP4含 tail 处理最终通过vcvt(..., ROUND_R, RS_ENABLE, ...)完成带随机舍入的硬件转换并使用PK4_B32/PK_B32等打包存储写出。2.2 Integer INT8仿射5 阶段类型转换$$q_i \mathrm{round}!\left(\frac{x_i}{\mathrm{scale}}\right) \mathrm{offset}, \qquad q_i \in [-128, 127]$$无分组结构scale和非对称offset为每 Tile 的 FP32 标量/向量。为避免二次舍入A2/A3 上的类型转换链为FP32 → S32 → FP32 → FP16 → INT85 阶段通过tmpTileA5 使用原生广播 类型转换无需tmp。输入必须为FP32。A2/A3 需要tmp的原因A3 无原地tcvt指令tmp保存 FP32→S32 的中间结果A5 则通过vlds BRC_B32原生广播 scale/offset见 pto_instr.hpp 中 tmp-aware 重载的注释。三、C 内建接口声明于 include/pto/common/pto_instr.hppL2905–L3003。公共包含头为pto/pto-inst.hpp内部声明位于pto/common/pto_instr.hpp。3.1 MX — 分组式grp_axisMxQuantAlg— 推荐template int grp_axis, auto mx_alg, typename TileDataOut, typename TileDataSrc, typename TileDataExp, typename TileDataMax, typename TileDataScaling, typename... WaitEvents PTO_INST RecordEvent TQUANT(TileDataOut dst, TileDataSrc src, TileDataExp *exp, TileDataMax *max, TileDataScaling *scaling, WaitEvents ...events);模板参数取值含义grp_axis0 DNaxis-0 分组、1 NDaxis-1 分组量化分组轴mx_algMxQuantAlg::OcpMxFp8E4M3、NvMxFp8E4M3、OcpMxFp4E2M1、NvMxFp4E2M1格式 缩放算法MxQuantAlg枚举定义见 TQUANT_DN.mdenum class MxQuantAlg { OcpMxFp8E4M3 0, // MXFP8 E4M3 OCP scale NvMxFp8E4M3 1, // MXFP8 E4M3 NV scale OcpMxFp4E2M1 2, // MXFP4 E2M1 OCP scale NvMxFp4E2M1 3, // MXFP4 E2M1 NV scale };此外还有一个DN 专用 bool 模板重载仅 DN 分组时使用用于以[ceil(M/64), 2*N]的扁平形式交错写出行邻接的 E8M0 指数template int grp_axis, auto mx_alg, bool interleave, typename TileDataOut void, typename TileDataSrc void, typename TileDataExp void, typename TileDataMax void, typename TileDataScaling void, typename... WaitEvents PTO_INST RecordEvent TQUANT(TileDataOut dst, TileDataSrc src, TileDataExp *exp, TileDataMax *max, TileDataScaling *scaling, WaitEvents ...events);3.2 MX — ND 旧版QuantTypeQuantScaleAlgtemplate auto quant_type, typename ...Tiles, auto scale_alg QuantScaleAlg::OCP, typename... WaitEvents PTO_INST RecordEvent TQUANT(TileDataOut dst, TileDataSrc src, TileDataExp *exp, TileDataMax *max, TileDataScaling *scaling, WaitEvents ...events); // 带显式 ZZ 指数存储模式 template auto quant_type, auto store_mode, typename ...Tiles, typename... WaitEvents PTO_INST RecordEvent TQUANT(TileDataOut dst, TileDataSrc src, TileDataExp *exp, TileDataMax *max, TileDataScaling *scaling, TileDataExp *exp_zz, WaitEvents ...events);quant_type格式scale_algQuantType::MXFP8e4m3 E8M0OCP / NVQuantType::MXFP4_E2M1e2m1 E8M0OCP / NV3.3 Integer INT8// 对称 template auto quant_type, typename TileDataOut, typename TileDataSrc, typename TileDataPara, typename... WaitEvents PTO_INST RecordEvent TQUANT(TileDataOut dst, TileDataSrc src, TileDataPara scale, TileDataPara *offset nullptr, WaitEvents ...events); // 带 scratchA2/A3 template auto quant_type, typename ...Tiles, typename TileDataTmp, typename... WaitEvents PTO_INST RecordEvent TQUANT(TileDataOut dst, TileDataSrc src, TileDataPara scale, TileDataTmp tmp, TileDataPara *offset nullptr, WaitEvents ...events);quant_typeoffsetdstdtype模式QuantType::INT8_SYMnullptrint8_t对称$q \mathrm{round}(x/\mathrm{scale})$QuantType::INT8_ASYM提供uint8_t非对称$q \mathrm{round}(x/\mathrm{scale}) \mathrm{offset}$带tmp的重载dst, src, scale, tmp, offset用于 A2/A3 接口对齐。A5 不使用tmpA2/A3 上tmp必须为 $M \times N$ FP32S32 类型转换中间结果。四、Tile 尺寸与数据类型对于输入 Tile 形状 $M \times N$dtype $T \in {\mathrm{FP32}, \mathrm{BF16}, \mathrm{FP16}}$组大小 $G 32$4.1 MXFP8e4m3Tiledtype形状ND形状DN字节数src$T$$M \times N$$M \times N$$M \cdot N \cdot \mathrm{sizeof}(T)$dstint8_te4m3 别名$M \times N$$M \times N$$M \cdot N$expuint8_tE8M0$M \times N/32$$M/32 \times N$$M \cdot N / 32$maxscratch$T$$M \times N/32$$M/32 \times N$$M \cdot N / 32 \cdot \mathrm{sizeof}(T)$scalingscratch$T$$M \times N/32$$M/32 \times N$$M \cdot N / 32 \cdot \mathrm{sizeof}(T)$4.2 MXFP4e2m1同 MXFP8但Tiledtype字节数dstfloat4_e2m1x2_t每字节打包 2 个 e2m1$M \cdot N / 2$输入限制MXFP4 仅接受FP16/BF16不支持 FP32。4.3 INT8Tiledtype形状字节数srcfloat32_t$M \times N$$M \cdot N \cdot 4$dstSYMint8_t$M \times N$$M \cdot N$dstASYMuint8_t$M \times N$$M \cdot N$scaleFP32 标量/向量每 Tile—offsetASYMFP32 标量/向量每 Tile—tmp仅 A2/A3FP32$M \times N$$M \cdot N \cdot 4$tmpTile仅 A2/A3必须与src同尺寸$M \times N$ FP32 $4MN$ 字节保存 FP32→S32 类型转换中间结果A3 无原地tcvt。A5 接受同名tmp参数以保持接口一致但不使用它A5 原生vlds BRC_B32广播。五、约束条件约束适用范围原因$M \bmod 16 0$ND MXZZ 布局16 行 ZZ 块$M \bmod 32 0$DN MXaxis-0 组整除$M \bmod 64 0$DN MX ZZ 转换δ 配对$\hat M / 2$ 为整数$N \bmod 32 0$所有 MX组大小 $G 32$$N \bmod 64 0$ND MX ZZ 转换指数组数为偶数$M \cdot N \le 59461$MXUB 256KB复用后的缓冲预算BF16/FP16validCols % 32 ! 0→ 零填充至StaticColsMX B16 路径组对齐从 tquant_dn_kernel.cpp 的测试实现可以看到这些约束在代码层的体现DN 路径要求StaticRows % 64 0、ValidRows % 64 0对应 $M \bmod 64$ 约束并通过static_assert在编译期强制校验同时通过地址偏移计算static_assert(scalingAddr maxBytes 0x40000, validShape test UB layout exceeds 256 KB.)保证 UB 缓冲不超出 256KB 预算。六、输出布局与布局转换TQUANT 默认输出ND行主序。Cube Unit 消费两种 fractal 布局由独立的TMOV指令生成输出原生TQUANTCube 布局转换FP8 / FP4 数据NDNZColMajorRowMajor fractalTMOV(dstNZ, dst)2 参数E8M0 指数ND 分组NDZZzigzag[16,2]块TMOV(e8Zz, e8, tmp)3 参数E8M0 指数DN 分组DNZZTMOV0(e8Zz, e8Dn, tmp)3 参数grp_axis0DN 数据的 FP8 mantissa 与 ND 共享相同的物理地址(r,c)元素完全相同因此 2 参数TMOVND→NZ 对 DN 数据同样适用。仅指数路径不同DN→ZZ 通过TMOV0。DN→ZZ 转换的完整推导见 TQUANT_DN.md。关于 DN 分组需要强调ND/DN 只指分组轴不指存储布局——两种模式产出的都是 RowMajor Tile。DN 用于 FlashAttention 场景softmax 输出P 矩阵在 M行维天然分组量化后数据经TMOV(ND→NZ)、指数经TMOV0(DN→ZZ)即可供 Cube 消费。七、支持的输入 dtype格式可接受输入 dtype说明MXFP8仅 A5FP32、BF16、FP16FP32原地 FP8 输出4:1。BF16/FP16源零填充至StaticCols类型转换前先上转为 FP32无直接 b16→e4m3。MXFP4e2m1仅 A5仅 FP16、BF16不支持 FP32输出float4_e2m1x2_t打包。INT8sym/asym仅 FP32SYM→int8_tASYM→uint8_t。A2/A3 需tmp src 尺寸。微缩量化MXFP8/MXFP4仅在 A5 上支持A2/A3 仅支持INT8路径FP32 输入。八、数学语义除另有说明外语义在有效区域内定义目标相关行为标记为实现定义。从 A5 实现看OCP 与 NV 两套缩放算法的差异集中体现在指数提取环节OCP直接基于 IEEE-754 指数位操作s_g biasedExp(m_g) - e_maxalpha 2^(254-s_g)对 NaN/Inf 有专门掩码处理F32OcpQuantCtx中kExpNan 0xFF、kF32Nan 0x7FC00000通过vcmps_eq/vcmps_ne判断后用vsel覆写。NVshared_exp ceil(log2(max_abs * descaleMultiplier)) fp32_bias且精确幂次保持不取整RoundUpNvSharedExponent中通过 mantissa 非零 指数范围判断决定是否 1stored reciprocal scale 保持 $2^{(254-shared_exp)}$ 形式。九、汇编语法9.1 AS Level 1SSA%dst pto.tquant %src, %qp : (!pto.tile..., !pto.tile...) - !pto.tile...9.2 AS Level 2DPSpto.tquant ins(%src, %qp : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)9.3 ASM 形式示例Auto 模式编译器/运行时管理资源放置与调度%dst pto.tquant %src, %qp : (!pto.tile..., !pto.tile...) - !pto.tile...Manual 模式须先显式绑定资源再发射指令# 可选为 tile 操作数显式绑定 UB 地址 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.tquant %src, %qp : (!pto.tile..., !pto.tile...) - !pto.tile...PTO 汇编形式%dst pto.tquant %src, %qp : (!pto.tile..., !pto.tile...) - !pto.tile... # AS Level 2DPS pto.tquant ins(%src, %qp : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)十、C 使用示例10.1 核心调用示例// MXFP8DN 分组axis-0OCP 缩放 TQUANT0, MxQuantAlg::OcpMxFp8E4M3(fp8Tile, srcTile, e8DnTile, maxTile, scalingTile); // MXFP8ND 分组旧版 TQUANTQuantType::MXFP8(fp8Tile, srcTile, e8NdTile, maxTile, scalingTile); // MXFP4 E2M1DNNV 缩放 TQUANT0, MxQuantAlg::NvMxFp4E2M1(fp4Tile, srcTile, e8DnTile, maxTile, scalingTile); // INT8 对称 TQUANTQuantType::INT8_SYM(int8Tile, srcTile, scale); // 完整 MXFP8 DN 流水线量化 为 Cube 转换布局 TQUANT0, MxQuantAlg::OcpMxFp8E4M3(fp8Tile, srcTile, e8DnTile, maxTile, scalingTile); TMOV(fp8NZTile, fp8Tile); // 数据 ND→NZ TMOV0(e8ZzTile, e8DnTile, tmpTile); // 指数 DN→ZZ10.2 完整 ST 用例DN 分组仓库提供了完整的单测示例 tests/npu/a5/src/st/testcase/tquant_dn/tquant_dn_kernel.cpp配套 gen_data.py 与 main.cpp。其核心流程为常量计算根据静态形状推导各 Tile 的地址布局srcAddr → dstAddr → expAddr → maxAddr → scalingAddr均按 32 字节对齐并做static_assert校验 UB 不超 256KB资源绑定TASSIGN(srcTile, srcAddr)等将 Tile 绑定到 UB 地址数据搬运TLOAD(srcTile, srcGlobal)从 GM 载入set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0)wait_flag(...)同步量化TQUANT0, Alg, true(dstTile, srcTile, expTile, maxTile, scalingTile)Alg为MxQuantAlg模板参数测试覆盖 OCP/NV 与 FP32/BF16/FP16 输入组合结果写回set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0)wait_flag(...)后执行TSTORE(dstGlobal, dstTile)与TSTORE(expGlobal, expTile)。该用例还覆盖了动态 validShape如actual[1472,1010], view[1408,34], tile[896,1212]由 PyPTO 发射的组合演示了静态 Tile 与运行时有效形状分离的编程模型。INT8 路径与 A2/A3 实现可分别参考 include/pto/npu/a2a3/TQuant.hpp 与 include/pto/npu/common/TQuantShared.hppCPU 模拟实现位于 include/pto/cpu/TQuant.hpp便于无 NPU 环境下验证算法正确性。十一、总结TQUANT 是 pto-isa 中桥接高精度计算与低精度存储/计算的关键指令其设计要点可归纳为编译期配置grp_axis、mx_alg、quant_type、scale_alg全部为模板参数零运行时开销且 OCP/NV 两套业界主流缩放算法均已内置三阶段流水组最大值 → 指数/缩放提取 → 缩放转换前两阶段纯位操作保证精确性末阶段硬件随机舍入保证数值质量布局直通 CubeND/DN 两种分组轴配合TMOV的 NZ/ZZ 转换让 FP8/FP4 数据与 E8M0 指数直接对齐 Cube Unit 的 fractal 消费格式尤其适用于 FlashAttention 的 P 矩阵量化平台分层明确MX 量化仅限 A5INT8 全平台A2/A3 需tmpscratch接口层保持统一以方便跨平台代码迁移。如需深入了解 DN→ZZ 转换的数学推导与实现细节请继续阅读 docs/isa/TQUANT_DN.md完整的指令索引与汇编约定见 docs/isa/README.md。【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考