PTO vec-add向量加法教程:3步写出你的第一个Tile级算子
【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa
PTO(Parallel Tile Operation)是昇腾 CANN 设计的Tile 级虚拟指令集架构,专注于以“数据块(Tile)”为单位的高性能跨平台计算。本教程以最简单的vec-add(向量加法)为例,带你用3 步写出第一个PTO Tile 级算子:理解核心概念 → 编写分块加法 Kernel → 运行验证,零门槛上手 Tile 级算子开发 🚀
为什么从 vec-add 向量加法开始?
向量加法是所有深度学习算子中最基础的一类,它的计算模式out = in0 + in1恰好覆盖了 PTO 编程的完整数据流:
TLOAD(搬运数据)→ TADD(Tile 级计算)→ TSTORE(写回结果)
只要掌握了这 3 条指令的协作方式,你就掌握了 PTO 算子开发的骨架。更关键的是,PTO 的 Tile 级向量指令天然适配矩阵乘、Softmax 等更复杂的算子,vec-add 是通往它们的最佳起点。
在真实硬件上,PTO Tile 算子相比框架内置 Kernel 通常能带来可观的性能收益,下图展示了 PTO 与 torch 后端的性能对比(Flash Attention 场景):
第1步:理解PTO Tile编程的3个核心概念
在动手写代码前,先建立 PTO 向量加法算子的“心智模型”。你只需要认识 3 个东西:
| 概念 | 一句话解释 | 文档 |
|---|---|---|
| GlobalTensor | 把全局内存中的大张量解释成一个 (rows × cols) 的矩阵视图 | GlobalTensor_zh.md |
| Tile | 片上的小块缓冲,是真正执行计算的基本单位(TileType::Vec用于逐元素运算) | Tile_zh.md |
| 指令 | TLOAD把 GlobalTensor 搬进 Tile,TADD做 Tile 级加法,TSTORE把结果搬回全局内存 | ISA 总览 |
一句话总结:GlobalTensor 是“大矩阵”,Tile 是“小积木”,指令负责把积木搬进、算完、搬出。大矩阵会被切分成许多小 Tile,由多个核并行处理:
💡 完整指令语义与约束可查阅 docs/isa/ 目录;快速上手总纲见 tutorial_zh.md。
如需要在本地实践,可先克隆仓库:
git clone https://gitcode.com/cann/pto-isa第2步:编写分块向量加法(vec-add)Kernel
PTO Kernel 用C++ + PTO 内建接口编写,只需引入统一的指令头文件 include/pto/pto-inst.hpp。核心逻辑只有 4 行(完整示例见 vec-add_zh.md):
TLOAD(t0, g0); // 把 in0 的一个 Tile 搬入片上 TLOAD(t1, g1); // 把 in1 的一个 Tile 搬入片上 TADD(tout, t0, t1); // Tile 级向量加法 TSTORE(gout, tout); // 把结果 Tile 写回全局内存这就是 PTO 的Auto 风格:你只描述数据流,Tile 缓冲的管理和同步交给编译器/运行时处理,非常适合初学者。
两个新手常踩的坑⚠️
- 边界 Tile:当矩阵尺寸不能被 Tile 整除时,边界 Tile 需要传入运行时“有效区域”(valid rows/cols),语义细节见 conventions_zh.md;
- 布局选择:
BLayout::RowMajor是最常用的行主序布局,TileType::Vec对应逐元素/归约类操作。
更多分块细节、边界 mask 处理都在 docs/coding/tutorials/ 教程目录中。
第3步:CPU 仿真运行验证
没有 NPU 设备也能跑!PTO 内置了CPU_SIM 后端,用标准 CPU 编译器即可构建并验证算子正确性(支持模拟 UB/L1/L0A/L0B/L0C 片上存储层次)。常用命令:
python3 tests/run_cpu.py- 入口脚本:tests/run_cpu.py
- 后端原理与配置:cpu_sim_zh.md
- 现成的 CPU 端算子示例:demos/cpu/(GEMM、Flash Attention 等)
✅ 看到输出结果与预期一致,恭喜——你的第一个 PTO Tile 级算子已经跑通了!
进阶:用 ping-pong 双缓冲让流水重叠
vec-add 教程不止于此。进阶技巧是使用ping-pong(双缓冲)结构:当 buffer 0 在做加法/写回时,buffer 1 同时加载下一块数据,通过Event显式表达同步顺序,把TLOAD、计算与TSTORE三者重叠起来。下图展示了 PTO 流水线中多阶段 Tile 交替搬运、同步与计算的典型结构:
该概念结构及双缓冲事件(Event)用法详见 vec-add_zh.md 第 3 节。
📚 延伸学习清单
| 想做什么 | 去哪里看 |
|---|---|
| 跑通第一个 PTO Kernel 总纲 | tutorial_zh.md |
| vec-add 分块 + 边界 + ping-pong 完整教程 | tutorials/vec-add_zh.md |
| 行 Softmax(Attention 基础组件) | tutorials/row-softmax_zh.md |
| GEMM 模式与常见 Tile 布局 | tutorials/gemm_zh.md |
| 集成到 PyTorch 的完整示例(算子注册 + 构建) | demos/baseline/add/ |
| Tile 级指令逐条语义 | docs/isa/ |
PTO vec-add 教程小结:理解 GlobalTensor/Tile/指令三要素 → 用TLOAD → TADD → TSTORE四行代码写出分块向量加法 → 用 CPU 仿真验证正确性。完成这 3 步,你就已经跨入了 Tile 级算子开发的大门,接下来可以挑战 row-softmax 与 GEMM 教程 💪
【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考