CANNBlazeCustomKernel模块手册

Blaze Custom Kernel 层模块手册

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

定位:blaze_custom 路径下 Kernel 层各模块的使用手册。Kernel 层负责构建 GM Tensor、驱动 BlockScheduler 循环取块坐标、调用 BlockMmad 完成单 block 计算。


§1 MatmulKernel

项目说明
头文件kernel/matmul_kernel.h
命名空间Kernel::MatmulKernel
模板签名template <class ProblemShape, class BlockMmad, class BlockScheduler>
核心职责纯 AIC matmul,GM→L1→L0→MMAD→L0C→GM

模板参数说明

参数含义
ProblemShape问题规模结构体,须含mnk字段
BlockMmadBlock 层 MMAD 实现类(须来自Block::BlockMmad特化)
BlockSchedulerScheduler 策略标签(如MatmulSwatScheduler<NO_FULL_LOAD_MODE>

Params 结构体字段

字段类型说明
problemShapeProblemShape问题规模
mmadParamsBlockMmad::ParamsGM 地址(aGmAddr, bGmAddr, cGmAddr)
l1ParamsBlockMmad::L1ParamsL1 流水参数(kL1)
schParamsBlockSchedulerOp::Params调度器参数
qbmmParamsMatmulTilingTiling 参数(baseM, baseN, baseK, dbL0C)

运行模式:仅 AIC 核心执行,AIV 直接返回(if ASCEND_IS_AIV { return; })。

支持的 dtype / trans / format

  • AType/BType:floatbfloat16_thalfint8_tfp8_e4m3_t
  • transA/transB:由BlockMmad::LayoutA/LayoutB推导(TagToTrans
  • GM Layout:NDExtLayoutPtn(行主序)/DNExtLayoutPtn(列主序),C0 = 32 / sizeof(dtype)

§2 MatmulKernelFused

项目说明
头文件kernel/matmul_kernel_fused.h
命名空间Kernel::MatmulKernelFused
模板签名template <class ProblemShape, class BlockMmad, class BlockScheduler, class Epilogue>
核心职责AIC/AIV 融合 matmul,CV 同步 + Epilogue 后处理

与 MatmulKernel 的关键差异

差异点MatmulKernelMatmulKernelFused
模板参数3 个4 个(多Epilogue
核心模式纯 AICAIC + AIV 混合
输出 TensorGM Tensor(CopyL0C2GM)UB Tensor(CopyL0C2UB)
CV 同步CrossCoreSetFlag / CrossCoreWaitFlag
EpilogueAIV 端执行后处理并写回 GM

CV 同步协议:使用CvSync::MODE(=4),AIC 通过CrossCoreSetFlag通知 AIV 数据就绪,AIV 完成 Epilogue 后通过CrossCoreSetFlag回复 AIC。Flag ID 按count / COUNT_ID_MAX % COUNT_FLAG轮转,避免信号冲突。

Params 额外字段:在 MatmulKernel 基础上增加EpilogueParams epilogueParams


§3 GroupMatmulKernel

项目说明
头文件kernel/group_matmul_kernel.h
命名空间Kernel::GroupMatmulKernel
模板签名template <class ProblemShape, class BlockMmad, class BlockScheduler, class Epilogue = void>
核心职责M 轴分组 Matmul,每组独立调度

分组机制

  • groupListGmAddr:GM 上的int64_t数组,每个元素为该组的 M 维度大小
  • 外层循环遍历groupIdx ∈ [0, groupNum),每轮:
    1. 读取groupM = groupList[groupIdx]
    2. 计算prefixM(前缀 M 偏移),用于定位 A/C 的 GM 地址
    3. B 矩阵按groupIdx * n * k偏移(每组独立 B)
    4. 调用CalcBalancedBaseM动态调整当前组的 baseM
    5. 调用bs.UpdateBaseM(curBaseM)+bs.UpdateNextProblem(shape)刷新调度器

Epilogue 默认值Epilogue = void时为纯 AIC 直写 GM;传非 void Epilogue 启用 AIC/AIV 融合路径,通过GroupMatmulEpilogueTraits判断是否启用。

TileContext 结构体:融合路径下传递给 Epilogue 的上下文,包含groupIdxgroupNumprefixMgroupMmOffsetnOffsetcurMcurNwriteMtotalMtotalNtotalK


§4 MatmulKernelMxFused(MxMatmulKernelFused)

项目说明
头文件kernel/matmul_kernel_mx_fused.h
命名空间Kernel::MxMatmulKernelFused
模板签名template <class ProblemShape, class BlockMmad, class BlockScheduler, class Epilogue>
核心职责MX 量化 matmul + CV 融合 Epilogue

与 blaze 库 MX Block 的对接

  • BlockMmad 使用 blaze 库的Blaze::Gemm::BlockMmad(MX 量化版),而非 blaze_custom Block
  • operator()调用签名:blockMmadOp(gmA, gmB, gmScaleA, gmScaleB, gmBias, ubBlockC, singleShape)
  • Init接受 4D ProblemShape,附加isBias/dbL0C参数
  • BlockScheduler 直接使用 blaze 库调度器(无BlockSchedulerSelector
  • C0_SIZE 由IsFp4<AType>()决定:FP4 → 64,FP8 → 32
  • L0CType 固定为float
  • Scale Tensor 需要额外的 layout(ScaleADNLayoutPtn/ScaleANDLayoutPtn)和 Slice
  • MxMatmulKernelFused传入 UB Tensor 触发 blaze library MX Block 的 L0C2UB 路径;当前该路径使用CopyL0C2UBSplitMTrait / DUAL_DST_SPLIT_M,Epilogue 必须按GetTaskRation()/GetSubBlockIdx()消费 M 分片

QBMMTiling 额外字段:在 baseM/baseN/baseK/dbL0C 基础上增加isBias(uint32_t)。


§5 混用禁令

默认情况下,blaze_custom 的 Kernel / Block / Scheduler 只能互相搭配,禁止与 blaze 库模块任意混用。MX C+V 的MxMatmulKernelFused是唯一明确支持的受控例外。

组合合法性说明
blaze_custom Kernel + blaze_custom Block + blaze_custom Scheduler合法标准 blaze_custom 路径
任意手工混用 blaze_custom Kernel + blaze 库 Block禁止模板参数数量、Params、SFINAE 机制不兼容
任意手工混用 blaze_custom Kernel + blaze 库 Scheduler禁止Scheduler 接口不匹配BlockSchedulerSelector
MxMatmulKernelFused+ blaze 库 BlockMmad + blaze 库 Scheduler合法MX 场景的例外,Kernel 本身引用 blaze 库头文件

§6 命名空间说明

模块命名空间说明
blaze_custom KernelKernel::Kernel::MatmulKernelKernel::MatmulKernelFused
blaze 库 KernelBlaze::Gemm::Kernel::Blaze::Gemm::Kernel::KernelMatmulBasic
blaze_custom BlockBlock::Block::BlockMmadBlock::MatmulBlockScheduler
blaze 库 BlockBlaze::Gemm::Block::Blaze::Gemm::Block::BlockMmad

两者命名空间完全独立,不存在继承关系。blaze_custom 使用Block::BlockSchedulerSelector做调度器派发,blaze 库使用GemmUniversal框架直接绑定。

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

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