news 2026/7/4 7:01:32

CANN/ops-tensor MX量化分组矩阵乘法Block组件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/ops-tensor MX量化分组矩阵乘法Block组件

Block Mmad Qgmm Mx

【免费下载链接】ops-tensorops-tensor 是 CANN (Compute Architecture for Neural Networks)算子库中提供张量类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。项目地址: https://gitcode.com/cann/ops-tensor

代码位置

功能说明

MX 量化 Grouped Matmul 的 Block 组件,基于 Tensor API 实现,仅支持 AIC 计算。 组件负责单个 tile 的 A/B 搬运、ScaleA/ScaleB 搬运、MX Mmad 计算以及 bias 处理,适用于 grouped matmul 的 mx tensor_api kernel。

继承思路参考:Block Mmad 公共框架

特殊约束

调度策略限制

仅支持GroupedMatmulWithScaleMx调度策略,不用于 Basic、QBMM 或 StreamK 路径。

量化数据类型支持

支持以下典型 MX 量化输入类型:

  • fp4x2_e2m1_t
  • fp4x2_e1m2_t
  • fp8_e5m2_t
  • fp8_e4m3fn_t

Scale 类型

ScaleA 和 ScaleB 固定使用fp8_e8m0_t

计算模式

仅支持 AIC 模式,不支持 AIV 计算。

输出目标

结果直接输出到 GM,不依赖 workspace。

特殊静态常量

常量说明
transAA 是否转置
transBB 是否转置
C0_SIZE数据 C0 对齐大小,FP4 为 64,FP8 为 32
SCALE_C0Scale 布局的 C0 对齐大小,固定为 2
SCALE_BUFFER_NUMScale 双缓冲数量
HALF_L0_SIZEL0A/L0B 半缓冲大小
HALF_L0C_SIZEL0C 半缓冲大小

特殊类型别名

别名含义
ProblemShape当前 group 的问题规模
BlockShape单 tile 形状
MxL0ATypeA 在 L0 中的数据类型
MxL0BTypeB 在 L0 中的数据类型

特殊数据结构

Params

struct Params { GM_ADDR aGmAddr; GM_ADDR bGmAddr; GM_ADDR cGmAddr; GM_ADDR biasGmAddr; GM_ADDR scaleAGmAddr; GM_ADDR scaleBGmAddr; };

参数说明:

参数说明
aGmAddrA 的 GM 地址
bGmAddrB 的 GM 地址
cGmAddrC 的 GM 地址
biasGmAddrbias 的 GM 地址,可为空
scaleAGmAddrA 对应的 per-token scale 地址
scaleBGmAddrB 对应的 per-group scale 地址

L1Params

struct L1Params { uint64_t kAL1; uint64_t kBL1; uint64_t scaleKL1; };

参数说明:

参数说明
kAL1A 的 L1 K 轴切分
kBL1B 的 L1 K 轴切分
scaleKL1ScaleA/ScaleB 共享的 L1 K 轴切分

参数约束:

  • kAL1kBL1scaleKL1均需大于 0。
  • kAL1kBL1建议按MXFP_DIVISOR_SIZE(64)对齐;末尾 K tail 由实现内部 padding 处理。
  • kAL1 >= kBL1时,外层按kAL1复用 A,要求kAL1kBL1的整数倍。
  • kBL1 > kAL1时,外层按kBL1复用 B,要求kBL1kAL1的整数倍。
  • scaleKL1必须不小于外层 L1 K 窗口max(kAL1, kBL1),且应为该外层窗口的整数倍;Scale 只在scaleKL1边界搬运一次,并在窗口内复用。

MmadParams

struct MmadParams { BlockShape l0TileShape; L1Params l1Params; bool isBias; bool enableL0cPingPong; };

特殊成员方法

Init 函数

__aicore__ inline void Init( const ProblemShape& problemShape, const MmadParams& params)

功能:

  • 初始化当前 group 的m/n/k
  • 设置 L0 tile 和 L1 切分参数
  • 重置组内双缓冲状态

UpdateParamsForNextProblem 函数

__aicore__ inline void UpdateParamsForNextProblem(const ProblemShape& problemShape)

功能:

  • 在 grouped matmul 切换到下一个 group 时刷新m/n/k
  • 保持同一个 block 组件在不同 group 间复用

