当前位置: 首页 > news >正文

全局矩阵乘(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),仅供参考

http://www.jsqmd.com/news/1167559/

相关文章:

  • 关于2026年7月宝珀中国区售后网点信息完善公告|搬迁门店原址停用新址说明 - 宝珀官方维修中心
  • Spring Boot 入门指南:从零开始构建微服务
  • 终极指南:如何快速在Unity与Unreal Engine中集成AutoRemesher自动重网格化工具
  • DSPE-PEG-FA靶向效率偏低?从分子结构修饰剖析3大核心诱因
  • 2026年AI写作真能替代人工?我实测7款工具后发现,PaperRed这个结果出乎意料
  • 告别乱码困扰:5分钟掌握GBK转UTF-8编码转换的终极方案
  • 滚动视差动画的数学原理与性能友好的实现方式
  • 2026年7月最新宝珀上海奉贤龙湖天街维修保养服务电话 - 宝珀官方售后服务中心
  • 积家中国区官方售后服务中心|官方网站权威公布(2026年7月最新) - 积家中国服务中心
  • npm 8.x/9.x 安装依赖:5步系统化排错流程与关键日志解读
  • 深度解析Ornith-1.0-9B-4bit架构:Qwen3.5模型如何实现4bit量化与多模态能力融合
  • NVIDIA Rubin AI平台:六芯片协同设计如何重塑大规模AI训练与推理
  • 积家中国官方售后服务网络全指南|官方服务电话及地址权威公示(2026年7月最新) - 积家中国服务中心
  • RE2-Rust 快速入门指南:5分钟学会在 C++ 项目中使用 Rust 正则表达式引擎
  • Skyline 实战指南:从零构建企业级异常检测系统
  • STM32F205RB与ADP5350电源管理方案详解
  • 图像数据增强的工程边界:增强太激进会让模型学错东西
  • 如何构建浏览器资源嗅探系统:猫抓(cat-catch)的技术实现方案
  • 2026年7月最新广州天梭官方售后客户服务电话及线下网点地址 - 天梭服务中心
  • 泰宠国宠2026年度新品发布会:从产能竞赛到科研卡位,科研驱动型代工模式亮相
  • GLM-5.2-MXFP4:AMD硬件优化的革命性大型语言模型
  • 别被AI替代,要借AI变强
  • 10个MagpieTTS Multilingual 357M实用技巧:提升多语言语音合成质量的关键方法
  • 3大核心功能,让你在《鸣潮》中解放双手的终极自动化解决方案
  • 万国中国官方售后服务网点|官方网站权威指南(2026年7月最新) - 万国中国服务中心
  • 三波技术浪潮与竞争格局:不进则退的AI客服进化史
  • 为什么93%的“模仿提示词”无效?揭秘3个被忽略的语用层变量与动态温度调控法
  • pyuadk社区贡献指南:如何参与OpenEuler密码学生态建设
  • Banyan网络与Clos网络对比:3大指标解析并行计算与数据中心交换拓扑
  • 破解投资回报算不清难题的实战指南