ascend-kernel-ut
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。
自我任务安排
环境检测 → 方案调研 → 方案撰写输出 → 白盒用例设计 → 代码实现 → 验证检测

Step 1-2:环境检测 + 需求解析
因为我在蓝区没有A5环境,所以在skill中写了cannsim的逻辑, 首先会判断当前cann、bisheng、cannsim是否可用。

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

- 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:


Step 4:白盒测试用例
这一步也涵盖在Step 3中,并写入DESIGN.md文件里。
| 用例 | 输入设计 | 覆盖路径 |
|---|---|---|
| 递增序列 | np.arange(total_elems, dtype=np.float32) | 基本计算路径,验证排列正确性 |
| 全零 | np.zeros(N) | 零值边界 |
| 按块赋值 | 每个 16x16 块用不同常量 | 验证块边界 |
Step 5:生成
完成三个代码部分的交付件,golden、kernel和验证脚本。

Step 6:编译 → 验证
编译kernel → 生成验证数据 → 运行仿真 → 检查结果。

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

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

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

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

# 编译
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可以进一步提升速度。

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