CANN/cannbot-skills Block层开发指南

发布时间:2026/7/16 21:03:48
CANN/cannbot-skills Block层开发指南 Block 层扩展开发指南【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills适用路径blaze_custom路径 A§1 BlockMmad 接口规范模板签名8 参数 SFINAEblock_mmad.htemplate class DispatchPolicy_, class AType_, class LayoutA_, class BType_, class LayoutB_, class CType_, class LayoutC_, class Enable void class BlockMmad;blaze 库为 10 参数多BiasType_LayoutBias_见references/fundamentals/blaze-framework-overview.md§4.4。必需内部类型using L0CType conditional_tis_same_vAType, int8_t, int32_t, float; static constexpr bool transA TagToTransLayoutA::value; struct Params { GM_ADDR aGmAddr; GM_ADDR bGmAddr; GM_ADDR cGmAddr; }; struct L1Params { uint64_t kL1; };接口合约接口职责BlockMmad()预发所有 event slot~BlockMmad()排空所有 event slotInit(TupleShape, BlockShape, L1Params, bool)计算 L1 偏移、K 迭代次数operator()(TensorA, TensorB, TensorC, BlockShape)执行完整 K 迭代流水§2 K-L1/K-L0 双层循环骨架for (uint64_t iter0 0; iter0 kL1Iter_; iter0) { uint64_t l1BufId abL1LoopCnt_ L1_BUFFER_MASK; auto curKL1 (iter0 1 kL1Iter_) ? (k_ - iter0 * kL1_) : kL1_; WaitFlagHardEvent::MTE1_MTE2(l1BufId); Copy(copyGM2L1, tensorAL1, gmA.Slice(...)); Copy(copyGM2L1, tensorBL1, gmB.Slice(...)); SetFlagHardEvent::MTE2_MTE1(l1BufId); WaitFlagHardEvent::MTE2_MTE1(l1BufId); for (uint16_t iter1 0; iter1 CeilDiv(curKL1, baseK_); iter1) { uint64_t l0BufId l0PingPong_ 0x1; WaitFlagHardEvent::M_MTE1(l0BufId); Copy(copyL12L0A, tensorAL0, tensorBlockAL1); Copy(copyL12L0B, tensorBL0, tensorBlockBL1); SetFlagHardEvent::MTE1_M(l0BufId); WaitFlagHardEvent::MTE1_M(l0BufId); bool isLast (iter0 1 kL1Iter_) (iter1 1 kL0Iter); bool isFirst (iter0 0 iter1 0); MmadParams params{(uint16_t)curM, (uint16_t)curN, (uint16_t)curKL0, isLast ? FINAL_ACCUMULATION : NON_FINAL_ACCUMULATION, isFirst}; Mmad(mmadAtom, tensorL0C, tensorAL0, tensorBL0); SetFlagHardEvent::M_MTE1(l0BufId); l0PingPong_; } SetFlagHardEvent::MTE1_MTE2(l1BufId); abL1LoopCnt_; }§3 事件管理Init-Drain 模式构造预发、析构排空确保事件平衡BlockMmad() { for (uint8_t i 0; i L1_BUFFER_NUM; i) SetFlagHardEvent::MTE1_MTE2(i); SetFlagHardEvent::M_MTE1(ZERO_FLAG); SetFlagHardEvent::M_MTE1(FIRST_FLAG); SetMMLayoutTransform(true); } ~BlockMmad() { for (uint8_t i 0; i L1_BUFFER_NUM; i) WaitFlagHardEvent::MTE1_MTE2(i); WaitFlagHardEvent::M_MTE1(ZERO_FLAG); WaitFlagHardEvent::M_MTE1(FIRST_FLAG); SetMMLayoutTransform(false); }构造SetFlag与析构WaitFlag必须完全对称。遗漏析构 WaitFlag → 第二次 kernel 调用 hang。完整配对规则 →references/fundamentals/blaze-sync-patterns.md§3§4 tensor_api 必要知识MakeCopy / Copydst 在前auto copyGM2L1 MakeCopy(CopyGM2L1{}); Copy(copyGM2L1, dstL1Tensor, srcGMTensor);13 种 CopyOperationCopyGM2L1、CopyL12L0A、CopyL12L0B、CopyL0C2GM、CopyL0C2UB等。Routing 按(dstLoc, srcLoc, dstPattern, srcPattern)编译期派发。MakeMmad / MmadMmadParams params{m, n, k, unitFlag, cmatrixInitVal}; Mmad(MmadAtomMmadTraitsMmadOperation{}.with(params), dstL0C, srcL0A, srcL0B);unitFlagFINAL_ACCUMULATIONK 末条/NON_FINAL_ACCUMULATION。cmatrixInitValtrue 清零再累加K 首条。完整 API →references/fundamentals/tensor-api-reference.md§2.4-§2.5§5 Layout 与数据通路L1 双缓冲布局L1: [A0|B0] | [A1|B1] half0 / half1 ping-pong偏移l1BufferAOffset_[bufId] (bufId 1) * l1HalfSize (bufId 1) * aL1OneBuffer_GM→L1 数据通路GM PatternL1 Pattern说明NZLayoutPtn/ZNLayoutPtn同 GM块拷贝NDExtLayoutPtntransfalseNZLayoutPtnND→NZ 转换DNExtLayoutPtntranstrueZNLayoutPtnDN→ZN 转换L0 固定L0A NZLayoutPtnL0B ZNLayoutPtnC0 16。Layout 详解 →references/fundamentals/blaze-matmul-layout.md【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考