Kernel Qbmm Mx
功能说明
MX 量化 Batch Matmul Kernel,仅支持 AIC 计算,支持 MxFP4/MxFP8 量化格式。集成 Scale 因子(pertokenScale、scale)处理、多 Batch 维度支持、L2 Cache 动态配置,适用于量化推理场景。
特殊约束
量化格式支持
支持以下量化数据类型:
- MxFP4:
fp4x2_e2m1_t、fp4x2_e1m2_t(4-bit 浮点) - MxFP8:
fp8_e5m2_t、fp8_e4m3fn_t(8-bit 浮点)
Scale 因子要求
必须提供两个 Scale 因子:
scaleAGmAddr:A 矩阵的 per-token scale(fp8_e8m0_t类型)scaleBGmAddr:B 矩阵的 per-group scale(fp8_e8m0_t类型)
计算模式
仅支持 AIC 模式,不支持 AIV 计算(AIV 核直接返回)。
BlockScheduler 限制
仅支持 BlockSchedulerQbmm 调度器,支持多 Batch 维度切分。
L2 Cache 动态配置
根据 tile 形状动态启用/禁用 L2 Cache:
- 大 tile(
curBaseM >= problemShape.m):禁用 L2 Cache - 小 tile:启用 L2 Cache
Batch 维度限制
支持 4 维 Batch(batchA1/A2/A3/A4、batchB1/B2/B3/B4、batchC1/C2/C3/C4),需满足广播规则。
Atomic Add 模式
可选 Atomic Add 模式(isAtomicAdd = true),用于多核并行累加场景。
特殊成员方法
构造函数
__aicore__ inline GemmUniversal()
功能:构造 GemmUniversal 对象。
析构函数
__aicore__ inline ~GemmUniversal()
功能:析构 GemmUniversal 对象。
特殊模板参数
template <
class ProblemShape, // 问题形状类型
class BlockMmad, // BlockMmadMX 组件
class BlockEpilogue, // 后处理组件(通常为 void)
class BlockScheduler> // BlockSchedulerQbmm 调度器
模板参数说明
| 参数 | 说明 |
|---|---|
| ProblemShape | 问题形状类型,包含 m、n、k、b(batch) |
| BlockMmad | BlockMmadMX 组件,基于 MatmulWithScaleMx 调度策略 |
| BlockEpilogue | 后处理组件(通常不使用,传 void) |
| BlockScheduler | BlockSchedulerQbmm 调度器 |
特殊类型别名
| 类型 | 说明 |
|---|---|
| weightNz | B 矩阵是否为 NZ 格式(继承自 BlockMmad) |
| transA | A 矩阵是否转置(继承自 BlockMmad) |
| transB | B 矩阵是否转置(继承自 BlockMmad) |
| isAtomicAdd | 是否启用 Atomic Add 模式(继承自 BlockMmad::DispatchPolicy) |
| C0_SIZE | C0 对齐大小(FP4: 64,FP8: 32) |
| SCALE_C0 | Scale C0 对齐大小(固定为 2) |
| MakeLayoutScaleA | ScaleA Layout 构建器(根据 transA 选择) |
| MakeLayoutScaleB | ScaleB Layout 构建器(根据 transB 选择) |
特殊数据结构
Params
struct Params {
ProblemShape problemShape; // 问题 shape (m, n, k, batch)
BlockMmadParams mmadParams; // mmad 参数(包含 GM 地址)
L1Params l1Params; // L1 参数(kL1, scaleKL1, l1BufNum)
BlockSchedulerParams schParams; // scheduler 参数
QBMMTiling qbmmParams; // QBMM 特有参数
};
QBMMTiling
struct QBMMTiling {
uint32_t batchA1, batchA2, batchA3, batchA4; // A 矩阵 Batch 维度
uint32_t batchB1, batchB2, batchB3, batchB4; // B 矩阵 Batch 维度
uint32_t batchC1, batchC2, batchC3, batchC4; // C 矩阵 Batch 维度
uint32_t biasThreeDim; // Bias 是否为 3 维
uint32_t baseM, baseN, baseK; // L0 tile 形状
uint32_t isBias; // 是否启用 bias
uint32_t dbL0C; // L0C 双缓冲标志
};
BlockMmadParams(MX 特有)
struct Params {
GM_ADDR aGmAddr; // A 矩阵 GM 地址
GM_ADDR bGmAddr; // B 矩阵 GM 地址
GM_ADDR cGmAddr; // C 矩阵 GM 地址
GM_ADDR biasGmAddr; // Bias GM 地址(可选)
GM_ADDR scaleAGmAddr; // A 矩阵 Scale GM 地址
GM_ADDR scaleBGmAddr; // B 矩阵 Scale GM 地址
};
特殊成员方法
Init函数
__aicore__ inline void Init(const Params& params)
功能:初始化 Kernel,提取问题规模、GM 地址、Batch 参数。 执行流程:
- AIV 检查:如果是 AIV 核则直接返回
- 设置 Bias 标志:根据
qbmmParams.isBias判断 - 设置 BiasThreeDim 标志:根据
qbmmParams.biasThreeDim判断 - 调用
ResetGmAddr设置 GM 地址
Run函数
__aicore__ inline void Run(const Params& params)
功能:执行量化 Batch Matmul Kernel 计算。 执行流程:
- Atomic Add 配置:如果
isAtomicAdd = true,调用SetAtomicAdd<float> - 调用
Init(params)设置参数 - 创建 BlockScheduler 实例
- 初始化 BlockMmadMX 组件
- 判断 Batch 数量:
- 单 Batch(
b == 1):调用ProcessSingleBatch - 多 Batch:调用
ProcessWithBatch
- 单 Batch(
- 清理 Atomic Add:如果启用,调用
SetAtomicNone
ProcessSingleBatch函数
__aicore__ inline void ProcessSingleBatch(
const Params& params, BlockScheduler& bs,
uint64_t batchCnt, bool isTailRound)
功能:处理单个 Batch 的矩阵乘计算。 执行流程:
- 构建 Layout:A、B、ScaleA、ScaleB、Bias、C
- 创建 GM Tensor
- 动态配置 L2 Cache
- Tile 循环处理:
- 获取 tile 坐标和形状
- Slice GM Tensor 到当前 tile
- 调用 BlockMmadMX 执行量化矩阵乘
ProcessWithBatch函数
__aicore__ inline void ProcessWithBatch(const Params& params, BlockScheduler& bs)
功能:处理多 Batch 的矩阵乘计算。 执行流程:
- 计算 Batch 广播倍数:multiA1C1、multiB1C1 等
- 4 维 Batch 循环(batchC1/C2/C3/C4):
- 更新 Batch 偏移:
batchCOffset_、batchAOffset_、batchBOffset_ - 调用
AddBatchOffset更新 GM 地址 - 调用
ProcessSingleBatch处理当前 Batch
- 更新 Batch 偏移:
SetL2Cache函数
template <typename TensorB, typename TensorC>
__aicore__ inline void SetL2Cache(
const ProblemShape& problemShape,
uint64_t baseM, uint64_t baseN,
TensorB& gmB, TensorC& gmC)
功能:动态配置 L2 Cache。 说明:
- 同 Batch 且 M tile 覆盖完整 M 维时,根据 B 的布局和对齐情况配置 B 的 L2 Cache
- 当前实现不再配置 ScaleB 的 L2 Cache hint,ScaleB 使用 Tensor API 默认 Cache 策略
- Atomic Add 模式:禁用 C 的 L2 Cache
调用示例
组件组装
// 定义量化数据类型
using AType = fp4x2_e2m1_t; // 或 fp8_e5m2_t
using BType = fp4x2_e2m1_t; // 或 fp8_e5m2_t
using CType = float;
using BiasType = float;
using ScaleType = fp8_e8m0_t;
// 定义 Layout
using LayoutA = AscendC::Te::NDExtLayoutPtn;
using LayoutB = AscendC::Te::NZLayoutPtn;
using LayoutC = AscendC::Te::NDExtLayoutPtn;
using LayoutBias = AscendC::Te::NDExtLayoutPtn;
// 定义调度策略
using DispatchPolicy = Blaze::Gemm::MatmulWithScaleMx<A_FULL_LOAD_MODE>;
// 定义 BlockMmadMX
using BlockMmad = Blaze::Gemm::Block::BlockMmad<
DispatchPolicy, AType, LayoutA, BType, LayoutB, CType, LayoutC, BiasType, LayoutBias>;
// 定义 BlockScheduler
using BlockScheduler = Blaze::Gemm::Block::BlockSchedulerQbmm<ProblemShape>;
// 定义 Kernel
using QBMMKernel = Blaze::Gemm::Kernel::GemmUniversal<
ProblemShape, BlockMmad, void, BlockScheduler>;
参数准备
using Params = typename QBMMKernel::Params;
Params params = {
{m, n, k, batch}, // problem shape
{aGM, bGM, cGM, biasGM, scaleAGM, scaleBGM}, // mmad params
{kL1, scaleKL1, l1BufNum}, // L1 params
{baseM, baseN, baseK, mTailTile, nTailTile, ...}, // scheduler params
{batchA1, batchA2, ... batchC4, biasThreeDim, baseM, baseN, baseK, isBias, dbL0C} // QBMM tiling
};
Kernel 执行
QBMMKernel qbmm;
qbmm(params); // 或 qbmm.Run(params);
数据流
存储层次
GM (A/B/ScaleA/ScaleB/Bias) → L1 (量化数据 + Scale) → L0A/L0B → L0C → GM (C)
Batch 处理流程
Batch 循环(4 维)
↓
更新 Batch 偏移(batchA/B/COffset)
↓
重置 GM 地址(AddBatchOffset)
↓
处理单个 Batch(ProcessSingleBatch)
↓
Tile 循环 → BlockMmadMX 执行
量化计算流程
加载量化数据 (A/B) + Scale (ScaleA/ScaleB)
↓
Dequantize(自动在 Mmad 中完成)
↓
Mmad 计算(MX 模式:MmadTraitMX)
↓
输出 float 结果
性能优化建议
L1 缓冲配置
l1BufNum:建议 2 或 4,平衡 L1 容量和流水线并行度kL1:建议对齐到MXFP_DIVISOR_SIZE(64)
Scale KL1 配置
scaleKL1:建议为kL1的整数倍(如 2×kL1)- Scale 数据复用:Scale 常驻 L1,减少搬运开销
全载模式选择
- 非全载模式:每次迭代重新加载 A/B 块
- A 全载模式:A 矩阵常驻 L1,适用于大 K、小 M 场景
Batch 维度设计
- Batch 维度需满足广播规则:
batchA = batchC × multiA、batchB = batchC × multiB - 4 维 Batch 灵活支持多种广播场景
L2 Cache 配置
- 大 tile 场景自动禁用 L2 Cache,避免缓存污染
- Atomic Add 模式自动禁用 C 的 L2 Cache
适用场景
- 量化推理:MxFP4/MxFP8 量化矩阵乘
- Batch Matmul:多 Batch 维度支持
- Scale 因子处理:per-token 和 per-group scale
- 广播 Batch:A/B/C 不同 Batch 维度的广播计算