Tile ISA 与 PTO 算子详解:AI 芯片的块级编程抽象
Tile ISA 与 PTO 算子详解:AI 芯片的块级编程抽象
面向 RISC-V NPU 架构研究、gem5 仿真、AI 编译器前端(tinygrad)链路的调研整理
关键词:Tile ISA · PTO 算子 · 昇腾 CANN · 脉动阵列 · gem5 · tinygrad · Triton · Gemmini
目录
- 一、从 GEMM 说起:先分清几个易混概念
- 二、Tile ISA 是什么
- 三、PTO 算子详解
- 四、PTO / Triton / Gemmini 编程模型对比
- 五、PTO 与传统方案对比
- 六、完整编译链路串讲
- 七、CSDN 发布建议
一、从 GEMM 说起:先分清几个易混概念
很多同学在调研时容易把下面几个词搞混,先统一口径:
| 概念 | 定义 | 是不是软件/硬件 |
|---|---|---|
| GEMM | 通用矩阵乘法,一种算法算子(数学运算) | 算法本身,哪里都能算 |
| Gemmini | 伯克利的 RISC-V 脉动阵列 NPU 硬件 IP | 硬件加速器 IP |
| PTO | Parallel Tile Operation,昇腾 CANN 的块级虚拟指令集/算子编程范式 | 中间层虚拟 ISA |
| Tile ISA | 面向 AI 芯片的「块级/瓦片级虚拟指令集架构」 | 中间层抽象规范 |
| Triton | OpenAI 的 GPU Tile 编程语言 | 编译器前端 |
一句话区分:
- GEMM 是“要算的任务”
- PTO / Triton 是“给硬件写这个任务的中间语言”
- Gemmini 是“专门加速矩阵乘的硬件电路”
二、Tile ISA 是什么
2.1 ISA 是什么
ISA(Instruction Set Architecture,指令集架构) 是 CPU / NPU / GPU 硬件对外暴露的一套“指令菜单”,是软件和硬件之间的契约。
它规定了:芯片能识别哪些指令、每条指令做什么、寄存器如何定义、数据寻址方式、支持的数据类型。
- 硬件电路(RTL)按照这份契约去实现;
- 编译器、汇编器、软件按照这份契约生成指令。
⚠️ 关键区分:
- ISA(指令集架构):规范 / 接口 / 契约(抽象)
- 微架构(Microarchitecture):硬件如何具体实现这套 ISA(电路细节)
举例:RISC-V 是 ISA;Rocket、BOOM、Gemmini 配套核、你在 gem5 里搭的 RISC-V 核,都是微架构实现。同一份 RISC-V ISA,可以做出性能、面积差异巨大的不同芯片。
2.2 传统硬件 ISA(RISC-V / ARM / x86)
- 指令原子:标量、向量;一条指令做一次加法、一次向量乘
- 硬件直接译码执行,是芯片原生能认的指令
- 编译器最终输出的就是这类 ISA 指令
- 硬件一旦改 ISA,全部软件都要适配
示例(RISC-V 汇编):
add x1, x2, x3 ; 标量 ISA 指令
vfmul.vv v1, v2, v3 ; 向量 ISA(RVV)指令
2.3 广义 ISA 的两类形态
| 类型 | 硬件 ISA(RISC-V / ARM / AscendC) | 虚拟 Tile ISA(PTO) |
|---|---|---|
| 本质 | 芯片软硬件之间的契约 | 算子编译器与后端之间的中间契约 |
| 执行方 | 硬件译码器直接执行 | 编译器转译后交给底层 ISA 执行 |
| 计算原子 | 标量、向量 | Tile 张量块 |
| 硬件绑定 | ISA 规范强绑定,微架构可换 | 与硬件解耦,同一份代码可映射多款硬件 |
| 代表 | RISC-V RV64G、RVV、ARMv9、x86 | 昇腾 PTO-ISA |
一句话记忆:硬件 ISA 是硬件听得懂的母语;Tile ISA 是编译器之间的中间通用语言,还要再翻译一遍才给硬件。
3.1 Tile 是什么
Tile = 瓦片,在 AI 芯片 / 算子领域,指把一个超大张量(矩阵)切分出来的一块固定尺寸子矩阵 / 子张量。中文文献常译作“分块、瓦片块”。
3.2 为什么要切 Tile:访存墙(Memory Wall)
以 GEMM 为例,A[4096×4096] × B[4096×4096]:
- 矩阵太大,无法一次性全部塞进 NPU 片上高速缓存(UB / SRAM),只能放在慢速全局内存(GM / DRAM);
- 若直接整块计算,会反复读写全局内存,带宽跟不上算力,计算单元大量空转;
- Tile 思路:把大矩阵切成许多小块(如 32×32、16×64),一次只加载 1~几个 Tile 到片上高速缓存中反复复用,大幅减少慢速访存。
这一切分动作称为 Tiling(分块 / Blocking)。
形象比喻:一张巨大海报(大矩阵),桌面(片上 UB)很小放不下,只能剪成一张张小瓦片(Tile),一次拿一张到桌面上处理。
3.3 Tile 的属性
一个 Tile 不只是一块数据,还附带元信息:
- shape:形状,如
16×16、64×32、128×128 - dtype:数据类型,FP16 / BF16 / INT8
- 存储位置:GM(全局内存)/ L2 / UB(片上缓冲,昇腾体系)
- 布局:行主序、列主序、面向矩阵乘优化的硬件特殊排布
Tile 尺寸不是统一标准,而是根据硬件资源(UB 容量、张量核能力)设计的超参数,是算子调优重点。
3.4 易混名词对照
| 名词 | 含义 |
|---|---|
| Tile | 张量切分出的单个小块(瓦片) |
| Tiling | 切分整个大张量为 Tile 的策略 / 算法(动词+名词) |
| Tile ISA | 以 Tile 为操作原子的虚拟指令集(PTO) |
| UB(Unified Buffer) | NPU 片上高速缓冲,存放正在计算的 Tile |
| GM(Global Memory) | 全局内存(DRAM),存放完整大张量 |
补充:Triton 里的 Block 本质思想与 Tile 一致(大块放进片上共享内存),差别在于:Tile 是昇腾 NPU 面向多级缓存与矩阵乘硬件的抽象;Block 是 Triton 面向 GPU Shared Memory 的抽象。
4.1 Tile ISA 是什么
Tile ISA 是面向 AI 芯片的块级(瓦片级)虚拟指令集架构。其计算原子不再是标量 / 向量 / 线程,而是 Tile(二维张量块);指令描述“对一块 Tile 做什么计算、如何搬运”,而不直接操作硬件寄存器。它属于中间层虚拟 ISA,不是硬件原生硬指令集。
昇腾 PTO-ISA 就是一套具体的 Tile ISA;NVIDIA CUDA Tile IR 是另一套 Tile 思路。
4.2 传统 ISA 与 Tile ISA 对比
| 项目 | 传统硬件 ISA(RISC-V / AscendC) | Tile ISA(PTO-ISA) |
|---|---|---|
| 计算原子 | 标量 / 向量 | Tile 张量块 |
| 虚实属性 | 硬件真实指令,直接译码执行 | 虚拟指令,编译器转译到底层硬件指令 |
| 硬件绑定 | 强绑定,硬件改动代码基本重写 | 硬件无关语义,跨代可移植 |
| 开发关注点 | 寄存器、流水线、延迟、单核调度 | Tile 形状、数据局部性、块间依赖 |
| 调优空间 | 极致性能,门槛极高 | 快速开发 + 精细调优(Auto / Manual 双模式) |
| 适合场景 | 固化高性能算子、底层开发 | 新算子迭代、稀疏算子、FA/Mamba、自研 NPU 探索 |
4.3 五大核心特征
-
Tile 为一等公民:所有计算对象是带 shape / dtype / 位置属性的 Tile,契合 NPU 多级存储分层,强化局部性、缓解访存墙。
-
虚拟层、硬件解耦、跨代可移植(最核心价值):指令语义固定,不绑定核数、UB 大小、流水线延迟;同一份代码可映射多代硬件。
-
指令覆盖完整 AI 原语(不止 GEMM):PTO Tile ISA 共 120+ 条指令,分类如下:
指令类别 代表指令 用途 计算类 TMATMUL、TADD/TMUL、TREDUCE、TBROADCAST、TQUANT 矩阵乘、逐元素、归约、广播、量化 搬运类 TLOAD / TSTORE / TMOV Tile 块加载、存储、布局变换 不规则访存 MGATHER、MSCATTER 稀疏、Embedding、KV Cache 同步通信 SYNCALL、Tile 级集合通信 块同步、AllReduce 等跨核通信 -
双模式开发:Auto 模式只写语义、编译器自动调度;Manual 模式显式控制存储与发射顺序,保留调优入口。
-
自带仿真语义:块级语义确定,可先在 CPU 模拟器(SIM)上验证精度与依赖,再下放到硬件 / gem5。
Tile ISA 是面向 AI 芯片的「块级/瓦片级虚拟指令集架构」。
它的计算原子不再是单个标量、向量或线程,而是 Tile(固定形状的二维张量块)。指令描述的是“对一块 Tile 做什么计算、怎么搬运”,而不是直接操作硬件寄存器或硬件计算单元。它属于中间层虚拟 ISA,不是硬件原生的硬指令集。
你前面聊的 PTO-ISA,就是昇腾 CANN 实现的一套 Tile ISA;NVIDIA CUDA Tile IR 是另一套 Tile ISA 思路。
Tile = 瓦片,在 AI 芯片 / 算子领域,指把一个超大张量(矩阵)切分出来的一小块固定尺寸子矩阵 / 子张量。
2.2 传统 ISA vs Tile ISA
| 项目 | 传统硬件 ISA(RISC-V / AscendC) | Tile ISA(PTO-ISA) |
|---|---|---|
| 计算原子 | 标量 / 向量 | Tile 张量块 |
| 虚实属性 | 硬件真实指令,直接译码执行 | 虚拟指令,编译器转译到底层硬件指令 |
| 硬件绑定 | 强绑定,硬件改动代码基本重写 | 硬件无关语义,跨代可移植 |
| 开发关注点 | 寄存器、流水线、延迟、单核调度 | Tile 形状、数据局部性、块间依赖 |
| 调优空间 | 极致性能,门槛极高 | 兼顾快速开发 + 精细调优(Auto/Manual 双模式) |
| 适合场景 | 固化高性能算子、硬件底层开发 | 新算子快速迭代、稀疏算子、大模型 FA/Mamba、自研 NPU 架构探索 |
2.3 形象类比
- 传统 ISA(RISC-V / AscendC) = 给工人下达指令:搬一块砖、拧一颗螺丝
- Tile ISA(PTO) = 给包工头下达指令:把这一整垛砖(Tile)搬到指定区域、与另一垛砖对齐加工;包工头(编译器)再拆解成工人能懂的细碎动作
2.4 Tile ISA 的核心特征
-
以 Tile 为一等公民
所有计算对象是带 shape、dtype、存储位置属性的 Tile 对象,天然匹配 NPU 多级存储(全局内存 GM → L2 缓存 → 片上缓冲 UB),强化数据局部性,缓解 AI 芯片最头疼的访存墙问题。 -
虚拟层、硬件解耦,跨代可移植(最核心价值)
Tile 指令语义固定,不绑定硬件核数、UB 大小、张量核深度、流水线延迟。同一份 PTO Tile ISA 代码可在 A2、A3、910B、950 上运行,编译器针对不同硬件做 Tiling 切分、资源映射、指令重排。 -
指令集覆盖完整的 AI 算子原语,不止 GEMM
PTO Tile ISA 共 120+ 条指令,分为几大类:- 计算类:TMATMUL 矩阵乘、TADD/TMUL 逐元素、TREDUCE 归约、TBROADCAST 广播、TQUANT 量化、激活
- 数据搬运类:TLOAD / TSTORE / TMOV(Tile 块搬运、布局变换)
- 不规则访存:MGATHER、MSCATTER(稀疏、Embedding、KV Cache 场景)
- 同步与通信:SYNCALL、Tile 级集合通信指令(AllReduce 等)
-
双模式:声明式 Auto + 手动精细 Manual
- Auto 模式:只写计算语义,Tile 切分、搬运、同步交给编译器自动调度,快速验证
- Manual 模式:显式指定 Tile 存储位置、搬运时机、指令发射顺序,保留极致性能调优入口
-
自带仿真语义,方便验证
Tile ISA 有确定的块级语义,可单独写 CPU 模拟器(不依赖真实 NPU 硬件)先验证算子精度与依赖关系,再下放到硬件或 gem5 仿真器,调试链路友好。
三、PTO 算子详解
3.1 PTO 是什么
PTO(Parallel Tile Operation,并行 Tile 操作) 是昇腾 CANN 体系里一套面向 NPU AI Core 的 Tile 级虚拟指令集 / 算子编程范式,不是通用标准算子,而是昇腾生态专属的一层中间抽象层。
定位:介于上层框架算子(GEMM、Conv、Attention)和硬件原生指令之间的 Tile 编程语言 / ISA,专门用来写 NPU 高性能 Kernel。
- Tile:把大张量切成分块(如 64×64、128×128),NPU 的脉动阵列、片上 SRAM 天然按 Tile 调度计算
- PTO 指令集:矩阵乘 GEMM、GEMV、逐元素、归约、数据搬运、同步、跨核通信指令,合计 120+ 条
- 配套 PyPTO:Python 前端,可 JIT 写 PTO 算子,编译到昇腾 NPU 的 AI Core
⚠️ 重点:PTO 不是行业通用标准,不是 RISC-V 自带,gem5 原生不支持 PTO,tinygrad 默认也没有 PTO 后端。
3.2 PTO 的核心优势
优势一:跨代硬件源码可移植(最核心)
传统 AscendC、CUDA kernel、手写 GEMM,硬件架构一变(910B → 910C → 950),片上 SRAM 大小、核数、流水线、指令时序变化,算子基本要重写、重调 Tiling 策略。
PTO 是虚拟 Tile ISA,硬件无关的 Tile 抽象层:
- 算子源码只描述 Tile 级计算逻辑,不绑定硬件寄存器、硬件特定深度流水线
- 同一份 PTO 算子源码可在 A2 / A3 / 950 系列复用,编译器后端针对不同硬件做指令发射、内存排布、流水线映射
- 固定 Tile shape 下行为确定性,只开放 Tile 尺寸、指令序、缓存放置等调优维度,移植成本大幅下降
优势二:双模式开发,上手简单、上限高(Auto + Manual)
- Auto 自动模式:只写计算逻辑,编译器自动做 Tiling 切分、UB/GM/L2 内存搬运、依赖同步、流水线调度,适合快速开发验证,像写 PyTorch 一样
- Manual 手动模式:显式控制 Tile 存放位置、搬运时机、同步指令、发射顺序,精细控制片上缓存、掩盖访存延迟,压榨 NPU 算力上限
可渐进式调优:先 Auto 跑通精度,再局部切到 Manual 微调热点 Tile,不用一次性写全底层汇编。
优势三:Tile 原生抽象,天然适配 AI 访存特征,缓解 Memory Bound
大模型里很多算子不是单纯 GEMM(FA、MoE、RMSNorm、Mamba、DeltaNet、KV-cache 更新),属于混合计算 + 不规则访存 + 归约 + 广播:
- 所有计算以 Tile 块为基本单元,契合 NPU 多级存储分层;框架自动推导 Tile 存储位置,按需插入搬运指令
- 指令集覆盖全:GEMM/GEMV、逐元素、归约、广播、量化、稀疏访存、同步、片间通信,一套抽象覆盖 Transformer、状态空间模型、稀疏算子全链路
- 支持 Tile mask、动态 shape,适合变长序列、稀疏 Attention
实测案例:FlashAttention、Gated DeltaNet(Mamba 变种)PTO 实现对比原生 torch_npu kernel,常见序列长度下加速 1.3~3 倍,Prefill 阶段模型端到端收益明显。
优势四:计算图原生优化友好,更容易做算子融合
PTO 是计算图驱动范式,算子表达是 Tile Graph:
- 编译器可跨 Tile 做融合:量化、偏置、激活、转置、归约合并成一个 Megakernel,消除中间张量写回全局内存
- 容易做流水线并行:计算、数据搬运、跨核通信重叠
- 对上层框架友好:tinygrad、TorchNPU、MindSpore 可将 PTO 作为统一后端 IR;算子表达标准化,方便自动算子生成、自动搜优 Tiling 参数
优势五:自带仿真验证链路,降低调试门槛
PTO 支持 CPU 模拟器(SIM):
- 算子代码不用上真实 NPU 板卡,在 Ubuntu 主机上直接跑功能仿真、校验精度、调试逻辑
- 仿真模型保留 Tile、同步、数据搬运语义,与硬件行为对齐
优势六:异构集群扩展能力,内置 Tile 级通信原语
PTO 扩展指令集包含 Tile 粒度的片间通信、同步原语(SYNCALL 等):
- 计算和通信可在同一个 Tile Graph 里编排,实现计算、通信流水重叠
- 面向超节点、MoE 大模型分布式推理训练,Dispatch / Combine 这类通信密集算子更容易深度优化
3.3 PTO 小结
PTO 最大的价值不是单纯比 GEMM 更快,而是补齐了“高性能算子开发”中间层:底层硬件指令性能强但移植难、开发慢;上层框架 API 简单但性能天花板低;PTO 用 Tile 虚拟 ISA 做中间层,平衡了可移植性、开发效率、性能上限、编译优化空间。
四、PTO / Triton / Gemmini 编程模型对比
| 对比项 | PTO(Parallel Tile Operation) | OpenAI Triton | Gemmini |
|---|---|---|---|
| 核心定位 | 昇腾 NPU AI Core 的 Tile 级中间指令/编程范式,面向自研脉动阵列 NPU | GPU 上的 Tile 编程语言,替代手写 CUDA Kernel,面向 SIMT 架构 GPU | 开源 RISC-V 矩阵加速器硬件 IP,配套专用调用库/ISA 扩展,面向 RISC-V SoC |
| 归属生态 | 华为 CANN 闭源生态,昇腾专属 | 开源(MIT),原生支持 NVIDIA GPU,AMD/Intel 逐步适配 | 伯克利开源项目,可集成到 RISC-V,常搭配 gem5 仿真 |
| 抽象粒度 | Tile 块抽象,以矩阵分块为调度单元,内置片上 SRAM 搬运、同步、归约指令 | Tile 块抽象,基于 Program/Grid,线程块封装 Tile 计算 | 硬件寄存器级抽象,提供矩阵乘指令扩展(RoCC),由 CPU 下发矩阵任务 |
| 目标硬件 | 昇腾系列 NPU(达芬奇架构) | NVIDIA GPU 为主,GPU 通用 SIMT 架构 | RISC-V CPU + 脉动阵列矩阵加速器(自研 NPU 原型) |
| 编程前端 | PyPTO(Python)、PTO C 接口 | Python 前端,JIT 编译 | C / Spike / gem5 调用 API,RISC-V RoCC 自定义指令 |
| 核心优势 | 深度贴合达芬奇 NPU 数据流,带宽/算力压榨极强,支持复杂算子融合 | 上手简单,跨卡迁移,编译器自动做分块、访存优化,tinygrad 原生可对接 | 完全开源,可在 gem5 中搭建仿真,适合自研 NPU 架构探索 |
| 短板限制 | 闭源、绑定昇腾硬件,无法在 gem5 直接仿真,不能用于自研 RISC-V NPU 流片原型 | GPU 架构思维,调度模型不匹配脉动阵列 NPU,不适合做 NPU 架构探索 | 可编程能力弱,没有高层 Tile 语言,算子融合需在编译器侧实现 |
| 和 GEMM 关系 | 用来手写高性能 GEMM、Conv、Attention 内核 | 用来手写高性能 GEMM、Conv 内核 | 硬件本身就是 GEMM 加速单元,GEMM 是它的原生能力 |
| 和 tinygrad 关系 | tinygrad 无原生 PTO 后端,需要从零开发 lower 逻辑 | tinygrad 原生支持 Triton 后端,链路成熟 | tinygrad 需要新增后端,把计算图 lower 到 Gemmini RoCC 指令 |
| 和 gem5 关系 | 无原生模型,ISA 不兼容,仅设计思路可参考 | gem5 没有 GPU 模型,仅算法思想参考 | 原生适配 gem5 仿真,是 RISC-V NPU 仿真首选开源 IP |
| 适合你的场景 | 对标学习商用 NPU 的 Tile 调度设计思路 | 如果后续做 GPU 算子优化、tinygrad 编译调试 | ✅ 你当前路线:gem5 + RISC-V + 自研 NPU 仿真 |
五、PTO 与传统方案对比
| 方案 | 抽象层级 | 可移植性 | 调优门槛 | 融合能力 | 适用 |
|---|---|---|---|---|---|
| PTO | Tile 虚拟 ISA | ✅ 跨昇腾代际 | 中(Auto 低 / Manual 高) | 强,原生 Tile Graph | 自定义 FA、Mamba、稀疏算子、新架构算子 |
| 原生 GEMM 库 | 固化矩阵运算 | ❌ 硬件绑定 | 低,直接调用 | 弱,算子边界固定 | 标准矩阵乘 |
| Triton | Block 级 IR | 有限(NPU/GPU 不互通) | 中高 | 较好 | GPU 生态成熟,NPU 适配正在完善 |
| AscendC 底层 | 硬件指令 | ❌ 硬件强绑定 | 极高 | 强,完全手写 | 极致性能固化算子 |
六、完整编译链路串讲
下面用一张图展示「模型 → 算子拆解 → 三条不同编译链路」的整体关系:
三条路线说明
| 路线 | 中间抽象 | 目标硬件 | 是否适合自研芯片仿真 |
|---|---|---|---|
| 路线 A(昇腾) | PTO Tile ISA | 昇腾 NPU | ❌ 闭源绑定,只能参考设计思想 |
| 路线 B(你当前路线) | 自定义 Tile ISA | RISC-V + 自研 NPU | ✅ 完全开源,gem5 可仿真 |
| 路线 C(GPU) | Triton / CUDA | NVIDIA GPU | ⚠️ 仅算法思想参考 |
与 gem5 / RISC-V 链路的关系
研究链路:tinygrad 算子编译 → Tile ISA(PTO 风格 IR)→ 后端编译器 → RISC-V NPU 硬件指令 → gem5 仿真
- tinygrad:上层算子编译器,可以输出 Tile ISA 作为中间 IR
- Tile ISA:中间标准抽象层,隔离算法算子逻辑和 NPU 硬件 RTL
- gem5:仿真硬件,只需要实现「Tile ISA → 自研 NPU 硬件指令」的后端;硬件改了,上层算子代码不用大改
PTO 本身不能直接用于自研 RISC-V NPU,但它的 Tile 抽象、片上存储调度、数据流流水线设计思路是很好的参考范本。
参考与延伸
- PTO 相关:昇腾 CANN 官方文档、PyPTO 开发者文档
- Triton:https://github.com/triton-lang/triton
- Gemmini:https://github.com/ucb-bar/gemmini
- tinygrad:https://github.com/tinygrad/tinygrad
- gem5:https://www.gem5.org/
注:本文为技术调研整理,PTO 具体指令细节以昇腾 CANN 官方文档为准;文中性能数据(1.3~3 倍加速)来自公开社区实测案例,供参考。核心内容有豆包生成。
更多推荐




所有评论(0)