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

cannbot-skills Blaze后处理模块

Blaze Custom Epilogue 层模块手册

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

定位:blaze_custom 路径下 Epilogue 层各模块的使用手册。Epilogue 层运行在 AIV 核心上,接收 AIC 通过 CopyL0C2UB 写入 UB 的 matmul 结果,执行 vector 后处理并写回 GM。


§1 模块清单

模块头文件类型说明
EpilogueFusionRegBaseepilogue/epilogue_fusion_regbase.h通用 RegBase 框架使用__VEC_SCOPE__+Reg::API,中间值不写回 UB
MulEpilogueepilogue/epilogue_fusion_membase.h参考 MemBase 实现Output = matmul(A,B) × D,使用AscendC::Mul
CvSync常量epilogue/cv_sync_constants.h同步常量集MODE=4, AIC_TO_AIV_FLAG=8, AIV_TO_AIC_FLAG=5, COUNT_ID_MAX=15, COUNT_FLAG=3

设计文档入口

  • 通用设计方法:development/epilogue-dev-guide.md
  • MemBase 设计:development/epilogue-membase-design.md
  • RegBase 设计:development/epilogue-regbase-design.md

RegBase 核心特性

  • 计算核心使用__VEC_SCOPE__块,内部声明Reg::RegTensor<T>Reg::MaskReg
  • 中间值全程驻留向量寄存器,不落 UB,减少 UB 中间 buffer 数量
  • 通过Reg::LoadAlign加载、Reg::StoreAlign写回
  • 支持Reg::Add/Sub/Mul/DivReg::Adds/Muls/DivsReg::AxpyReg::Exp/Log/Abs/SqrtReg::Compare/Select等 API

