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

CANN/catlass GEMM恒等块调度

Gemm Identity Block Swizzle

【免费下载链接】catlass本项目是CANN的算子模板库,提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass

代码位置

功能说明

Swizzle策略决定了AI Core对基本任务块的分配关系和计算顺序,详见Swizzle解释。GemmIdentityBlockSwizzle策略对结果矩阵C在$M$、$N$方向切基本块,根据$SwizzleOffset$和$SwizzleDirection$决定基本块排布顺序,并在排布上按照物理核序号依次分配基本块。

如下图示例,AI Core共20个,基本块沿箭头方向依次分配给AI Core。箭头方向则由$SwizzleOffset = 1$和$SwizzleDirection = 0$来决定:

常用Methods说明

返回类型函数名入参功能
-GemmIdentityBlockSwizzleGemmCoord const &problemShape_, MatrixCoord const &tileMN_构造函数
-GemmIdentityBlockSwizzleGemmCoord const &problemShape_, MatrixCoord const &tileMN_, MatrixCoord const &loopsMN_构造函数
voidUpdateGemmCoord const &problemShape_, MatrixCoord const &tileMN_更新problemShapetileMNloopsMN
voidUpdateGemmCoord const &problemShape_, MatrixCoord const &tileMN_, MatrixCoord const &loopsMN_更新problemShapetileMNloopsMN
uint32_tGetCoreLoops-返回基本块个数(M、N维度切块数乘积)
uint32_tGetBatchIdxuint32_t taskIdx计算输入基本块idx对应的基本块所属batch编号
GemmCoordGetBlockCoorduint32_t taskIdx计算输入基本块idx对应的基本块在各维度上的坐标blockCoord
GemmCoordGetActualBlockShapeGemmCoord blockCoord根据输入的基本块坐标blockCoord,返回基本块的实际shape

调用示例

Block组装

参考basic_matmul

// Swizzle offset is 3 and direction is 0. using BlockScheduler = typename Gemm::Block::GemmIdentityBlockSwizzle<3, 0>; // kernel level using MatmulKernel = Gemm::Kernel::BasicMatmul<BlockMmad, BlockEpilogue, BlockScheduler>;

Matmul的kernel使用

参考basic_matmul,在kernel代码的void operator()<AscendC::AIC>函数中。

实例化BlockScheduler

BlockScheduler matmulBlockScheduler(params.problemShape, MakeCoord(L1TileShape::M, L1TileShape::N));

获取基本块总数

uint32_t coreLoops = matmulBlockScheduler.GetCoreLoops();

基本块遍历中,获取当前block的block坐标和实际shape

for (uint32_t loopIdx = AscendC::GetBlockIdx(); loopIdx < coreLoops; loopIdx += AscendC::GetBlockNum()) { // Compute block location GemmCoord blockCoord = matmulBlockScheduler.GetBlockCoord(loopIdx); GemmCoord actualBlockShape = matmulBlockScheduler.GetActualBlockShape(blockCoord); ... }

GroupMatmul的kernel使用

参考grouped_matmul_slice_m_per_token_dequant_multistage_workspace,在kernel代码的void operator()<AscendC::AIC>函数中。

实例化BlockScheduler

BlockScheduler blockScheduler;

group的遍历中,根据每个group的shape更新blockScheduler,并获取单个group的基本块总数

for (uint32_t groupIdx = 0; groupIdx < params.problemCount; ++groupIdx) { ... blockScheduler.Update(inGroupProblemShape, L1TileShape::ToCoordMN()); uint32_t coreLoops = blockScheduler.GetCoreLoops(); ... }

单个group的基本块遍历中,获取当前block的block坐标和实际shape

for (uint32_t loopIdx = startLoopIdx; loopIdx < coreLoops; loopIdx += coreNum) { GemmCoord blockCoordMNK = blockScheduler.GetBlockCoord(loopIdx); GemmCoord actualBlockShapeMNK = blockScheduler.GetActualBlockShape(blockCoordMNK); ... }

【免费下载链接】catlass本项目是CANN的算子模板库,提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass

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

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

相关文章:

  • 2026年Q2北京铝镁锰板实力厂家盘点:廊坊铝硕金属制品有限公司深度解析 - 2026年企业推荐榜
  • JavaScript while 循环详解
  • Chainlit:快速构建AI应用界面的Python框架,无缝集成LangChain与OpenAI
  • 基于粒子群优化算法的微电网调度(光伏、储能、电动车、电网交互)(Matlab代码实现)
  • 线上推广公司怎么选?2026五家主流服务商全景评测与商家决策手册 - GEO优化
  • 2026 国内大模型 API 中转选型笔记:从接入成本到长期维护的几个观察
  • Bean 什么时候会被销毁?
  • 如何创建一个 Springboot Starter
  • OpenClaw 用户如何快速配置 Taotoken 聚合端点实现多模型调用
  • 【2026最新版|收藏备用】用Skill简化大模型知识库连接,小白程序员入门必看
  • Dify工作流实战:构建HR与网络安全AI应用脚本库
  • 09-扩展知识——05. date 类 - 处理日期
  • 基于Kubernetes的AI应用控制平面:kiro-acp架构解析与实践指南
  • Bean 会被 JVM 回收吗?
  • Animal-AI环境:连接强化学习与认知科学的3D虚拟实验室
  • 网络安全工程师超详细职业规划!零基础从入门到精通全程路线,看这一篇就够了
  • 收藏!2026年转AI大模型应用开发,正确学习顺序别踩坑(小白/程序员必看)
  • Undertow高性能Web服务器:架构解析与Java微服务实战
  • 医学影像分割:2D超图像与3D网络性能对比与选型指南
  • AI编程助手本地化提速:钩子拦截模式实现零延迟命令执行
  • Clawd-Code:基于LLM与代码库构建智能开发Agent的开源框架
  • CANN/cann-learning-hub:算子Kernel直调编程
  • 收藏必看!2026年AI内卷混战风口拆解,小白也能轻松入局大模型
  • OpenClaw本地AI智能体部署指南:从Docker到多平台实战
  • SSD主控架构到工业存储落地:天硕自研主控技术路径参照
  • 2026年国内GEO公司综合实力前五强榜单推荐:主流头部GEO服务商实力全解析 - GEO优化
  • 2026 年广州 GEO 服务商综合实力五强榜单与实战选型指南 - GEO优化
  • 容器是怎么管理 Bean 的?
  • 2026年近期大庆企业如何选择专业可靠的短视频服务伙伴? - 2026年企业推荐榜
  • 云原生性能测试平台OpenClaw Cloud:架构解析与实战部署指南