样例贡献流程

本文档详细介绍了在CATLASS模板库中贡献完整算子样例的流程,包括设计、开发、测试和合入四个阶段,旨在帮助开发者规范地贡献高质量的算子样例。

1. 设计阶段

1.1 需求分析

在开始实现之前,需要明确以下几点:

  • 算子功能:明确算子的数学定义、输入输出格式、支持的数据类型等
  • 应用场景:了解算子的典型使用场景和性能要求
  • 兼容性:确认算子与现有模板库的兼容性
  • 新增特性:识别新增样例的独特特性,确保与仓上已有特性不完全重复,避免功能重叠

1.2 方案设计

根据需求分析,设计具体的实现方案:

  • 模板选择:选择合适的基础GEMM模板(如BasicMatmul、SplitkMatmul等)
  • 参数设计:设计Tiling参数、Dispatch策略等
  • 优化策略:制定性能优化策略,如Preload、SplitK等
  • 新特性组件:为新特性设计新增组件,确保功能完整且与现有组件良好集成,不涉及新特性的代码建议尽可能复用仓上已有组件模板

1.3 文档设计

设计算子样例的文档结构:

  • README.md:包含简略的算子说明、使用示例等
  • 设计文档:说明样例的原型设计、设计方案、样例实现、性能测试,性能评估时若有标杆,建议说明和标杆相比的优势场景

2. 开发阶段

2.1 环境准备

参考快速上手文档,搭建开发环境:

  1. 安装CANN toolkit
  2. 克隆代码仓
  3. 配置编译环境

2.2 代码实现

按照以下结构实现算子样例:

examples/${id}_${op_name}/
├── CMakeLists.txt        # CMake编译文件
├── README.md             # 算子样例使用说明文档
├── ${id}_${op_name}.md   # 算子样例设计文档
└── ${op_name}.cpp        # 主实现文件

2.3 核心实现

2.4 编译测试

使用以下命令编译和测试(以A2为例):

# 编译算子样例
bash scripts/build.sh ${id}_${op_name}

# 运行测试
./output/${id}_${op_name}

3. 测试阶段

3.1 精度测试

执行至少200例的泛化精度测试,覆盖不同的输入形状和数据类型。测试标杆若无法复用examples/common/golden里的已有标杆,则需要自行补充标杆。精度测试结果需要在合入PR中说明。

3.2 性能测试

与核性能标杆进行对比测试,展示性能优势。需要在算子设计文档里增加性能结果、测试环境、标杆等详细信息。

4. 合入阶段

4.1 代码准备

  • 代码规范:确保代码符合项目的代码风格和规范
  • 文档完善:完善README.md和设计文档
  • 测试覆盖:确保测试覆盖足够的场景
  • 测试用例:在tests/test_example.py里增加新增样例的测试用例

4.2 提交流程

参考贡献指南,按照以下流程提交:

  1. 创建Issue:在GitCode上创建Requirement|需求建议类Issue,说明新算子样例的设计方案
  2. 分配任务:在Issue评论中输入"/assign"或"/assign @yourself",将Issue分配给自己
  3. 代码提交:提交代码到个人分支
  4. 创建PR:创建Pull Request,详细填写PR模板
  5. 代码审查:等待项目维护者进行代码审查
  6. 合入代码:审查通过后,代码将被合入主分支

4.3 后续维护

  • 问题响应:及时响应社区反馈的问题
  • 文档更新:根据使用情况更新文档