Back to Mnn

MNN 新增算子 SKILL

skills/add-new-op/SKILL.md

3.5.05.0 KB
Original Source

MNN 新增算子 SKILL

触发条件:当用户请求为 MNN 添加/实现一个新的算子时触发。常见表述包括:"添加xxx算子"、"实现xxx op"、"支持xxx操作"等。

概述

本 SKILL 指导 AI Agent 为 MNN 框架新增算子支持。采用 TDD(测试驱动)模式,每一步都有明确的测试标准。

核心原则

优先级顺序:几何计算 > 后端实现

  • 几何计算:如果新算子可以通过已有算子的拆解、组合实现,优先用几何计算,不需要为每个后端单独实现
  • 后端实现:如果算子无法拆解,或性能敏感需要原生实现,则添加后端实现

注意事项

严禁访问以下目录schema/private/source/internal/,包含内部私有代码,不得读取、修改或引用


核心文件清单

目录/文件作用何时修改
schema/default/MNN.fbs算子类型和参数定义每个新算子都需要
schema/default/CaffeOps.fbsCaffe 框架算子参数有参数时
schema/default/TensorflowOp.fbsTF 框架算子参数有参数时
source/shape/Shape*.cpp形状(维度)计算输出形状与输入不同时
source/geometry/Geometry*.cpp几何计算(算子拆解)优先实现
source/backend/cpu/CPU*.cpp/.hppCPU 后端实现无法几何拆解时
source/backend/metal/Metal*.cpp/.hpp/.metalMetal 后端实现扩展到 Metal
source/backend/opencl/execution/*.cpp/.h/.clOpenCL 后端实现扩展到 OpenCL
source/backend/vulkan/image/execution/Vulkan*.cpp/.hppVulkan 后端实现扩展到 Vulkan
source/backend/cuda/execution/*.cu/.cuhCUDA 后端实现扩展到 CUDA
include/MNN/expr/ExprCreator.hpp表达式 API 函数需要用户可调用时
test/op/*Test.cpp单元测试每个新算子都需要
tools/script/register.py注册脚本添加 shape/geometry/backend 后运行

分步流程总览

┌──────────────────────────────────────────────────────────┐
│  步骤 1: Schema 定义 (step1-schema.md)                    │
│  输入: 算子名称、语义、输入输出定义                          │
│  输出: MNN.fbs 中的 OpType + 可选的参数 table              │
│  测试: flatc 编译通过                                      │
├──────────────────────────────────────────────────────────┤
│  步骤 2: 形状计算 (step2-shape.md)                        │
│  输入: 算子的输入输出维度关系                                │
│  输出: source/shape/Shape*.cpp                             │
│  测试: register.py 运行成功 + cmake 编译通过               │
├──────────────────────────────────────────────────────────┤
│  步骤 3: 几何计算或 CPU 实现 (step3-compute.md)            │
│  输入: 算子的计算逻辑                                      │
│  输出: Geometry*.cpp 或 CPU*.cpp                           │
│  测试: register.py + 编译通过                              │
├──────────────────────────────────────────────────────────┤
│  步骤 4: 单元测试 (step4-test.md)                         │
│  输入: 算子的预期行为                                      │
│  输出: test/op/*Test.cpp                                  │
│  测试: ./run_test.out op/MyOp 全部通过                     │
├──────────────────────────────────────────────────────────┤
│  步骤 5: 扩展后端与优化 (step5-optimize.md)                │
│  输入: 步骤 4 通过                                        │
│  输出: Metal/OpenCL/Vulkan/CUDA 实现                      │
│  测试: 各后端单元测试通过                                   │
└──────────────────────────────────────────────────────────┘

步骤选择指南

情况需要执行的步骤
输出形状与输入完全一致,可几何拆解1 → 3(几何) → 4
输出形状与输入不同,可几何拆解1 → 2 → 3(几何) → 4
输出形状与输入不同,需要后端实现1 → 2 → 3(CPU) → 4 → 5
输出形状与输入完全一致,需要后端实现1 → 3(CPU) → 4 → 5

开始执行

现在请打开 skills/add-new-op/step1-schema.md,开始步骤 1。