EVG 快速上手【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass如果只是想先把第一个 EVG 样例跑起来再理解它是怎么组装出来的这篇文档可以直接作为入口。更完整的接口说明见 evg_api设计背景见 01_evg_design。目标这里用最简单的一类 EVG 场景说明接入过程GEMM 主循环先算出C A x BEVG 再完成逐元素加法D C X对应的图结构可以理解成从 GEMM 结果读取C从 GM 读取外部输入X做一次逐元素Add把结果写回D第一步定义 EVG这一步只描述尾处理逻辑不关心 tile 切分、双缓冲和事件同步。D C X在当前接口下可以写成一棵TreeVisitor#include catlass/epilogue/fusion/fusion.hpp using LayoutX LayoutC; using LayoutD LayoutC; using AddVisitor Epilogue::Fusion::TreeVisitor Epilogue::Fusion::VisitorComputeEpilogue::Fusion::Add, ElementC, Epilogue::Fusion::VisitorAccLoadElementC, Epilogue::Fusion::VisitorAuxLoadElementC, LayoutX ; using EVG Epilogue::Fusion::TreeVisitor Epilogue::Fusion::VisitorAuxStoreElementC, LayoutD, AddVisitor ;这里各节点的职责分别是VisitorAccLoad读取 GEMM 结果VisitorAuxLoad读取外部输入XVisitorComputeAdd, ...完成C XVisitorAuxStore写回D如果只是做这类“先取数再做逐元素计算最后写回”的尾处理通常直接用TreeVisitor就够了。第二步组装 BlockEpilogueEVG 本身只描述图。真正把它接到 GEMM 后面的是BlockEpilogue。对最常见的 GM workspace 路径可以写成using ArchTag Arch::Ascend950; constexpr uint32_t computeLength (216 * 1024 / 3 / 2 / sizeof(ElementC)) / BYTE_PER_C0 * BYTE_PER_C0; using BlockEpilogue Epilogue::Block::BlockEpilogue Epilogue::EpilogueVisitorfalse, ArchTag, IntcomputeLength, EVG, ElementC ;这里真正需要先记住的只有两点EpilogueVisitorfalse表示走 GM workspace 路径computeLength决定单次在 UB 中处理多少元素computeLength的完整口径在 evg_api 的“computeLength 选择”里有单独说明。第一次接入时直接沿用已有 EVG 样例的计算方式最稳妥。第三步选择 visitor kernel把 EVG 接到 GEMM 主循环上时当前主仓口径下使用 visitor kernel#include catlass/gemm/kernel/basic_matmul_tla_visitor.hpp using MatmulKernel Gemm::Kernel::BasicMatmulTlaVisitorBlockMmad, BlockEpilogue, BlockScheduler;如果后面要走 UB workspace 路径再把这里替换成BasicMatmulTlaUbVisitor同时把EpilogueVisitorfalse和VisitorAccLoad对应切到 UB 模式。第四步准备 EVG 参数EVG 的参数单独放在EVG::Arguments里再作为evg_args传给 kernelArguments。TreeVisitor的参数顺序是“先子后父”所以D C X可以这样写typename EVG::Arguments evg_args{ { {}, {deviceX, layoutX}, {} }, {deviceD, layoutD} };对应关系如下第一个{}VisitorAccLoad::Arguments{deviceX, layoutX}VisitorAuxLoad::Arguments第二个{}VisitorCompute::Arguments{deviceD, layoutD}VisitorAuxStore::Arguments再把evg_args放进 kernel 参数typename MatmulKernel::Arguments arguments{ problemShape, deviceA, layoutA, deviceB, layoutB, deviceD, layoutD, nullptr, evg_args };这里有一个当前实现里的固定点公开Arguments里虽然保留了ptrC/layoutC但 visitor 路径真正的写回位置还是由evg_args里的VisitorAuxStore决定。第五步编译与执行以39_ascend950_matmul_add_evg为例编译方式和其他样例一致bash scripts/build.sh 39_ascend950_matmul_add_evg -DCATLASS_ARCH3510cd output/bin ./39_ascend950_matmul_add_evg 256 512 1024 0出现Compare success.说明这条Matmul Add链路的结果符合预期。接下来读什么如果已经能看懂上面的组装过程后面可以继续看evg_api把TreeVisitor、TopologicalVisitor、节点参数和computeLength一次看清楚01_evg_design补执行模型、分层关系和双缓冲时序02_evg_extension需要新增算子或节点时再看对照代码时优先看这几类文件include/catlass/epilogue/fusion/fusion.hppinclude/catlass/gemm/kernel/basic_matmul_tla_visitor.hppinclude/catlass/epilogue/block/block_epilogue_visitor.hppEVG 样例代码【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考