operator() 函数

template <typename TensorA, typename TensorB, typename TensorScaleA, typename TensorScaleB, typename TensorBias, typename TensorC> __aicore__ inline void operator()( TensorA gmA, TensorB gmB, TensorScaleA gmScaleA, TensorScaleB gmScaleB, TensorBias gmBias, TensorC gmC, const BlockShape& singleShape)

功能:

  • 处理一个 tile 的 MX grouped matmul 计算
  • 输入 tensor 由 kernel 层完成 slice 后传入

调用示例

组件组装

using AType = fp8_e4m3fn_t; using BType = fp8_e4m3fn_t; using CType = float; using BiasType = float; using LayoutA = AscendC::Te::NDExtLayoutPtn; using LayoutB = AscendC::Te::NZLayoutPtn; using LayoutC = AscendC::Te::NDExtLayoutPtn; using LayoutBias = AscendC::Te::NDExtLayoutPtn; using DispatchPolicy = Blaze::Gemm::GroupedMatmulWithScaleMx<0>; using BlockMmad = Blaze::Gemm::Block::BlockMmad< DispatchPolicy, AType, LayoutA, BType, LayoutB, CType, LayoutC, BiasType, LayoutBias>;

组件初始化

BlockMmad blockMmad; BlockMmad::ProblemShape problemShape{m, n, k, 0}; BlockMmad::BlockShape l0TileShape{baseM, baseN, baseK, 0}; BlockMmad::L1Params l1Params{kAL1, kBL1, scaleKL1}; BlockMmad::MmadParams params{l0TileShape, l1Params, isBias, enableL0cPingPong}; blockMmad.Init(problemShape, params);

组件执行

auto gmBlockA = gmA.Slice(...); auto gmBlockB = gmB.Slice(...); auto gmBlockScaleA = gmScaleA.Slice(...); auto gmBlockScaleB = gmScaleB.Slice(...); auto gmBlockBias = gmBias.Slice(...); auto gmBlockC = gmC.Slice(...); BlockMmad::BlockShape singleShape{tileM, tileN, tileK, 0}; blockMmad(gmBlockA, gmBlockB, gmBlockScaleA, gmBlockScaleB, gmBlockBias, gmBlockC, singleShape);

数据流

GM(A/B) + GM(ScaleA/ScaleB) + GM(Bias) -> L1 -> L0A/L0B + Scale Buffer -> MmadTraitMX -> L0C -> GM(C)

适用场景

  • MX 量化 grouped matmul 的 tensor_api kernel
  • group 间m/n/k动态变化的场景
  • 同时处理输入 scale 与权重 scale 的 grouped matmul 场景

【免费下载链接】ops-tensorops-tensor 是 CANN (Compute Architecture for Neural Networks)算子库中提供张量类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。项目地址: https://gitcode.com/cann/ops-tensor

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

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

FPGA入门中高级项目 雷达信息处理及Verilog代码

前言 由于各种原因&#xff0c;我们无法在网上给FPGA学习者展示雷达一些核心技术&#xff0c;比较遗憾。 大家都知道&#xff0c;FPGA起家的领域是通信和雷达。 通信因为大规模商业化进入各位生活日常&#xff0c;大家都还能获得较多的知识。雷达由于其特殊性&#xff0c;特别…

作者头像 李华
网站建设 2026/7/4 6:57:36

jqjq环境与路径追踪:执行上下文管理的核心技术

jqjq环境与路径追踪&#xff1a;执行上下文管理的核心技术 【免费下载链接】jqjq jq implementation of jq 项目地址: https://gitcode.com/gh_mirrors/jq/jqjq jqjq是一个用jq语言实现的jq解释器&#xff0c;它展示了jq语言的强大表达能力和灵活性。作为JSON处理工具的…

作者头像 李华
网站建设 2026/7/4 6:57:30

PoseDiffusion常见问题解答:从安装到部署的完整问题解决方案

PoseDiffusion常见问题解答&#xff1a;从安装到部署的完整问题解决方案 【免费下载链接】PoseDiffusion [ICCV 2023] PoseDiffusion: Solving Pose Estimation via Diffusion-aided Bundle Adjustment 项目地址: https://gitcode.com/gh_mirrors/po/PoseDiffusion Pose…

作者头像 李华