一键导入
catlass-matmul-optimization
CATLASS Gemm 性能调优:DispatchPolicy、Tile 与分核负载均衡、Swizzle、何时用 padding/Split-K/Preload。面向 AR 修改 catlass_kernel.asc 中的类型别名。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
CATLASS Gemm 性能调优:DispatchPolicy、Tile 与分核负载均衡、Swizzle、何时用 padding/Split-K/Preload。面向 AR 修改 catlass_kernel.asc 中的类型别名。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
AscendC direct-invoke 崩溃/挂起修复索引:Kernel timeout、hang、Segmentation Fault、aic error、buffer 死锁、plog/memcheck 调试。
AscendC direct-invoke 精度失败修复索引:输出全 0/随机值、DataCopy 对齐、EnQue/DeQue 同步、FP16/FP32 精度、Cast RoundMode、DumpTensor 分段定位。
AscendC direct-invoke 工程契约:WA 使用 kernel.py + ascendc_op/,ModelNew 调用 torch.ops.npu.*,adapter 负责复制工程、CMake 构建和 npu-arch patch。适用于 dsl=ascendc 的 autoresearch 任务。
把注册式 AscendC 算子迁移为 direct-invoke 工程的保真原则:kernel 算法和 tiling 公式不乱改,只替换注册框架胶水、入口 ABI、host launch 与 PyTorch extension。
CATLASS TileShape 与 on-chip 缓存容量约束:L1/L0A/L0B/L0C 预算公式、fp16/fp32 Pingpong 双缓冲、512B 对齐与排布对 Tile 选型的影响。调参前必读。
CPU C++ 算子核心概念、标准结构模式、KernelBench 代码规范和内嵌扩展方法
| name | catlass-matmul-optimization |
| description | CATLASS Gemm 性能调优:DispatchPolicy、Tile 与分核负载均衡、Swizzle、何时用 padding/Split-K/Preload。面向 AR 修改 catlass_kernel.asc 中的类型别名。 |
| category | guide |
| version | 1.0.0 |
| metadata | {"backend":"ascend","dsl":"ascendc_catlass","hardware":"Atlas A2, Atlas A3, Atlas A5","operator_patterns":"matmul"} |
在 AR 中优先改 catlass_op/kernel/catlass_kernel.asc 里的 DispatchPolicy、L1TileShape、L0TileShape、BlockScheduler(Swizzle)。改完必须能通过编译,且 verify 精度与 profile 指标才有意义。
| 条件 | 方向 |
|---|---|
| 常规对齐 Gemm,无复杂尾处理 | BasicMatmul + Pingpong |
| 需要 D=A@B+X、逐元素融合等 | MatmulEpilogue 或 EVG 路径(见 epilogue skill) |
| 内轴未 512B 对齐 | padding 族 kernel,不要只在错误模板上拧 Tile |
| K 很大、单核沿 K 吃不满且 确实启用多段 K 归约 | Split-K 族;若配置导致 split 因子为 1,则与普适 Gemm 等价,换族无收益 |
| 超大 M/N、带宽瓶颈 | 可试 Preload + shuffleK |
| M 或 N 极小、块数远小于核数 | 减小 L1 的 m1/n1 提高块数,再调 Swizzle |
pipeline 绑定 example 时,用 reference 的 M/N/K/layout/尾处理 对照上表,而不是按 benchmark 题号选样例。
// 基线
using DispatchPolicy = Gemm::MmadAtlasA2Pingpong<true>;
// 大矩阵、减少搬运气泡时可试
using DispatchPolicy = Gemm::MmadAtlasA2Preload<true, true>;
注意:Preload 会引入额外流水与 scalar/vector 开销,小矩阵可能变慢;应以 profile 为准。
基本块数:
blocks = ceilDiv(M, m1) * ceilDiv(N, n1)
目标:blocks 接近 AIC 核数 的整数倍,避免少量核承担绝大多数块。
调参顺序建议:
catlass-hardware-constraints 保证 L1/L0 不溢出m1、n1(保持 m0,m1 与 n0,n1 关系)blocks 仍远小于核数,减小 m1 或 n1,不要一味增大 Tileoffset / directionGemmIdentityBlockSwizzle<offset, direction>:
| 情况 | 起点 |
|---|---|
| M > N,A/B 为 RowMajor | direction = 0 |
| M < N,A/B 为 RowMajor | direction = 1 |
在 direction 定好后,可小步调 offset(如 3→4→5)观察 profile;每次只改一项便于 settle 对比。
AR 的 latency_us 一般是 ModelNew.forward 端到端(含 dtype 转换、npu_format_cast、算子调用)。若 profile 显示耗时在 Transdata 而非 MMAD:
.asc Tile 可能几乎不动指标catlass_op/src/catlass_torch.cpp,减少重复的 npu_format_cast 或多余拷贝(须在 editable_files 中列出该路径)kernel.py 符号名 或 Python 逻辑,不碰 Tile → 性能通常不变BasicMatmul