samples

当用户需要查找样例、了解特性用法或获取算子优化建议时使用。

SKILL.md

GitHub

cann-samples 样例检索

确认本地样例仓库

当前工作区已在 cann-samples 仓库内就直接用;否则当前目录下已有 cann-samples/ 就直接用,没有就克隆到当前目录:

git clone https://gitcode.com/cann/cann-samples.git

未取得仓库时,只整理画像和检索计划,说明尚无法核对示例。

后文命令中的 <仓库路径> 一律代入该仓库的绝对路径;仓内路径由它与本次发现的相对路径拼接,不预设目录层级。

先填写算子画像

根据当前算子的代码、构建配置和已有性能报告填写下表,再据此生成检索条件。 “填写结果”应包含值和简短依据(文件/符号/报告);查不到写“未知”,不适用写 N/A,只追问影响选型的缺项。

字段 填写结果(值 + 依据) 填写提示
芯片版本 待填写 产品型号、NPU_ARCH、可用 AIC/AIV 数;型号与架构映射从当前仓库说明和构建配置核实
工具链版本 待填写 CANN、编译器版本,真机或仿真环境
开发语言/接口层 待填写 实际 kernel 是否为 Ascend C;C++ API、C API、Tensor API,或其它 DSL;不把 Python 调用层当成 kernel 语言
当前代码架构 待填写 SIMD MemBase、SIMD VF、SIMT、Cube、Cube+Vector(CV)、SIMD+SIMT;混合算子按阶段填写
允许的改动范围 待填写 仅当前实现内优化,还是允许 MemBase→VF、SIMD→SIMT、CV 融合、数据格式/算法变换;以用户范围为准
算子与阶段语义 待填写 elementwise、broadcast、reduce、matmul/grouped matmul、Attention、Gather/Scatter、MoE 路由/通信;重复索引覆盖或规约
数据规格与精度 待填写 shape/动态维、stride、ND/DN/NZ、输入/输出/累加 dtype、尾块、量化 scale、精度要求
已用接口与数据流 待填写 DataCopy/LoadData/Fixpipe/Te::Copy、Reg/MicroAPI、asc_*;GM/L1/L0/UB 路径、tile/buffer 容量及复用
调度与同步 待填写 分核/线程、尾轮、TQue/Mutex/Flag/LocalMemBar/asc_vf_call、跨核交接和 buffer 生命周期
瓶颈与证据 待填写 Scalar/Vector/Cube/MTE/Fixpipe、缓存、spill、长尾;注明 kernel、VF 或端到端口径,无证据写未知

按画像生成检索计划

混合算子按阶段拆解,分别从以下维度生成查询,再合并候选。不要把全部画像字段拼成一个必须同时命中的查询,也不要只搜索算子名。 芯片、版本、精度和改动范围主要用于核实适用性,文档未出现这些词不等于不支持。

检索维度 从画像提取的内容
算子与阶段 算子名、各阶段的计算语义;兼顾其他算子中的相同子过程
执行模型与接口 当前模型、实际 API/符号、用户允许迁移的模型
数据与调度 数据布局、访问路径、复用方式、分核、同步及尾块特征
瓶颈与目标 已观察到的热点、硬件事件及对应中英文术语;未知时查询性能分析入口,不预设瓶颈

为每组关键词补充中英文名称、缩写和源码拼写。例如“矩阵乘”可查 matmul|GEMM|矩阵乘;具体别名继续从当前仓库的说明文档和命中源码中扩展。这些只是查询示例,不是固定知识清单。

用一张简短记录表跟踪覆盖情况:阶段/维度 | 查询词 | 搜索范围 | 命中证据或未命中 | 后续核实。每个相关维度都应有检索证据或不适用理由;一次搜索或阅读可覆盖多个维度,不为填表重复查询。未知项保留待确认,不直接排除。

搜索当前仓库

