PTO 虚拟指令集开发导航:CANN pto-isa 全量指令分类、接口约定与开发实践指南
【免费下载链接】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
导读
本文是 CANN pto-isa 仓库中 PTO(Parallel Tile Operation)虚拟指令集的开发导航指南。PTO 是 Ascend CANN 定义的面向 Tile 块级编程的虚拟指令集架构,本仓提供 124 条 Tile 指令及一套片间通信扩展指令。文章以 docs/menu_ops_development.md 的操作菜单为骨架,完整梳理全部指令的分类体系、接口组织形式(头文件/库文件)、通用操作数约定(Tile、GlobalTensor、有效区域、事件同步),并结合逐指令参考文档与仓库源码给出从"查文档"到"写 Kernel"的完整路径。读完本文,你将能够按功能类别快速定位所需 PTO 指令、读懂任何一条指令参考页、理解 Auto/Manual 两种放置模式与多后端选择机制,并掌握已废弃接口的迁移方法。
一、PTO 指令集全景:124 条指令与三类命名前缀
根据 PTO-ISA-Header-and-Library-Description.md,PTO 全称 Parallel Tile Operation,即并行 Tile 操作,是 Ascend CANN 定义的面向 Tile 编程的虚拟指令集架构,本仓共提供124 条 Tile 指令,其中包含一套片间通信扩展指令。这些指令覆盖逐元素计算、归约、广播、矩阵乘与 GEMV、数据搬运、类型转换、布局变换、排序、Union 计算等计算与变换场景,以及同步、资源配置等系统控制场景,可供上层框架、算子实现与编译工具链统一调用。
PTO 指令统一采用 Tile 块级抽象,命名风格为"指令类别前缀 + 计算名称",整体首字母大写,采用 PascalCase 风格:
| 前缀 | 含义 | 典型指令 |
|---|---|---|
T | 面向 Tile 对象的操作(绝大多数指令) | TADD、TMUL、TMATMUL、TGEMV、TLOAD、TSTORE、TMOV、TGATHER、TSCATTER、TCVT |
M | 不规则访存(memory),Gather/Scatter | MGATHER、MSCATTER |
SYNCALL | 跨核同步屏障 | SYNCALL |
操作菜单文档 docs/menu_ops_development.md 将全部指令组织为 11 大类:头文件和库文件说明、逐元素双目运算、逐元素单目运算、逐元素算术与超越函数、逐元素与标量运算、归约运算、广播运算、矩阵运算、数据搬运与访存、复杂变换计算、系统与控制,外加独立的通信章节。全量指令索引还可参考 docs/PTOISA_zh.md,逐指令参考文档则位于 docs/isa/,通信指令位于 docs/isa/comm/。
二、接口组织:唯一入口头文件与多后端自动选择
2.1 头文件布局
PTO 接口的头文件位于 CANN 安装目录下的<arch>-linux/include/子目录中,例如${INSTALL_DIR}/aarch64-linux/include/pto/pto-inst.hpp。${INSTALL_DIR}为 CANN 软件安装路径,以 root 用户安装为例,默认路径为/usr/local/Ascend/cann。
pto/pto-inst.hpp是 PTO 指令集架构的唯一对外统一入口头文件,上层只需包含pto/pto-inst.hpp即可获得全部公开接口,无需逐个包含子头文件。该头文件按职责聚合以下模块:
- Tile 类型系统与公共工具:定义 Tile 对象、内存与缓冲区管理、常量、Kernel 元信息及通用工具。
- 指令 API 声明:定义 124 条 Tile 指令的统一声明,每条指令提供 Auto 自动放置与 Manual 手动放置两种形式,覆盖逐元素计算、归约、广播、矩阵乘与 GEMV、数据搬运、类型转换、布局变换、排序、Union 计算、同步、资源配置与片间通信等接口。
- 多后端自动选择:依据编译期宏自动选择实现后端——定义
__CPU_SIM时启用 CPU 仿真后端,定义__COSTMODEL时启用 A2/A3 CostModel 后端,定义__CCE_AICORE__时启用 NPU 真机后端,并按 SoC 代际 A2/A3、A5、Kirin 等划分实现。 - 片间通信指令库:定义 NPU 间点对点通信、信号同步与集合通信接口,含同步与异步两套接口。
在仓库源码中,指令内建接口的权威声明位于 include/pto/common/pto_instr.hpp,通信指令的权威声明位于 include/pto/comm/pto_comm_inst.hpp,通信相关类型定义位于 include/pto/comm/comm_types.hpp。
2.2 库文件:header-only 纯头文件模板库
PTO-ISA 为header-only 纯头文件模板库,指令实现以模板与内联形式在编译期展开进上层 Kernel,无需单独链接.so文件。其编译期依赖 BiSheng 编译器bisheng-compiler将含 PTO 指令的 Kernel 编译为设备代码;运行期依赖 CANN Runtime 库libruntime.so提供设备执行环境。
三、指令分类详解(对照操作菜单)
以下按照 docs/menu_ops_development.md 的分类结构逐一展开,括号内给出对应的逐指令参考页链接。
3.1 逐元素双目运算(Tile-Tile)
算术运算(docs/menu/arithmetic_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TADD | 两个 Tile 的逐元素加法 | TADD |
TSUB | 两个 Tile 的逐元素减法 | TSUB |
TMUL | 两个 Tile 的逐元素乘法 | TMUL |
TMAX | 两个 Tile 的逐元素最大值 | TMAX |
TMIN | 两个 Tile 的逐元素最小值 | TMIN |
此外 ISA 参考目录还收录TMADD(三元运算src0 * dst + src1)、TMULA(src0 * src1 + dst)等融合形式,见 docs/isa/README.md。
逻辑运算(docs/menu/binary_logic_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TAND | 逐元素按位与 | TAND |
TOR | 逐元素按位或 | TOR |
TXOR | 逐元素按位异或 | TXOR |
TSHL | 逐元素左移 | TSHL |
TSHR | 逐元素右移 | TSHR |
TCMP | 比较两个 Tile 并写入打包的谓词掩码 | TCMP |
TSEL | 用掩码 Tile 在两个 Tile 间逐元素选择 | TSEL |
3.2 逐元素单目运算
| 指令 | 语义 | 参考 |
|---|---|---|
TABS | 逐元素绝对值 | TABS |
TNOT | 逐元素按位取反 | TNOT |
TNEG | 逐元素取负 | TNEG |
TRELU | 逐元素 ReLU | TRELU |
3.3 逐元素算术与超越函数
| 指令 | 语义 | 参考 |
|---|---|---|
TDIV | 两个 Tile 的逐元素除法 | TDIV |
TREM | 余数(符号与除数相同) | TREM |
TSQRT | 逐元素平方根 | TSQRT |
TLOG | 逐元素自然对数 | TLOG |
TRECIP | 逐元素倒数 | TRECIP |
TEXP | 逐元素指数 | TEXP |
TRSQRT | 逐元素倒数平方根 | TRSQRT |
3.4 逐元素与标量运算(Tile-Scalar / Tile-Immediate)
算术运算(docs/menu/scalar_arithmetic_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TADDS | Tile 与标量逐元素加法 | TADDS |
TAXPY | 原位缩放累加:dst = scalar * src0 + dst | TAXPY |
TSUBS | 从 Tile 逐元素减标量 | TSUBS |
TMULS | Tile 与标量逐元素乘法 | TMULS |
TDIVS | 与标量逐元素除法(Tile/标量 或 标量/Tile) | TDIVS |
TMINS | Tile 与标量逐元素最小值 | TMINS |
TMAXS | Tile 与标量逐元素最大值 | TMAXS |
TREMS | 与标量的余数:remainder(src, scalar) | TREMS |
逻辑运算(docs/menu/scalar_logic_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TANDS | Tile 与标量逐元素按位与 | TANDS |
TORS | Tile 与标量逐元素按位或 | TORS |
TXORS | Tile 与标量逐元素按位异或 | TXORS |
TCMPS | Tile 与标量比较并写入逐元素比较结果 | TCMPS |
TSELS | 用掩码 Tile 在源 Tile 与标量间选择 | TSELS |
TSHLS | Tile 按标量左移 | TSHLS |
TSHRS | Tile 按标量右移 | TSHRS |
3.5 归约运算(轴归约)
归约为一列(逐行归约)(docs/menu/reduce_to_col_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TROWSUM | 对每行跨列求和 | TROWSUM |
TROWPROD | 对每行跨列求积 | TROWPROD |
TROWMAX | 每行最大值 | TROWMAX |
TROWMIN | 每行最小值 | TROWMIN |
TROWARGMAX | 每行最大值对应列索引 | TROWARGMAX |
TROWARGMIN | 每行最小值对应列索引 | TROWARGMIN |
归约为一行(逐列归约)(docs/menu/reduce_to_row_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TCOLSUM | 对每列跨行求和 | TCOLSUM |
TCOLPROD | 对每列跨行求积 | TCOLPROD |
TCOLMAX | 每列最大值 | TCOLMAX |
TCOLMIN | 每列最小值 | TCOLMIN |
TCOLARGMAX | 每列最大值对应行索引(值+行索引) | TCOLARGMAX |
TCOLARGMIN | 每列最小值对应行索引(值+行索引) | TCOLARGMIN |
3.6 广播运算(轴扩展)
按行广播(docs/menu/broadcast_row_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TROWEXPAND | 将每个源行首元素广播到目标行 | TROWEXPAND |
TROWEXPANDADD | 行广播加法(加每行标量向量) | TROWEXPANDADD |
TROWEXPANDSUB | 行广播减法 | TROWEXPANDSUB |
TROWEXPANDMUL | 行广播乘法 | TROWEXPANDMUL |
TROWEXPANDDIV | 行广播除法 | TROWEXPANDDIV |
TROWEXPANDMAX | 行广播最大值 | TROWEXPANDMAX |
TROWEXPANDMIN | 行广播最小值 | TROWEXPANDMIN |
TROWEXPANDEXPDIF | 行指数差:exp(src0 - src1) | TROWEXPANDEXPDIF |
按列广播(docs/menu/broadcast_col_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TCOLEXPAND | 将每个源列首元素广播到目标列 | TCOLEXPAND |
TCOLEXPANDADD | 列广播加法 | TCOLEXPANDADD |
TCOLEXPANDSUB | 列广播减法 | TCOLEXPANDSUB |
TCOLEXPANDMUL | 列广播乘法 | TCOLEXPANDMUL |
TCOLEXPANDDIV | 列广播除法 | TCOLEXPANDDIV |
TCOLEXPANDMAX | 列广播最大值 | TCOLEXPANDMAX |
TCOLEXPANDMIN | 列广播最小值 | TCOLEXPANDMIN |
TCOLEXPANDEXPDIF | 列指数差:exp(src0 - src1) | TCOLEXPANDEXPDIF |
3.7 矩阵运算
矩阵乘矩阵(docs/menu/matmul_mat_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TMATMUL | 矩阵乘(GEMM),生成累加器/输出 Tile | TMATMUL |
TMATMUL_BIAS | 矩阵乘加偏置 | TMATMUL_BIAS |
TMATMUL_ACC | 带累加器输入的矩阵乘(融合累加) | TMATMUL_ACC |
TMATMUL_MX | 带缩放 Tile 的混合精度/量化矩阵乘 | TMATMUL_MX |
矩阵乘向量(docs/menu/matmul_vec_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TGEMV | 通用矩阵-向量乘法,生成累加器/输出 Tile | TGEMV |
TGEMV_BIAS | GEMV 加偏置 | TGEMV_BIAS |
TGEMV_ACC | 带显式累加器输入/输出 Tile 的 GEMV | TGEMV_ACC |
TGEMV_MX | 带缩放 Tile 的混合精度 GEMV | TGEMV_MX |
3.8 数据搬运与访存
规则访存(docs/menu/regular_access_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TLOAD | 从 GlobalTensor(GM)加载数据到 Tile | TLOAD |
TSTORE | 从 Tile 存储数据到 GlobalTensor(GM),可选原子写或量化参数 | TSTORE |
TPREFETCH | 从全局内存预取到 Tile 本地缓存/缓冲区(提示) | TPREFETCH |
不规则访存(docs/menu/irregular_access_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
MGATHER | 用逐元素索引从 GM 收集加载到 Tile | MGATHER |
MSCATTER | 用逐元素索引将 Tile 元素散播存储到 GM | MSCATTER |
3.9 复杂变换计算
初始化(docs/menu/init_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TEXPANDS | 将标量广播到目标 Tile | TEXPANDS |
TCI | 生成连续整数序列到目标 Tile | TCI |
TTRI | 生成三角(下/上)掩码 Tile | TTRI |
TRANDOM | 用计数器密码算法在目标 Tile 生成随机数 | TRANDOM |
TFILLPAD | 复制 Tile 并在有效区域外以编译期填充值填充 | TFILLPAD |
数据类型转换(docs/menu/cast_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TCVT | 带指定舍入模式的逐元素类型转换 | TCVT |
TQUANT | 量化 Tile(如 FP32 → FP8),生成指数/缩放/最大值输出 | TQUANT |
TDEQUANT | 仿射反量化(S8/S16 → FP32):dst = (src - offset) * scale | TDEQUANT |
布局变换(docs/menu/layout_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TEXTRACT | 从源 Tile 提取子 Tile | TEXTRACT |
TINSERT | 在(indexRow, indexCol)偏移处插入子 Tile | TINSERT |
TGATHER | 用索引 Tile 或编译期掩码模式收集/选择元素 | TGATHER |
TSCATTER | 用逐元素行索引将源 Tile 行散播到目标 Tile | TSCATTER |
TCONCAT | 沿列维度水平拼接两个 Tile | TCONCAT |
TTRANS | 转置(使用实现定义的临时 Tile) | TTRANS |
TIMG2COL | 类卷积工作负载的图像到列变换 | TIMG2COL |
TMOV | Tile 间移动/复制,可选应用实现定义的转换模式 | TMOV |
TGATHERB | 使用字节偏移量收集元素 | TGATHERB |
TDEINTERLEAVE | 反交织为偶数/奇数元素流(TINTERLEAVE 的逆) | TDEINTERLEAVE |
TINTERLEAVE | 交织两个源 Tile 为交替偶/奇流,拆分为两个目标半部分 | TINTERLEAVE |
TRESHAPE | 将 Tile 重新解释为另一种类型/形状,保留底层字节 | TRESHAPE |
排序(docs/menu/sort_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TSORT32 | 对每 32 元素块连同idx条目排序,输出排序后的 value-index 对 | TSORT32 |
TMRGSORT | 多个已排序列表的归并排序(实现定义的元素格式和布局) | TMRGSORT |
THISTOGRAM | 逐字节直方图(256 桶),可级联高位字节过滤(基数排序桶计数原语) | THISTOGRAM |
Union 计算(docs/menu/union_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TPARTADD | 部分逐元素加法(有效区域不匹配时实现定义) | TPARTADD |
TPARTMUL | 部分逐元素乘法 | TPARTMUL |
TPARTMAX | 部分逐元素最大值 | TPARTMAX |
TPARTMIN | 部分逐元素最小值 | TPARTMIN |
TPARTARGMAX | 部分最大值选择并返回对应索引(argmax) | TPARTARGMAX |
TPARTARGMIN | 部分最小值选择并返回对应索引(argmin) | TPARTARGMIN |
3.10 系统与控制
调试(docs/menu/debug_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TASSIGN | 将 Tile 对象绑定到实现定义的片上地址(Manual 手动放置) | TASSIGN |
TPRINT | 调试/打印 Tile 中的元素(实现定义) | TPRINT |
CV 通信(Cube-Vector 核间通信)(docs/menu/cv_comm_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TPUSH | 将生产者 Tile 推入 TPipe FIFO,用于 Cube-Vector 通信 | TPUSH |
TPOP | 从 TPipe FIFO 弹出消费者 Tile/GlobalTensor | TPOP |
TALLOC | 将 TPipe FIFO 槽位分配为 GlobalTensor 视图 | TALLOC |
TFREE | 释放 TPipe FIFO 空间(部分目标上对 TileData TPOP 流程为空操作) | TFREE |
同步(docs/menu/sync_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
SYNCALL | 跨核同步屏障(硬件 FFTS 或软件 GM 轮询) | SYNCALL |
3.11 通信(片间通信扩展指令)
同步通信(docs/menu/sync_comm_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TPUT | 远程写:本地数据传输到远端 NPU 内存(GM → UB → GM) | TPUT |
TGET | 远程读:远端 NPU 数据读取到本地(GM → UB → GM) | TGET |
TBROADCAST | 将当前 NPU 数据广播到所有 rank | TBROADCAST |
TREDUCE | 从所有 rank 收集数据并逐元素归约到本地 | TREDUCE |
TNOTIFY | 向远端 NPU 发送标志通知 | TNOTIFY |
TWAIT | 阻塞等待,直到信号满足比较条件 | TWAIT |
TTEST | 非阻塞检测信号是否满足比较条件 | TTEST |
异步通信(docs/menu/async_comm_zh.md):
| 指令 | 语义 | 参考 |
|---|---|---|
TPUT_ASYNC | 异步远程写(本地 GM → DMA 引擎 → 远端 GM) | TPUT_ASYNC |
TPUT_ASYNC_NOTIFY | 远程写并更新远端int32_tsignal | TPUT_ASYNC_NOTIFY |
TGET_ASYNC | 异步远程读(远端 GM → DMA 引擎 → 本地 GM) | TGET_ASYNC |
四、通用约定:操作数、形状与有效区域
docs/isa/conventions_zh.md 定义了所有指令参考页共用的术语与写法,并与 include/pto/common/pto_instr.hpp 中的 C++ 内建接口保持一致:
- Tile:片上二维操作数对象(如
pto::Tile<...>),大量指令以 Tile 为输入/输出,并通过GetValidRow()/GetValidCol()使用 Tile 的有效区域。 - GM(全局内存):通过
pto::GlobalTensor<...>访问的片外内存视图。 - 标量 / 立即数:主机侧标量值,或在
*S/*C等变体中编码的立即数参数。
C++ 编程模型请参考 docs/coding/Tile_zh.md、docs/coding/GlobalTensor_zh.md、docs/coding/Scalar_zh.md。
物理形状与有效形状:Rows/Cols描述 Tile 的物理存储形状;GetValidRow()/GetValidCol()描述参与计算的有效区域,修改有效形状不改变物理步长。对于非分形 Tile,元素(i, j)的偏移(元素为单位)为i * RowStride + j * ColStride:RowMajor 步长为(Cols, 1),ColMajor 步长为(1, Rows)。例如 A5 上int64_t/uint64_t的 RowMajor 输出物理形状为[64,4]、有效形状为[64,1]时,物理行步长仍为 4 个元素(32 字节),行归约结果位于偏移0, 4, 8, ...。
有效区域语义:指令页中"对有效区域内的每个元素(i, j)"默认指valid_row = dst.GetValidRow()、valid_col = dst.GetValidCol();数学语义仅对0 <= i < valid_row且0 <= j < valid_col的dst[i, j]定义;有效区域之外元素的值为未指定(不要假设一定清零或保持不变)。
事件与同步:某些指令序列需要建立内存与向量流水线之间的顺序关系,示例中的事件(如set_flag(...)/wait_flag(...))用于表达后端需要满足的顺序约束;在需要显式同步的场景使用 event synchronization 建立阶段间顺序。事件模型参考 docs/coding/Event_zh.md。
五、指令参考页结构拆解:以 TADD 为例
每一条指令在 docs/isa/ 下都有独立参考页,结构统一为:指令示意图 → 简介 → 数学语义 → 汇编语法 → IR(Level 1 / Level 2)→ C++ 内建接口 → 约束 → 示例。以 TADD 为例:
汇编语法(同步形式):
%dst = tadd %src0, %src1 : !pto.tile<...>IR Level 1(SSA):
%dst = pto.tadd %src0, %src1 : (!pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>IR Level 2(DPS):
pto.tadd ins(%src0, %src1 : !pto.tile_buf<...>, !pto.tile_buf<...>) outs(%dst : !pto.tile_buf<...>)C++ 内建接口:
template <typename TileDataDst, typename TileDataSrc0, typename TileDataSrc1, typename... WaitEvents> PTO_INST RecordEvent TADD(TileDataDst &dst, TileDataSrc0 &src0, TileDataSrc1 &src1, WaitEvents &... events);约束(体现多后端差异):
- Atlas A2/A3 训练与推理系列:
dst、src0、src1数据类型必须相同,且为int32_t、int16_t、half、float之一;布局均为行主序。 - Ascend 950PR / 950DT:数据类型必须相同,支持
int32_t、uint32_t、int64_t、uint64_t、float、int16_t、uint16_t、half、bfloat16_t、uint8_t、int8_t;布局均为行主序。 - CPU_SIM:三个操作数数据类型必须相同,不额外限制行主序,各操作数按自身布局与物理形状计算地址。
- 有效区域:使用
dst.GetValidRow()/dst.GetValidCol()作为迭代域;A2A3、A5 与 CPU_SIM 均要求三者的运行时有效行列数完全相同,不匹配触发断言失败。
示例(Auto 模式,混用静态/动态有效形状):
#include <pto/pto-inst.hpp> using namespace pto; void example_mixed_valid_shape() { using DynamicTile = Tile<TileType::Vec, int32_t, 16, 16, BLayout::RowMajor, -1, -1>; using StaticTile = Tile<TileType::Vec, int32_t, 16, 16, BLayout::RowMajor, 16, 16>; DynamicTile dst(16, 16), src1(16, 16); StaticTile src0; TADD(dst, src0, src1); }由此可见,阅读任何指令时只需关注四件事:数学语义(做什么)、汇编/IR 形式(怎么编译)、C++ 接口与约束(怎么写、支持哪些类型与后端)、示例(直接可运行)。
六、已废弃接口与迁移指南
docs/isa/README.md 声明:自PTO ISA v9.2.0起,以下旧指令接口不再对外暴露,兼容窗口关闭,不再保留公共包装:
TADDC、TAddDeqRelu、TADDReluConv、TADDSC、TFUSEDMULADDRELU、TGET_SCALE_ADDR、TPairReduceSum、TSUBC、TSUBRELU、TSUBRELUCONV、TSUBSC、TSUBVIEW、TSYNC。
迁移要点:
TSYNC(events...)改用普通基于事件的排序:将事件对象传给消费指令,或在消费前显式调用WaitAllEvents(events...)。TSUBVIEW无公共 ISA 替代;仓库内部实现可使用pto::detail::PtoSubTileView作为内部辅助,外部代码应通过受支持的 Tile 构造与公共数据搬运 API 表达数据视图。- 三元/标量融合算术形式改用对应原语序列,如
TADD、TSUB、TADDS、TSUBS、TMUL、TMADD、TRELU。 - 融合乘加接口更名:
TFUSEDMULADD→TMADD,TMULADDDST→TMULA。 - 融合 add/ReLU/convert 或 add/dequant/ReLU 形式拆分为显式的算术、转换/反量化与
TRELU步骤。 TPairReduceSum改用与目标布局匹配的行/列归约原语。- 不要调用
TGET_SCALE_ADDR;AUTO 模式 MX 测试中,应在调用 MX 矩阵乘原语前于测试代码内从数据 Tile 绑定 scale Tile 地址。
七、从文档导航到实际开发:仓库配套资源
菜单文档的价值在于"按功能找指令",而实际开发还需结合仓库配套资源:
- 权威声明:所有指令的 C++ 内建接口以 include/pto/common/pto_instr.hpp 为权威来源;通信指令见 include/pto/comm/pto_comm_inst.hpp 与 include/pto/comm/comm_types.hpp。公共包含头统一为
pto/pto-inst.hpp。 - 手动(Manual)算子示例:kernels/manual/a5/ 与 kernels/manual/a2a3/ 存放手写 Tile Kernel 示例,演示
TLOAD/TSTORE/TMATMUL等指令的完整使用与 CMake 构建脚本。 - 自动(Auto)模式示例:kernels/automode/a5/ 与 demos/auto_mode/ 演示 Auto 放置模式;demos/baseline/add/ 提供最小可运行的算子扩展(op_extension + test)样例。
- CPU 仿真与调试:定义
__CPU_SIM可启用 CPU 仿真后端,tests/cpu/st/ 下有大量可对照的 CPU 侧测试;CPU 仿真原理见 docs/coding/cpu_sim_zh.md。 - 测试验证:真机指令测试见 tests/npu/a5/(含每类指令的用例),批量运行入口为 tests/run_st.sh 与 tests/run_cpu_tests.sh。
- 编程模型文档:完整了解 Tile 生命周期、GlobalTensor 访存、多核编程与性能优化,可继续阅读 docs/coding/README_zh.md 下的 ProgrammingModel_zh.md、Tile_zh.md、GlobalTensor_zh.md、multi-core-programming_zh.md 等。
八、总结
PTO 虚拟指令集以 Tile 为统一抽象,通过T(计算与搬运)、M(不规则访存)、SYNCALL(跨核同步)三类前缀组织 124 条指令,覆盖从逐元素运算、归约广播、矩阵乘到数据搬运、布局变换、类型转换、排序、Union、系统控制与片间通信的完整算子开发场景。以 docs/menu_ops_development.md 为导航入口,配合 docs/isa/ 逐指令参考、docs/isa/conventions_zh.md 通用约定与 include/pto/common/pto_instr.hpp 权威声明,开发者可以快速定位、理解并使用任意 PTO 指令;结合 kernels/ 示例与 tests/ 测试,即可完成从指令选型到 Kernel 编写、仿真验证与真机跑测的完整开发闭环。
【免费下载链接】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),仅供参考