MemBase 参考实现(MulEpilogue)

  • 使用标准 AscendC API(AscendC::Mul
  • 三路 UB buffer:cLocal_(matmul 结果)+dLocal_(第二路输入)+cLocalTmp_(计算结果)
  • StageNum = 2(UB 分区数)

§2 RegBase vs MemBase 选择

判断维度选 RegBase选 MemBase
公式复杂度复杂公式(GELU / SwiGLU / LayerNorm),3+ 中间值简单 vector 操作(Mul / Add / Div)
可用 API需要Reg::系列 API(Exp/Log/Axpy 等)已有现成AscendC::API(如AscendC::Mul
UB 占用较少(2-3 blocks)较多(3-4 blocks)
AIV 效率更高(寄存器级操作,无 UB 读写开销)一般(需 UB 中间 buffer 读写)
开发难度较高(需理解 RegTensor/MaskReg/VF 循环)较低(类标准 AscendC 开发)

决策建议:优先 RegBase。仅当融合操作为单一 vector op 且已有对应AscendC::API 时选 MemBase。

设计细节请查阅:

  • development/epilogue-dev-guide.md
  • development/epilogue-membase-design.md
  • development/epilogue-regbase-design.md

§3 接口契约

普通 C+V 与 MX C+V 的 Epilogue 类必须提供以下四个接口,与MatmulKernelFused/MxMatmulKernelFused兼容:

接口签名说明
Paramsstruct Params { ... }参数结构体,含 GM_ADDR 字段
Initvoid Init(Params, baseM, baseN, ProblemShape)初始化 UB 布局、绑定 GM 地址
operator()void operator()(BlockShape, gmOffset, flagId)逐 tile 执行后处理
GetTensorauto GetTensor()返回cLocal_(UB Tensor,供 Kernel 层 CopyL0C2UB 使用)

Grouped C+V 使用 context-based Epilogue,operator()签名不同:

__aicore__ inline void operator()(BlockShape blockShape, TileContext tileContext, int64_t flagId)

TileContextGroupMatmulKernel传入,包含groupIdxprefixMmOffsetnOffsetwriteMtotalMtotalNtotalK等字段。普通 linear offset Epilogue 不直接兼容 Grouped C+V。

兼容性矩阵

Epilogue 类型普通 C+VMX C+VGrouped C+V
MulEpilogue/ 普通 linear offset Epilogue可用可用,但必须按GetTaskRation()/GetSubBlockIdx()消费 SplitM 后的 UB不直接可用
MX SplitM-aware Epilogue不需要可用不直接可用
context-based grouped Epilogue不需要不需要必需

Params 结构体约定

  • RegBase:GM_ADDR extraInputAddr(额外输入)+GM_ADDR outputGmAddr(输出)
  • MemBase(MulEpilogue):GM_ADDR multiplierGmAddr(乘数 D)+GM_ADDR outputGmAddr(输出)

BlockShape / ProblemShape

  • BlockShape = AscendC::Shape<int64_t, int64_t, int64_t, int64_t>{curM, curN, 1, 1}
  • ProblemShape = AscendC::Shape<int64_t, int64_t, int64_t, int64_t>{m, n, k, 1}

辅助方法

  • InitParams(Params)__host_aicore__静态方法,用于 host 端参数透传

§4 UB 占用情况

路径UB 分区说明
RegBase2-3 blockscLocal_(matmul 结果,固定)+extraBuf_(额外输入,1 行)+bf16Out_(输出,stageRows 行)
MemBase3-4 blockscLocal_(matmul 结果,固定)+dLocal_(第二路输入,stageSize)+cLocalTmp_(计算结果,stageSize)

RegBase UB 布局计算

matmulAreaBytes = ceilDiv(baseM, taskRation) × nAlign × sizeof(L0CDataType) extraBufBytes = nAlign × sizeof(ComputeType) remainBytes = TOTAL_UB_SIZE - matmulAreaBytes - extraBufBytes stageRows_ = remainBytes / (nAlign × sizeof(OutputType))

MemBase UB 布局计算

matmulArea = ceilDiv(baseM, taskRation) × nAlign // 元素数 lastUBBytes = TOTAL_UB_SIZE - matmulArea × sizeof(DataType) stageSize_ = min(lastUBBytes / StageNum / sizeof(DataType), matmulArea)

RegBase 通过ReinterpretCast划分 UB 区域,MemBase 通过LocalTensor偏移划分。RegBase 的 stage 循环按行切分(rowsThisStage),MemBase 按元素数切分(curStageSize)。


§5 命名空间说明

模块命名空间说明
EpilogueFusionRegBase全局作用域不在任何 namespace 内
MulEpilogue全局作用域不在任何 namespace 内
CvSyncCvSync::namespace同步常量集合

Epilogue 类定义在全局作用域,不归属Kernel::Block::namespace。Kernel 层通过模板参数直接引用 Epilogue 类名(如MatmulKernelFused<..., EpilogueFusionRegBase>)。

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

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

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

相关文章:

  • 海牙认证费用多少?一文看懂省钱攻略,这篇就够了! - 指上通
  • 10个实用技巧:优化mlx-community/gemma-4-31b-it-nvfp4在Mac上的性能表现 [特殊字符]
  • PCB线路板打样起泡问题分析与解决方案
  • GoLand 2025 安装配置全指南:适配 Go 1.23 与 go.work 工作区
  • 企业级部署指南(Claude最新模型更新后首个生产级Docker镜像+GPU显存优化方案,仅限前500名技术负责人领取)
  • Blender操作可视化终极指南:Screencast Keys完整教程
  • Dolphin3-Cyber-8B-GGUF提示词工程:如何让AI生成精准的漏洞利用代码与防御建议
  • CO-PA月末关账:从成本中心到获利段的费用分摊实战(KEU5)
  • 2026 广州名表回收星级实测 TOP 榜单,满分标杆奢小觅便民变现全指南 - 全国二奢机构参考
  • C++多态性实战解析:从运算符重载到抽象类设计
  • openEuler-menus故障排除:常见问题与解决方案大全
  • 2026年除醛服务避坑指南:荃净除甲醛公司靠谱吗 - 亚东说
  • 计算机毕业设计之基于springboot的志愿者服务管理系统
  • Cocos2d-x游戏开发入门:跨平台框架实战指南
  • 嵌入式Linux系统框架与驱动开发实践
  • 2026年中山公园步道灯评测:性价比之王揭晓 - 资讯纵览
  • CameraKit iOS自定义会话开发:扩展相机功能的完整指南
  • 3分钟快速上手SingGuard-2b:零基础实现AI内容安全审核的完整指南
  • atom-script安全注意事项:在Atom中运行代码的安全指南
  • 长沙业主空调清洗经验:2026年避坑 - 简单到家
  • 从业者必读 推荐上海取保缓刑律师团队排行参考指南 - 信息热点
  • 5个步骤部署Efficient-DLM-4B:高效扩散语言模型实战教程 [特殊字符]
  • Kafka性能调优的三体运动:生产者Batch、Broker页缓存与Consumer拉取策略的联动优化实战手册
  • 2026父母帮子女相亲哪家好?正规靠谱平台深度盘点,避坑指南与选型全攻略 - 行业观察网
  • 2026 汉中雨季屋顶渗漏水频发!顶层楼面漏水根治方案,5 年质保更稳妥 - 宅安选房屋修缮
  • 终极指南:使用pyautocad快速实现Python与AutoCAD自动化集成
  • Dropify完全指南:从基础配置到高级功能的10个实用技巧
  • XMRig NVIDIA错误代码大全:解决挖矿常见问题的终极指南
  • 模型推理的流水线并行:不同阶段的延迟不均衡问题与负载均衡策略
  • fullstack-javascript-architecture社区贡献指南:如何为开源项目添砖加瓦