ascend-kernel-ut

Ascend C 算子开发工具,通过 Kernel 直调工程完成算子中部分单元模块的完整开发流程(环境 → 设计 → 开发 → 测试 → 验收)。

为什么不直接用cannbot提供的kernel直调工程?

  • 目前cannbot提供的kernel直调算子工程过于庞大,代码编写和验证效率过低,不适合日常算子开发过程中单元模块开发测试。本skill相较于cannbot,完整流程耗时从30min->5min。

ascend-kernel-ut想做什么

  • 就两个目标:快和简单! 只做单模块功能验证,采用bisheng直接编译,单次编译在1-5s内,速度快;由 AI 自动完成 golden 数据、kernel 代码与测试用例的设计,并实现 自验证、自修正 的完整闭环。

依赖

采用 (Claude Code + cc-switch) / (Codex) + CANNBot + ascend-kernel-ut 协作:

组件职责
Claude Code / Codex用户交互入口,接收算子开发需求,调度 CANNBot 插件和 Skill
CANNBot插件生态管理层,提供 API 文档检索(ascendc-docs-search)、最佳实践(ascendc-api-best-practices)、精度调试(ascendc-precision-debug)等基础 Skill
ascend-kernel-ut轻量级 NPU Kernel 单元测试生成器,负责从需求到验证的完整 UT 闭环

ascend-kernel-ut 功能详解

定位

做什么:生成 Kernel 直调 UT 项目,设计白盒测试用例覆盖关键路径,生成代码,编译运行,验证正确性并自查代码。

支持范围:Vector 算子,MemBase 和 RegBase 两种编程模式。

生成项目结构(交付件)

  • DESIGN.md:详细介绍该功能实现逻辑,和针对该功能的白盒用例设计。(建议严查!)
  • golden.py:python实现的cpu golden逻辑。
  • kernel.asc:具体kernel逻辑实现,kernel单元模块数据输出。
  • verify_result.py:读取golden和kernel输出,进行对比。

交付件简单,开发只需聚焦核心kernel实现即可。

<op_name>/
├── main.asc              # Kernel 直调源码(含 Device + Host 端)
├── golden.py             # 白盒测试数据生成 + 参考计算
├── verify_result.py      # 精度验证脚本
├── input/                # 测试输入数据(golden.py 生成)
│   ├── input_x.bin
│   └── input_y.bin
└── output/               # 运行输出 + 参考输出
    ├── output.bin
    └── golden.bin

工作流程

Step 1: 环境检测
    ├── ASCEND_HOME_PATH → CANN 环境
    ├── npu-smi info → 芯片型号(A2/A3/A5)
    ├── bisheng → 编译工具链
    └── cannsim → 仿真工具(可选)

Step 2: 解析需求
    ├── 提取:op_name, 功能描述, data_type, npu_arch, core_count
    └── 自动选择编程模式:A2/A3 → MemBase, A5 → RegBase

Step 3: 方案设计
    ├── 查阅 CANNBot API 文档(禁止编造 API)
    ├── 组合多种 API 实现算子功能
    └── 输出 DESIGN.md 供用户审核

Step 4: 白盒测试用例设计
    ├── 基本路径:正常输入验证核心计算逻辑
    ├── 边界值:全零、极大值、极小值
    ├── 特殊约束:算子域约束(如 Sqrt 需正值)
    └── 对称性:如 Add 的 x+(-x)=0

Step 5: 生成项目文件
    ├── main.asc — Kernel 直调源码(MemBase/RegBase 模板)
    ├── golden.py — Python 参考计算 + 测试数据生成
    └── verify_result.py — 精度验证脚本

Step 6: 编译、运行、验证、自查
    ├── bisheng 编译
    ├── golden.py 生成数据 → 运行 kernel → verify_result.py 比对
    ├── 自查代码(API 一致性、dtype 统一、输入输出数量)
    └── 失败最多重试 3 次

