skills/triton/kernel-splitter/SKILL.md
多 Case 专用 Kernel 分裂 Skill — 在泛用 Kernel 优化完成后,针对不同 Shape/Case 特征 生成专用 Kernel,构建智能调度器,实现性能最大化。失败自动回退到泛用 Kernel。
npx skillsauth add Just-it/AscendOpGenAgent kernel-splitterInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
同时满足以下两项才执行,否则直接跳过:
total_cases > 1(多 case 场景)speedup_vs_torch < 0.8(性能未达标)输入:base_kernel.py + task_desc.py + baseline_perf.json
↓
[1. Case 特征分析] → 按经验以及特征计算模式分组
↓
[2. 专用 Kernel 生成] → 为每组生成特化实现
↓
[3. 精度验证] → verify.py 独立验证每组
│ ├─ 通过 → 继续
│ └─ 失败 → 标记该组使用泛用 Kernel
↓
[4. 性能测试] → benchmark.py 测试每组
│ ├─ 优于基线 → 采纳
│ └─ 劣于/等于基线 → 标记该组使用泛用 Kernel
↓
[5. 调度器构建] → 构建 ModelNew 路由逻辑
↓
[6. 集成验证] → 全量 Case 端到端测试
↓
输出:split_kernel.py(含调度器 + 多个专用 Kernel)
首先加载对应的参考文档,根据算子类型选择:
| 算子类型 | 识别特征 | 加载文档 |
|---------|---------|---------|
| Reduce | sum/mean/max/min/softmax/layernorm 等归约操作 | references/reduce-split.md |
| 广播逐元素 | add/sub/mul/div + 存在 shape 不等 | references/broadcast-elemwise-split.md |
读取参考文档中的分组维度表,检查当前任务是否命中:
Reduce 类命中条件:
inner_size(reduce 轴位置)分组:==1 → reduce-last,>1 → reduce-non-last广播逐元素命中条件:
(out_ndim, broadcast_dims) 分组:无广播 / 2D dim0/dim1 / 3D/4D若未命中任何参考文档,执行以下步骤:
从工作目录读取 Phase 4 最终性能数据:
{工作目录}/output/optimized_perf_result.json{工作目录}/output/perf_result.json从 per_shape_results 中提取 speedup_vs_torch < 0.3 的用例(即加速比低于 0.3,性能显著劣于 PyTorch 参考实现)。
# 伪代码示例
bottleneck_cases = []
for shape_result in perf_data["per_shape_results"]:
if shape_result["speedup_vs_torch"] is not None and shape_result["speedup_vs_torch"] < 0.3:
bottleneck_cases.append(shape_result)
对筛选出的瓶颈用例,按以下维度分类归因:
| 归因维度 | 判定条件 | 典型原因 | |---------|---------|---------| | Shape 过小 | 元素数 < 1024 | Kernel 启动开销占比过高 | | Shape 过大 | 元素数 > 10M | 寄存器溢出、缓存未命中 | | 非对齐访问 | shape 非 2 的幂次 | mask 分支导致性能下降 | | 跨步访存 | stride > 1 且非连续 | 内存带宽利用率低 | | 特殊 dtype | bf16/int8 等低精度 | 向量化策略不匹配 |
为每个归因类别生成专属分组:
case_indices、bottleneck_reason、baseline_perf[{group_id, cases, features, bottleneck_reason, baseline_perf}]示例输出:
[
{
"group_id": "grp_small_shape",
"case_indices": [1, 3, 5],
"features": {"element_count": "<1024", "dtype": "float16"},
"bottleneck_reason": "kernel_launch_overhead",
"baseline_perf": {"speedup_vs_torch": 0.15}
},
{
"group_id": "grp_strided_access",
"case_indices": [7, 9],
"features": {"stride": "non_contiguous", "dtype": "float16"},
"bottleneck_reason": "strided_memory_access",
"baseline_perf": {"speedup_vs_torch": 0.22}
}
]
对每个分组,基于泛用 Kernel 进行特化:
| 策略 | 适用场景 | 优化方向 | |------|---------|---------| | 固定 constexpr | Shape 固定或范围极小 | 将 BLOCK_SIZE、grid 等硬编码为 constexpr | | 展开循环 | 小 Shape 场景 | 消除循环开销,完全展开 | | 调整 Tiling | 特定 Shape 比例 | 优化 tile 尺寸匹配 UB 容量 | | 简化边界 | 尺寸对齐的 Case | 移除 mask 检查,使用无分支 load/store | | 专用规约 | 特定规约轴 | 选择最优的 reduce 策略(原子/二分/树形) |
{op_name}_kernel_{group_id}生成专用 Kernel 后,必须调用 latency-optimizer skill 对每个专用 Kernel 进行进一步优化:
对每个专用 Kernel:
1. 调用 latency-optimizer skill
2. 按顺序检查 13 个优化点(constexpr/tiling/分核/...)
3. 命中则应用优化策略
4. 执行 checklist 检查确保代码规范
5. 输出优化后的专用 Kernel
注意:
必须使用 kernel-verifier 的 verify.py 脚本,对每个专用 Kernel 独立验证:
python3 <kernel-verifier-path>/scripts/verify.py \
--op_name <op_name> \
--verify_dir <split_verify_dir>/<group_id> \
--triton_impl_name <group_kernel_name> \
--timeout 300
判定:
passed_cases == total_cases → 通过,进入 Step 4fallback_to_base,跳过后续步骤必须使用 kernel-verifier 的 benchmark.py 脚本:
python3 <kernel-verifier-path>/scripts/benchmark.py \
--op_name <op_name> \
--verify_dir <split_verify_dir>/<group_id> \
--triton_impl_name <group_kernel_name> \
--warmup 5 --repeats 50 \
--output <split_perf_dir>/<group_id>_perf.json
判定:
speedup_vs_torch >= baseline_speedup → 采纳fallback_to_base构建统一的 ModelNew 类,必须将路由逻辑封装在独立的 _route 方法中,forward() 仅负责调用该方法:
class ModelNew(nn.Module):
def __init__(self, ...):
super().__init__()
# 初始化所有专用 Kernel 和泛用 Kernel
self.base_kernel = BaseKernel(...)
self.specialized_kernels = {
group_id: SpecializedKernel(group_id, ...)
for group_id, adopted in adopted_groups.items()
}
def forward(self, *args):
# forward 保持极简,仅调用一次路由函数
return self._route(*args)
def _route(self, *args):
# 路由逻辑全部在此
# 1. 提取输入 shape/dtype 特征
# 2. 匹配分组规则
# 3. 返回对应 kernel 启动结果,若无匹配则返回 base_kernel 结果
if condition_1:
return kernel_1[grid](...)
elif condition_2:
return kernel_2[grid](...)
else:
return self.base_kernel[grid](...)
关键约束:
forward() 中直接编写 if-elif-else 路由分支。_route 方法封装路由逻辑。对分裂后的完整代码执行全量验证:
verify.py 验证所有 Case 精度通过benchmark.py 测试整体性能split_summary.json,包含:
| 约束 | 说明 |
|------|------|
| 触发条件 | 仅 total_cases > 1 且 speedup_vs_torch < 0.8 时执行,否则跳过 |
| 精度零妥协 | 任何专用 Kernel 精度不通过,立即回退到泛用 Kernel |
| 性能底线 | 专用 Kernel 必须 ≥ 泛用 Kernel 性能,否则不采用 |
| 路由封装 | 路由逻辑必须封装在 _route 方法中,forward 仅调用该方法 |
| 代码自包含 | 所有 Kernel 和调度逻辑必须在同一文件内 |
| 禁止过度分裂 | 相似 Case 必须合并分组,禁止 1-to-1 无意义分裂 |
| 回退安全 | 路由逻辑必须包含兜底机制,确保 100% 覆盖所有 Case |
最终输出 split_kernel.py,结构如下:
import torch
import torch.nn as nn
import triton
import triton.language as tl
# === 泛用 Kernel(保留原样) ===
@triton.jit
def {op_name}_base_kernel(...): ...
# === 专用 Kernel 1 ===
@triton.jit
def {op_name}_kernel_grp1(...): ...
# === 专用 Kernel 2 ===
@triton.jit
def {op_name}_kernel_grp2(...): ...
# === 调度器 ===
class ModelNew(nn.Module):
def __init__(self, ...): ...
def _route(self, ...): ...
def forward(self, ...): ...
| 文档 | 用途 |
|------|------|
| references/reduce-split.md | Reduce 类算子 Kernel 分裂经验 |
| references/broadcast-elemwise-split.md | 广播逐元素算子 Kernel 分裂经验 |
tools
擅长在 Ascend NPU 平台上编写高效 Triton 算子的性能优化专家。 按照严格的顺序逐步优化 Triton 代码,每次只尝试一个优化点, 确保优化前后功能一致、精度一致。 ⚠️ 只能使用本 skill 规定的优化方式,禁止使用任何超出本 skill 之外的优化方式。
testing
算子代码验证 Skill — 按照标准验证流程验证生成的内核代码。 创建验证项目文件,调用 scripts/verify.py 运行验证,验证通过后 调用 scripts/benchmark.py 进行性能测试并收集结果。
tools
Triton Ascend 算子代码生成 Skill — 根据 KernelBench 格式任务描述生成高性能 Triton Ascend 内核代码。支持首次生成和基于错误反馈的迭代优化。
development
从用户 PyTorch/Python 代码中提取算子实现,构建为 KernelBench 格式的标准化 任务文件。支持两种模式:单 case(单一自包含 .py,get_inputs 返回单组)和 多 case(.py + 同名 .json 配对,get_input_groups 返回多组)。