mcpField
T
triton-operator-code-review

triton-operator-code-review

github.com/ascend测试与质量52147 次安装25 周前更新
代码仓库

关于 triton-operator-code-review

triton-operator-code-review 是针对 Ascend NPU 的 Triton 算子静态检视技能,面向开发与检视算子代码的人员。它聚焦 Ascend 特有约束,按严重级别检查正确性、精度和性能问题,并输出检视报告。

主要功能

  1. 01检查 Host 侧核类型与配置
  2. 02核对 load/store 的 Mask
  3. 03检查数据类型与精度处理
  4. 04识别不支持的控制流和索引
  5. 05发现访存及归约性能隐患
  6. 06按严重级别输出检视报告

适用场景

  1. 01检视 Ascend NPU 上的 Triton 算子
  2. 02排查可能导致崩溃或错误结果的问题
  3. 03检查归约和 Softmax 的精度风险
  4. 04定位算子中的性能反模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ascend/agent-skills --skill triton-operator-code-review

安装后在 Claude Code 中输入/triton-operator-code-review确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
ascend-api-dtype-matrix.md
ascend-test-patterns.md
ascend-triton-api-constraints.md
code-review-checklist.md
code-review-report-template.md

详细介绍

来自项目 README

Triton 算子静态代码检视(Ascend NPU)

检视原则

  • Ascend 特有约束优先:聚焦硬件差异,不检查 Triton 通用知识
  • Mask 零容错:Ascend 对越界访问零容忍
严重性分级
级别含义典型问题
P0必定崩溃或错误结果Mask 遗漏、核类型错配、Atomic 循环死锁
P1高概率精度/功能问题归约未升精度、Softmax 未减 max
P2性能/可维护性冗余访存、BLOCK 未对齐

参考资源加载

阶段加载不要加载
Phase 1: Host 侧ascend-triton-api-constraints.mddtype-matrix
Phase 2: Device 侧ascend-api-dtype-matrix.mdtest-patterns
逐项核对code-review-checklist.md—
参考官方实现ascend-test-patterns.md—
确认 API 签名/参数triton-api-reference.md—

加载触发:需要确认某个 tl/libdevice API 的签名、参数或可用数据类型时,完整阅读 triton-api-reference.md。

检视工作流

Phase 1: Host 侧
检查项识别方式级别
硬编码核数grid = (20,) 等字面量P0
核类型错配含 tl.dot 的 kernel 用了 num_vectorcoreP0
矩阵乘法退化为逐元素无 tl.dot,用 Vector Core 逐元素乘加实现 matmul/GEMVP0
BLOCK_SIZE 非 tl.constexpr声明检查P1
矩阵运算 BLOCK 非 16 倍数数值检查P2

核类型:含 tl.dot → AI Core (num_aicore);逐元素/归约/激活 → Vector Core (num_vectorcore)。注意:矩阵乘法类算子(含 GEMV)必须用 tl.dot + AI Core,Cube Core 吞吐远高于 Vector Core。

Phase 2: Device 侧

Mask 完整性(P0):所有 tl.load/tl.store 必须有 mask= 或使用 make_block_ptr。

数据类型(P0-P1):tl.dot 输入仅支持 int8/fp16/fp32/bf16;dot_scaled 有条件支持(bf16/fp16 lhs/rhs, int8 scale, fp32 out);permute/trans 不支持 int64。

精度处理(P1):FP16/BF16 归约前 .to(tl.float32);Softmax 必须减 max。

归约类算子单 pass 检查(P1):GroupNorm/LayerNorm/RMSNorm 等算子,检查是否对同一数据多次 load(先算统计量,再 load 做归一化)。当 D ≤ UB 时应单 pass:一次 load 后 tl.sum(x, 1) 在 UB 内完成全部计算。双 pass 可慢 5x。

控制流(P0):Triton IR 使用 MLIR 结构化控制流(scf.for/scf.while),不支持 early exit。

  • ❌ for/while 循环内 return — 编译错误:"Cannot have return statements inside while or for"(包括子函数中的 return)
  • ❌ for 循环内 break — 编译错误:"unsupported AST node type: Break"

Tensor 索引(P0):Triton tensor 不支持 Python 风格 [] 下标操作。

  • ❌ tensor[i] = val — AssertionError
  • ❌ val = tensor[i] — AssertionError
  • ❌ tensor[i:j] 切片 — 编译错误

代码模式:

  • ❌ for ... : tl.atomic_cas/or/xor/and/xchg(...) — 可能死锁(P0)
  • ❌ 多核 kernel 中使用 tl.atomic_add 返回值(P0)
  • ❌ kernel 内 import numpy(P0)
  • ⚠️ tensor[i].item() 在 Host 热路径 — 触发 CPU-NPU 同步(P2)
  • ⚠️ 归约类算子存在多个 for ... : tl.load(x_ptr + ...) 循环 — 双 pass 反模式(P1)
  • ⚠️ Post-dot 操作未用 tl.parallel(bind_sub_block=True) — tl.dot 后有逐元素操作但无并行分片(P2)
  • ⚠️ 整数类型转换溢出 — tl.cast 到 int8/int16 未指定 overflow_mode(P1)
Phase 3: 性能隐患(P2)
  • 同一 ptr 多次 tl.load → 冗余 GM 访问
  • tl.arange(0, N) * stride(stride > 1)→ 非连续访存
  • pid 直接映射 block 无循环 → 负载不均
  • kernel 内对辅助张量(cos/sin 等)使用 broadcast stride 计算偏移(b * stride0 + n * stride1 + ...)→ 建议改为 host 侧 expand+contiguous,统一 row * D + col 偏移
  • 归约类算子 weight/bias 未预展开,kernel 内用 weight_ptr + ch_idx gather → 建议 host 侧展开为连续布局

反模式清单(NEVER)

Host
  • ❌ 硬编码核数 / 矩阵乘法用 num_vectorcore / BLOCK_SIZE 非 tl.constexpr
  • ❌ 矩阵乘法(含 GEMV)用 Vector Core 逐元素乘加实现——必须用 tl.dot + AI Core
Device
  • ❌ tl.load/tl.store 无 mask / tl.dot 输入 int32/int16/int64 / dot_scaled
  • ❌ atomic_or/xor/and/xchg/cas 在 for 循环内 / kernel 内第三方库
  • ❌ FP16/BF16 归约不升 FP32 / Softmax 不减 max
  • ❌ 整数截断 cast 未指定 overflow_mode
  • ❌ for/while 循环内 return / break — Triton 结构化控制流不支持 early exit(含子函数中的 return)
  • ❌ tensor[i] 索引操作(读取/赋值/切片)— 用 tl.where / tl.gather / tl.extract_slice 替代

输出

按 code-review-report-template.md 格式输出报告。

评论

支持 Markdown