以当前 checkout 为准,动态发现布局;不维护目录分类表、文件后缀白名单或优化索引。

  1. 只发现一次布局。 先拿目录骨架与入口文档,从中识别入口说明、文档、源码与构建配置,按入口链接选择范围;样例子树内的文件细查留给检索。复用已发现的布局与已读内容;目录名仅作线索,不能限定候选必须位于某个子树。
  2. 合并高信息量查询。 优先实际符号、具体阶段语义、明确瓶颈及其别名。用多个 -e 表达“任一命中”,将相关维度合并为一轮仓库级候选发现,只返回文件路径;精确符号可用 -F。不要将 SIMD、float 等宽泛属性各自全仓扫描,它们主要用于候选内核实。
  3. 先筛文件,再读片段。 合并路径线索与正文命中、去重,按同一示例/主题归组。优先读取直接解释方法的文档,再在候选文件内用 rg -n 定位实现;只展开相关段落、函数与依赖。跨算子的相同阶段也保留,避免只读同名算子。
  4. 只为证据缺口扩搜。 优先候选核实后,检查画像各阶段/维度;仅对未覆盖部分增加别名或放宽词面条件。局部查询未命中时扩大范围;已完成的仓库级查询不重复。相关维度已有依据或已记录扩搜后的未命中、且足以给出用户需要的候选时停止,不枚举全部实现。

以下仅展示发现与批量搜索的语法,关键词按本次画像替换;不依赖示例所在目录或文件后缀:

find "<仓库路径>" -maxdepth 2 -type d -not -path '*/.git*'
find "<仓库路径>" -maxdepth 2 -type f -not -path '*/.git*' \( -iname 'README*' -o -name '*.md' -o -name 'CMakeLists.txt' \)
rg -il --hidden -g '!.git' -e 'matmul|GEMM|矩阵乘' -e 'ReduceSum|归约' "<仓库路径>"

默认遵守忽略规则、跳过二进制;从当前配置识别生成物和第三方内容,不把其命中当作仓内示例证据。上述搜索包含隐藏文件,但不遍历 Git 元数据。若入口链接或 Git 文件清单显示相关文件被忽略规则漏掉,只对这些路径显式读取或搜索,不默认用 --no-ignore 全仓展开。查询数量少不等于证据充分:目录名或关键词命中仍需内容核实。

核实候选并提取优化方法

对合并去重后的候选,先读对应说明,再看相关源码与实际构建配置;沿其引用确认构建入口,不假设文档名、构建系统或父子目录关系。结合画像核对芯片/工具链、接口层、执行模型、shape/dtype/layout、精度、内存容量、同步语义和改动范围。明确不兼容的实现排除;信息缺失标“待确认”;跨模型或跨语言只在允许范围内作为迁移候选或算法参考。

对性能 story,从当前文档的标题、基线说明及其引用的版本文件还原优化路线,比较基线与相关后续版本;说明不清时阅读对应函数或对相关文件执行 diff -u。不要假设编号最大的版本适用于所有输入,也不要把多个改动的总体收益归因于某一个技巧。

每个保留的方法都要回答:示例改了什么、为什么与本次画像匹配、迁移还缺哪些条件,并给出当前 checkout 中的文件及符号/行号作为依据。搜索命中本身不构成优化建议,结论须来自读过的文档或实现。

仅查示例时无需构建或运行。需要复现时,从候选说明、构建配置和脚本提取实际环境要求、构建目标、数据生成及验证命令;按用户任务范围执行,不默认全仓构建。环境不满足或构建、运行失败时,写明卡在哪一步、缺什么条件——卡点出自实测,附实际执行的命令与真实报错。找不到运行入口应明确说明,仍可保留有依据的源码参考。

输出结果

优先给出最多五个相关候选,每个包含:

  • 优化方法及命中的画像条件,标注“可尝试 / 待确认 / 算法参考”。
  • 仓库内具体文件及符号/行号,以及适用条件和限制。
  • 迁移后的验证项;需要复现时补充已核对的构建、运行命令,区分未执行、已验证与卡点(附实测命令与报错)。

简述搜索覆盖的阶段/维度、排除原因和未找到证据的部分。无合适候选时说明已查范围及缺失条件,不编造示例或声称穷尽。没有实测不承诺加速;比较性能前先检查正确性和精度,并保持环境、输入及测量口径一致。