全局矩阵乘(GM→GM)

hir.matmul — 全局矩阵乘(GM→GM)

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

关键词:matmul, Matrix Multiply, Global Memory, Descale, Swizzle, Tiling

概述

hir.matmul是 HIVM 方言中的全局矩阵乘操作,直接从全局内存(GM)读取输入矩阵并执行矩阵乘法,结果写回 GM。计算语义为C = A * B(无 bias/descale 时)或C = descale * (A * B + bias)(有 bias/descale 时)。

该操作涉及 MTE2(GM 数据加载)和 MTE3(GM 数据写回)两个 Pipeline,由编译器自动管理 L1/L0 层次的数据搬运和同步。用户只需提供 GM 地址和 Tiling 参数,无需手动管理片上存储。

matmul 支持反量化(descale)、bias、转置、Swizzle 优化等特性,适用于大矩阵乘法场景。

Python API 对应:Triton 的tl.dot在非 Split-K 场景下通常被映射为 matmul。

IR 操作定义

从 HIVMMacroOps.td 提取:

def MatmulOp : HIVM_GlobalMmadOp<"matmul"> { let summary = "HIVM Matrix Multiply Op with inputs from global memory"; let arguments = (ins AnyShaped:$a, AnyShaped:$b, Optional<AnyShaped>:$tilingParams, Optional<AnyShaped>:$bias, Optional<AnyShaped>:$descale, OptionalAttr<UnitAttr>:$aTranspose, OptionalAttr<UnitAttr>:$bTranspose, OptionalAttr<HIVM_DescaleModeAttr>:$descaleMode, Variadic<I64>:$blockSizes, Variadic<I64>:$processSizes, Optional<I64>:$swizzleOffset, Optional<I64>:$swizzleDirection, Optional<I64>:$epiloguePTiles, AnyShaped:$c); }

参数说明

输入操作数(ins)

参数类型必选说明
$aAnyShaped矩阵 A,m x k
$bAnyShaped矩阵 B,k x n
$tilingParamsAnyShapedTiling 参数
$biasAnyShapedBias 向量,形状为[n]
$descaleAnyShaped反量化缩放因子,形状取决于 descaleMode
$cAnyShaped矩阵 C(输出),m x n

输出操作数(outs)

参数类型说明
$resultVariadic<AnyRankedTensor>结果 Tensor

属性

属性类型必选说明
$aTransposeUnitAttr矩阵 A 转置加载
$bTransposeUnitAttr矩阵 B 转置加载
$descaleModeHIVM_DescaleModeAttr反量化模式

I64 操作数

参数类型必选说明
$blockSizesVariadic<I64>M/N/K 维度在 L1 层次处理的数据块大小
$processSizesVariadic<I64>M/N/K 维度在 L0 层次处理的数据块大小
$swizzleOffsetI64Swizzle 调度的连续块编号
$swizzleDirectionI64Swizzle 调度的块方向
$epiloguePTilesI64Epilogue 阶段一次处理的 P tile 数量

DescaleMode 说明

模式descale 形状说明
DescaleNull0不使用反量化
DescalePerChannel1[n]按 Channel 反量化,形状等于 N
DescalePerTensor2[1]按 Tensor 反量化,形状为 1

额外类方法

方法返回类型说明
getOpName()StringRef返回"matmul"
getDpsInitsMutable()MutableOperandRangeDestinationStyleOpInterface 所需

IR 示例

基本矩阵乘

func.func @test_matmul_basic(%A_gm : memref<16x16xf16, #hivm.address_space<gm>>, %B_gm : memref<16x16xf16, #hivm.address_space<gm>>, %res_gm : memref<16x16xf16, #hivm.address_space<gm>>) { hivm.hir.matmul ins(%A_gm, %B_gm: memref<16x16xf16, #hivm.address_space<gm>>, memref<16x16xf16, #hivm.address_space<gm>>) outs(%res_gm : memref<16x16xf16, #hivm.address_space<gm>>) descale_mode = #hivm.descale_mode<DescaleNull> return }

带 Per-Channel Descale 和 Bias

hivm.hir.matmul ins(%A_gm, %B_gm: memref<16x16xf16, #hivm.address_space<gm>>, memref<16x16xf16, #hivm.address_space<gm>>) outs(%res_gm : memref<16x16xf16, #hivm.address_space<gm>>) bias = %bias_gm : memref<16xf16, #hivm.address_space<gm>> descale = %descale_perchannel_gm : memref<16xf16, #hivm.address_space<gm>> descale_mode = #hivm.descale_mode<DescalePerChannel>

带 Per-Tensor Descale

hivm.hir.matmul ins(%A_gm, %B_gm: memref<16x16xf16, #hivm.address_space<gm>>, memref<16x16xf16, #hivm.address_space<gm>>) outs(%res_gm : memref<16x16xf16, #hivm.address_space<gm>>) bias = %bias_gm : memref<16xf16, #hivm.address_space<gm>> descale = %descale_pertensor_gm : memref<1xf16, #hivm.address_space<gm>> descale_mode = #hivm.descale_mode<DescalePerTensor>

IR 层约束与验证

  1. Core Type:操作在 Cube Core 上执行,通过HIVMInferCoreTypeInterface推断。
  2. Pipeline:涉及 MTE2 和 MTE3 两个 Pipeline。
  3. NoMaxRankTrait:不限制操作数的最大 rank。
  4. Address Space:输入/输出操作数通常需要#hivm.address_space<gm>标记。
  5. Descale 一致性:当提供 descale 操作数时,descaleMode 必须与 descale 形状一致。
  6. Bias 形状:bias 的形状必须为[n],与矩阵 B 的列维度匹配。
  7. blockSizes / processSizes:通常为 3 个 I64 值,分别对应 M、N、K 维度的块大小。

常见问题

Q: matmul 和 mmadL1 的主要区别?A: matmul 直接从 GM 读写数据,编译器自动管理 L1/L0 搬运和同步;mmadL1 需要用户手动管理 L1 数据搬运。matmul 适合端到端矩阵乘法,mmadL1 适合需要精细控制数据流的 Split-K 场景。

Q: Swizzle 参数的作用?A: Swizzle 用于优化 GM 访存的 bank conflict,通过改变数据块的读取顺序来避免冲突。swizzleOffset指定起始块编号,swizzleDirection指定遍历方向。

Q: descale 的计算公式?A:C = descale * (A * B + bias),其中 descale 是反量化缩放因子,用于量化推理场景。

相关文档

  • 源码参考:HIVMMacroOps.td
  • 测试用例:ops.mlir
  • DescaleMode 枚举:06-Attributes-Types/01-enumerations.md

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

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