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

CANN/catlass A2至950迁移指导

AtlasA2存量算子向Ascend950代际兼容开发指导

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

写在前面

该文档主要说明,如何基于CATLASS在AtlasA2架构下的存量算子快速迁移到Ascend950架构,包括对原kernel和Block层级组件复用,并无感使用不同架构的Tile组件。

为实现该迁移动作,推荐按照下述三个步骤进行。

Dispatch组件调整

原AtlasA2平台的存量算子使用A2代际语义的Dispatch组件以路由至所需的Block组件(如00_basic_matmul所使用的Dispatch组件为MmadAtlasA2Pingpong),我们建议迁移后算子使用公共代际语义的Dispatch组件(除新算子需使用Ascend950代际独有的特性外),例如MmadPingpong。 如果dispatch_policy.hpp下不包含公共代际语义的Dispatch组件,例如MmadAtlasA2Streamk。由于当前代码仓上不包含组件MmadStreamk,需要进行补充:

template <class ArchTag, bool ENABLE_UNIT_FLAG_ = false, bool ENABLE_SHUFFLE_K_ = false> struct MmadStreamk : public MmadBase<ArchTag, false> { static constexpr uint32_t STAGES = 2; static constexpr bool ENABLE_UNIT_FLAG = ENABLE_UNIT_FLAG_; static constexpr bool ENABLE_SHUFFLE_K = ENABLE_SHUFFLE_K_; };

Block层修改

在Block层级,我们推荐使用下面的SFINAE方案,以保证其对原A2代际语义和公共代际的Dispatch兼容。在写法上,我们为BlockMmad增加了一个Enable模板入参用于候选。 仍以00_basic_matmul为例,其使用的Block组件位于include/catlass/gemm/block/block_mmad_pingpong.hpp,为保持对MmadAtlasA2Pingpong(原代际组件)及MmadPingpong的特化支持,首先实现下述的MmadPingpongDispatchChecker进行判断。

/// check if the dispatch is `MmadAtlasA2Pingpong` or `MmadPingpong` template <class DispatchPolicy> struct MmadPingpongDispatchChecker { static constexpr bool value = false; }; template <bool ENABLE_UNIT_FLAG> struct MmadPingpongDispatchChecker<MmadAtlasA2Pingpong<ENABLE_UNIT_FLAG>> { static constexpr bool value = true; }; template <class ArchTag, bool ENABLE_UNIT_FLAG, bool USE_HF32_MODE, uint32_t L0C_STAGES, bool ENABLE_L1_RESIDENT, uint32_t L1A_STAGES, uint32_t L1B_STAGES, uint32_t L0A_STAGES, uint32_t L0B_STAGES> struct MmadPingpongDispatchChecker<MmadPingpong<ArchTag, ENABLE_UNIT_FLAG, USE_HF32_MODE, L0C_STAGES, ENABLE_L1_RESIDENT, L1A_STAGES, L1B_STAGES, L0A_STAGES, L0B_STAGES>> { static constexpr bool value = true; };

调整BlockMmad模板写法,通过std::enable_if_t结合上述MmadPingpongDispatchChecker进行特化候选。

