samples
当用户需要查找样例、了解特性用法或获取算子优化建议时使用。
SKILL.mdops/samples/SKILL.md
GitHubcann-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 为准,动态发现布局;不维护目录分类表、文件后缀白名单或优化索引。
- 只发现一次布局。 先拿目录骨架与入口文档,从中识别入口说明、文档、源码与构建配置,按入口链接选择范围;样例子树内的文件细查留给检索。复用已发现的布局与已读内容;目录名仅作线索,不能限定候选必须位于某个子树。
- 合并高信息量查询。 优先实际符号、具体阶段语义、明确瓶颈及其别名。用多个
-e表达“任一命中”,将相关维度合并为一轮仓库级候选发现,只返回文件路径;精确符号可用-F。不要将SIMD、float等宽泛属性各自全仓扫描,它们主要用于候选内核实。 - 先筛文件,再读片段。 合并路径线索与正文命中、去重,按同一示例/主题归组。优先读取直接解释方法的文档,再在候选文件内用
rg -n定位实现;只展开相关段落、函数与依赖。跨算子的相同阶段也保留,避免只读同名算子。 - 只为证据缺口扩搜。 优先候选核实后,检查画像各阶段/维度;仅对未覆盖部分增加别名或放宽词面条件。局部查询未命中时扩大范围;已完成的仓库级查询不重复。相关维度已有依据或已记录扩搜后的未命中、且足以给出用户需要的候选时停止,不枚举全部实现。
以下仅展示发现与批量搜索的语法,关键词按本次画像替换;不依赖示例所在目录或文件后缀:
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 中的文件及符号/行号作为依据。搜索命中本身不构成优化建议,结论须来自读过的文档或实现。
仅查示例时无需构建或运行。需要复现时,从候选说明、构建配置和脚本提取实际环境要求、构建目标、数据生成及验证命令;按用户任务范围执行,不默认全仓构建。环境不满足或构建、运行失败时,写明卡在哪一步、缺什么条件——卡点出自实测,附实际执行的命令与真实报错。找不到运行入口应明确说明,仍可保留有依据的源码参考。
输出结果
优先给出最多五个相关候选,每个包含:
- 优化方法及命中的画像条件,标注“可尝试 / 待确认 / 算法参考”。
- 仓库内具体文件及符号/行号,以及适用条件和限制。
- 迁移后的验证项;需要复现时补充已核对的构建、运行命令,区分未执行、已验证与卡点(附实测命令与报错)。
简述搜索覆盖的阶段/维度、排除原因和未找到证据的部分。无合适候选时说明已查范围及缺失条件,不编造示例或声称穷尽。没有实测不承诺加速;比较性能前先检查正确性和精度,并保持环境、输入及测量口径一致。