支持内容

  • 环境检测(CANN、NPU、bisheng、cannsim)
  • 解析需求并查阅参考代码和 API 文档(通过 CANNBot Skill 检索)
  • 方案设计(输出 DESIGN.md,含 API 选型与功能映射)
  • 设计白盒测试用例(基本路径、边界值、特殊约束、对称性)
  • 生成项目文件(main.asc + golden.py + verify_result.py)
  • 编译、运行、验证(bisheng 编译 → 数据生成 → kernel 执行 → 精度比对 → 代码自查)

案例:编写单元测试代码 — CastNd2Nz 功能

比如在客户现场没有A5环境,需要使用cannsim进行仿真验证的时候,用AI可以节省大量时间,不必每次修改都自己盯着,交给AI可以节省时间。

需求输入

/ascend-kernel-ut 在A5上,不使用datacopy的随路转换,基于RegBase实现nd2nz的转换,数据类型是bf16,输入的nd矩阵shape为n*d,其中d固定为512。

自我任务安排

环境检测 → 方案调研 → 方案撰写输出 → 白盒用例设计 → 代码实现 → 验证检测

image-cxcg.png

Step 1-2:环境检测 + 需求解析

因为我在蓝区没有A5环境,所以在skill中写了cannsim的逻辑, 首先会判断当前cann、bisheng、cannsim是否可用。

image-ntUk.png

然后根据结合用户需求 → 选择 MemBase 编程模式,解析参数:

image-Hmpd.png

  • op_name: nd2nz_custom
  • functionality: ND→NZ 矩阵格式转换
  • data_type: bfloat16
  • npu_arch: dav-3510
  • 编程模式: RegBase
  • 输入shape: n×d,d固定512

并加载对应的方案实现最佳实践

Step 3:方案设计

查阅 API 文档后开始写方案设计 DESIGN.md:

image-ysVI.png

完成的DESIGN.md如下,点击查看完整方案设计:

image-mySh.png

Step 4:白盒测试用例

这一步也涵盖在Step 3中,并写入DESIGN.md文件里。

用例输入设计覆盖路径
递增序列np.arange(total_elems, dtype=np.float32)基本计算路径,验证排列正确性
全零np.zeros(N)零值边界
按块赋值每个 16x16 块用不同常量验证块边界

Step 5:生成

完成三个代码部分的交付件,golden、kernel和验证脚本。
image-EEhk.png

Step 6:编译 → 验证

编译kernel → 生成验证数据 → 运行仿真 → 检查结果。
image-gvZH.png

如果精度不对,skill将对结果进行检查(这里他逐点检查,查看哪个错误):

image-FTZv.png

而后经过三轮修改后,精度正确:

image-Vbxv.png

首case通过后,开始验证其他case:

image-KYra.png

所有case都通过后,最后完成交付汇报:

image-KHQQ.png

# 编译
bisheng main.asc --npu-arch=dav-3510 -o main

# 生成测试数据
python3 golden.py

# 运行 kernel
./main

# 精度验证
python3 verify_result.py output/output.bin output/golden.bin
# 输出: 验证失败: 最大差异 1024.0,平均差异 512.0
# 输出: 验证通过! 形状: (4096,), 最大差异: 0.0
# 验证失败,则修改方案继续。否则结束。

总结

最后整个skill通过五轮修改,完成了整个函数的编写,配合赋予适当的权限,整个流程5min,AI全自主可以生成一个函数模块,关闭thinking可以进一步提升速度。

image-QPYJ.png

不足

  • 项目依赖cannbot提供的部分skill,比如regbase的最佳实践真的是最佳实践嘛?对于ascend的知识还需要补充。
  • FA部分的知识还需要凝练,FA算子有自己的特点,这里还需要再补充。
  • 实现只注重功能,最终的方案性能不好(比如bank conflict等方案都没有考虑到),也是第一点,需要更新最佳实践。