template < - bool ENABLE_UNIT_FLAG_, + class DispatchPolicy_, class L1TileShape_, class L0TileShape_, class AType_, class BType_, class CType_, class BiasType_, class TileCopy_, class TileMmad_ > struct BlockMmad < - MmadAtlasA2Pingpong<ENABLE_UNIT_FLAG_>, + DispatchPolicy_, L1TileShape_, L0TileShape_, AType_, BType_, CType_, BiasType_, TileCopy_, TileMmad_, + std::enable_if_t<MmadPingpongDispatchChecker<DispatchPolicy_>::value> > { public: // Type Aliases - using DispatchPolicy = MmadAtlasA2Pingpong<ENABLE_UNIT_FLAG_>; + using DispatchPolicy = DispatchPolicy_; using ArchTag = typename DispatchPolicy::ArchTag;

最后,我们建议向修改后的Block组件实现加入代际校验,以便规范对代际范围的约束。如:

// Check ArchTag static_assert(std::is_same_v<ArchTag, Arch::AtlasA2> || std::is_same_v<ArchTag, Arch::Ascend950>, "ArchTag can only be AtlasA2 or Ascend950!");

需要注意的是,在后续Block层实现中如果利用到与Dispatch组件有关的一些特定内容,也可通过SFINAE实现相应的组件。例如00_basic_matmul中所使用的Block组件需要利用Dispatch中声明的STAGES信息,而在公共组件MmadPingpong中,其细化了不同区域上的粒度——包括L1A_STAGES,L1B_STAGES等,这里使用了最小保守策略进行提取(如下),详见这里。

// ... // 针对不同Dispatch特化提取的DispatchStagesGetter template <class ArchTag, bool ENABLE_UNIT_FLAG, bool USE_HF32_MODE, uint32_t L0C_STAGES, bool ENABLE_L1_RESIDENT, uint32_t L1A_STAGES, uint32_t L1B_STAGES, uint32_t L0A_STAGES, uint32_t L0B_STAGES> struct DispatchStagesGetter<MmadPingpong<ArchTag, ENABLE_UNIT_FLAG, USE_HF32_MODE, L0C_STAGES, ENABLE_L1_RESIDENT, L1A_STAGES, L1B_STAGES, L0A_STAGES, L0B_STAGES>> { // Strategy: select the lowest stage as the common STAGES static constexpr uint32_t L1_STAGES = L1A_STAGES > L1B_STAGES ? L1B_STAGES : L1A_STAGES; static constexpr uint32_t L0_STAGES = L0A_STAGES > L0B_STAGES ? L0B_STAGES : L0A_STAGES; static constexpr uint32_t STAGES = L1_STAGES > L0_STAGES ? L0_STAGES : L1_STAGES; };

注意,如果涉及到Epilogue层级的改动,同样需要对其block层组件进行调整,这里不再赘述。

算子修改

完成上述两方面修改后,在算子侧,只需要调整ArchTag标识和相应的Dispatch组件(原A2代际下Dispatch特化仍在AtlasA2下兼容)即可,例如:

// examples/00_basic_matmul/basic_matmul.cpp(previous) // ... - using ArchTag = Arch::AtlasA2; + using ArchTag = Arch::Ascend950; - using DispatchPolicy = Gemm::MmadAtlasA2Pingpong<true>; + using DispatchPolicy = Gemm::MmadPingpong<ArchTag, true>; using L1TileShape = GemmShape<128, 256, 256>; using L0TileShape = GemmShape<128, 256, 64>; // ...

随后即可编译运行适配于Ascend950平台的算子(备注:编译选项请添加-DCATLASS_ARCH=3510


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

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

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

相关文章:

  • C++二叉树构建、深拷贝与可视化输出实战解析
  • 电力系统时序一致性保障:elec-ops-prediction的长时序稳定性约束实现
  • TTK开发者指南:如何贡献代码和扩展功能的10个实用技巧
  • DS18B20时序不稳?一个中值滤波函数帮你搞定所有异常数据(附C代码)
  • 解析2026年新能源PPS材料供应商关键技术与发展路径
  • 昇腾C解交织API文档
  • G-Helper完整指南:3分钟掌握华硕笔记本性能优化神器
  • CANN/catlass LayoutTag(旧版Layout)
  • 靠谱的远程手机控制软件 远程控制手机推荐用无界趣连2.0
  • CANN/.gitcode缺陷报告模板深度解析:如何高效提交昇腾AI问题反馈
  • RV1126B嵌入式OCR实战:CTPN+CRNN模型部署与优化全解析
  • YOLO-ONNX-Java 模型评估指标完全指南:从理论到实践
  • 3大AI创作效率瓶颈的模块化解法:ComfyUI企业级工作流自动化实践
  • Onyx Core API完全手册:RESTful接口详解与实战案例
  • Serverless-Devs插件开发教程:如何扩展工具的核心功能
  • ncmdump终极指南:5分钟解锁网易云音乐NCM加密文件
  • 程序员学习指南【非常详细】|零基础入门到精通
  • 用C语言刷PTA数据结构题:我是如何把链表合并和哈希表删除函数写到面试官满意的
  • 深圳市火灵鸟技术有限公司深度解析:从国产芯到全景可视化,一家执法装备企业的成长路径 - 品牌优选官
  • Wolverine性能优化终极秘籍:从基础配置到高级调优
  • Windows风扇控制实战:3种场景下的智能散热解决方案
  • Linux/Win双平台实战:MinIO安装后第一件事,如何正确设置并牢记你的ROOT密码?
  • 手把手教你为展锐平台新摄像头(如OV08A10)添加驱动:Sensor配置与AF驱动集成详解
  • Intel 14代酷睿接口更迭:技术推演与用户决策指南
  • Kilim Actor模型实践:构建高并发消息传递系统的终极指南 [特殊字符]
  • ArcGIS Pro 3.x 批量处理遥感栅格:用Python脚本实现自动化转点、计算与导出(附完整代码)
  • 调试与性能分析:Ascend TensorFlow Adapter常见问题解决方案
  • CANN/asnumpy-docs 架构设计
  • Kafka-UI:3分钟快速上手,轻松管理你的Apache Kafka集群
  • ESP32任务阻塞导致看门狗报错?手把手教你用menuconfig调整超时时间