一键导入
tilelang-ascend-tile-api
// TileLang-Ascend 新增 Ascend 专属 T.tile.xxx 小 API 的端到端开发流程。用户要求新增、封装、暴露、实现或测试 ascend_tile.py 中的 T.tile API / Ascend tile primitive 时必须使用本 skill,尤其适用于需要同时打通 Python 前端、C++ lowering/codegen、Ascend C helper、文档和 CI 测试的任务。
// TileLang-Ascend 新增 Ascend 专属 T.tile.xxx 小 API 的端到端开发流程。用户要求新增、封装、暴露、实现或测试 ascend_tile.py 中的 T.tile API / Ascend tile primitive 时必须使用本 skill,尤其适用于需要同时打通 Python 前端、C++ lowering/codegen、Ascend C helper、文档和 CI 测试的任务。
| name | tilelang-ascend-tile-api |
| description | TileLang-Ascend 新增 Ascend 专属 T.tile.xxx 小 API 的端到端开发流程。用户要求新增、封装、暴露、实现或测试 ascend_tile.py 中的 T.tile API / Ascend tile primitive 时必须使用本 skill,尤其适用于需要同时打通 Python 前端、C++ lowering/codegen、Ascend C helper、文档和 CI 测试的任务。 |
当任务是新增一个面向用户的 T.tile.xxx 小 API 时使用本 skill,尤其是从 tilelang/language/ascend_tile.py 暴露、并由 Ascend C 代码生成支撑的 API。
这里的目标不只是增加一个 Python 函数名,而是交付一个真正可用的 API:它能编译、能 lowering、能生成合法的 Ascend C、有清晰稳定的语义边界,并且有合适的 CI 测试覆盖。
开始实现前,先读清楚当前仓库形态,再决定方案:
AGENTS.md。.agents/skills/tilelang-custom-skill/tilelang-api-best-practices/SKILL.md。.agents/skills/tilelang-custom-skill/tilelang-api-best-practices/references/api-compute.md。pass_configs,阅读 .agents/skills/tilelang-custom-skill/tilelang-expert-to-developer/SKILL.md。tilelang/language/ascend_tile.py 中最相近的现有 API。testing/python/language/ 中最相近的测试。src/op/ascend.{h,cc}、src/target/codegen_ascend.cc、src/tl_templates/ascend/common.h 中相近的 lowering、codegen 和 helper 实现。不要凭记忆推断 API 签名。已有本地模式优先于看起来更聪明的新抽象。
编辑前,先明确并说明 API 边界:
T.tile.foo(dst, src, ...)。Buffer、BufferLoad、BufferRegion。pass_configs、Expert 模式,还是两者都支持。当语义无法和主仓 / GPU 的全局 API 对齐时,优先新增 Ascend 专属的 T.tile.xxx API。除非用户明确要求、且语义确实一致,否则不要新增或修改全局 T.xxx API。
在 tilelang/language/ascend_tile.py 中新增用户入口。
优先复用该文件和 tilelang/language/copy.py 里的本地 helper 模式:
Buffer、BufferLoad 或 BufferRegion。tl.region。tl.ascend_<api_name>。除非操作本质上就是普通 copy,否则不要为了省事复用 tl.ascend_copy。有副作用、会改变硬件模式、或语义不同的操作,通常应该有显式 op 名称。
如果前端发射新的 tl.ascend_* op,需要补齐对应 C++ operator 路径:
src/op/ascend.h 中声明。src/op/ascend.cc 中实现参数解析和 lowering。TIR_REGISTER_TL_OP 注册。lowering 结果应变成后端可识别的 call_extern 或已有 codegen pattern。降低后的调用名要稳定且有描述性,例如 tl::ascend::<helper_name><...>。
可复用的 Ascend C 片段优先放在 src/tl_templates/ascend/common.h,除非仓内已有更合适的模板位置。
尽量把硬件状态切换封装在 helper 函数内部。比如 helper 开启了某种模式,它也应该在返回前恢复或关闭该模式。
如果需要兼容不同 CANN 版本:
CANN_MAJOR 之类的官方宏。#if 分支。把 lowering 后的调用接入后端:
src/target/codegen_ascend.cc,让它打印对应 helper 调用。CopyCodegen 等现有 helper。src/transform/common/operation_config.hsrc/transform/ascend_combinecv.ccsrc/transform/cross_core_pipeline.cc默认不要添加 PTO 支持。只有当任务明确要求,或已有 PTO 路径能以很小、低风险的改动接入时,才考虑补充。
不要自动创建新的独立测试文件。先选择和 API 行为最匹配、范围最窄的现有测试文件。
测试位置建议:
T.tile.xxx 数学 API:优先放在 testing/python/language/test_tilelang_ascend_language_elementwise.py。T.Parallel 或 auto-copy 行为时,才放入 parallel 相关测试文件。独立测试文件是允许的,但应该少用,并且要能清楚说明原因。记住 examples/bench_test.sh 会运行 testing/python/,所以每个新文件都会进入 CI 范围。
默认编写面向 CI 的正确性测试,而不是开发阶段的 TDD 检查测试。
推荐的测试形态:
torch.npu 不可用时,用 pytest.mark.skipif 跳过。torch.testing.assert_close 对比。PASS_CONFIGS = {
tilelang.PassConfigKey.TL_ASCEND_AUTO_SYNC: True,
tilelang.PassConfigKey.TL_ASCEND_MEMORY_PLANNING: True,
}
除非生成源码字符串、helper 名称或负例本身就是公开契约,否则不要把这些断言长期留在 CI 中。这类检查适合开发阶段,但实现稳定后容易变成噪声。
对于带副作用写回的 API,测试应在运行 kernel 前显式初始化目标 buffer。例如 accumulation API 应该先把 GM 清零,再检查累加后的值。
对于面向用户的 API,更新未来用户和 agent 真正会看的文档:
docs/language_ref/tilelibrary.md:简短语言参考。docs/TileLang-Ascend Programming Guide.md:详细使用指南。.agents/skills/tilelang-custom-skill/tilelang-api-best-practices/references/api-compute.md:agent 面向的 API 用法说明。.agents/skills/tilelang-custom-skill/tilelang-expert-to-developer/SKILL.md:仅当编程模式建议发生变化时更新。如果旧文档里有相似但语义不同的全局 API,增加简短提醒,而不是静默改写可能属于 GPU / 主仓教程的示例。
运行本地能支持的最强验证:
python -m py_compile <changed-python-files>
conda run -n tilelang_dev ruff check <changed-python-files>
conda run -n tilelang_dev ruff format --check <changed-python-files>
git diff --check
如果修改了 C++ 文件,也运行:
conda run -n tilelang_dev clang-format --dry-run --Werror <changed-cpp-files>
如果当前环境可运行,执行目标 pytest:
pytest -q <selected-test-file-or-test-node>
如果本地缺少 pytest、TVM、CANN 或 NPU runtime,需要明确说明哪一层没有验证,以及是否需要服务器侧运行。
只有当用户明确授权并行 agent 工作时,才拆分任务。
适合独立拆分的工作:
tilelang/language/ascend_tile.py 中的前端 API 和 IR 形态。src/op/ascend.{h,cc} 中的 C++ op 和 lowering。src/tl_templates/ascend/common.h 中的 Ascend C helper。src/target 和 src/transform 中的 codegen 与 pipeline 元数据。给每个 agent 分配不重叠的写入范围,并明确提醒它不要 revert 其他 agent 的修改。
完成后总结:
根据 pass-design.md 与 workflow 分析结果生成 TileLang-Ascend Pass 的最终实现代码(不含 UT/ST)。先输出实现骨架文档(pass-impl-skeleton.md)确认框架设计,再生成 C++ 实现、Python 封装、Pipeline 接入,并完成最小冒烟验证。测试生成由后续独立 skill 负责。触发关键词:实现 Pass、生成 Pass 代码、Pass 编码、根据设计文档实现 Pass、写 Pass 代码、落地 Pass、新增 Pass 实现。
TileLang-Ascend 算子测试设计技能。支持多种场景:(1) 从 design.md 设计测试配置 (2) 从 examples/{op}/*.py 补充测试 (3) 手动提供算子信息生成测试 (4) 测试覆盖率分析。理解算子实现逻辑后智能判断测试策略。触发:设计算子测试、生成测试用例、补充测试、测试覆盖率不足。
TileLang 算子性能调优与潜在性能劣化模式检查。提供性能数据采集、瓶颈诊断、优化实施、效果验证能力;也用于生成或评审算子时对照常见性能劣化模式示例检查当前 kernel 代码。触发:算子精度通过后需要优化性能、性能不及预期时。
TileLang Ascend API 使用最佳实践。提供内存分配、数据搬运、矩阵计算、归约、元素级运算、同步、调度原语等 API 的正确用法和最佳实践。触发:使用 TileLang API 编写 Ascend NPU kernel 时或遇到 API 相关问题时。
TileLang Ascend Developer/Expert 模式选择与 pass_configs 配置指南。当需要确定编程模式、配置 pass_configs、或在两种模式之间转换时触发。API 详情请参考 tilelang-api-best-practices skill。
根据算子需求生成 TileLang-Ascend 算子设计文档(design.md)。涵盖编程模式选型(Developer/Expert/混合)、API 映射、内存层级规划、Tiling 策略、循环结构、同步策略、验证方案等。触发:设计算子、生成 design.md、算子方案设计、新算子开发、算子实现方案。