PTO 虚拟指令集开发导航:CANN pto-isa 全量指令分类、接口约定与开发实践指南 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 仓库中 PTOParallel 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.mdPTO 全称 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、TCVTM不规则访存memoryGather/ScatterMGATHER、MSCATTERSYNCALL跨核同步屏障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 的逐元素加法TADDTSUB两个 Tile 的逐元素减法TSUBTMUL两个 Tile 的逐元素乘法TMULTMAX两个 Tile 的逐元素最大值TMAXTMIN两个 Tile 的逐元素最小值TMIN此外 ISA 参考目录还收录TMADD三元运算src0 * dst src1、TMULAsrc0 * src1 dst等融合形式见 docs/isa/README.md。逻辑运算docs/menu/binary_logic_zh.md指令语义参考TAND逐元素按位与TANDTOR逐元素按位或TORTXOR逐元素按位异或TXORTSHL逐元素左移TSHLTSHR逐元素右移TSHRTCMP比较两个 Tile 并写入打包的谓词掩码TCMPTSEL用掩码 Tile 在两个 Tile 间逐元素选择TSEL3.2 逐元素单目运算指令语义参考TABS逐元素绝对值TABSTNOT逐元素按位取反TNOTTNEG逐元素取负TNEGTRELU逐元素 ReLUTRELU3.3 逐元素算术与超越函数指令语义参考TDIV两个 Tile 的逐元素除法TDIVTREM余数符号与除数相同TREMTSQRT逐元素平方根TSQRTTLOG逐元素自然对数TLOGTRECIP逐元素倒数TRECIPTEXP逐元素指数TEXPTRSQRT逐元素倒数平方根TRSQRT3.4 逐元素与标量运算Tile-Scalar / Tile-Immediate算术运算docs/menu/scalar_arithmetic_zh.md指令语义参考TADDSTile 与标量逐元素加法TADDSTAXPY原位缩放累加dst scalar * src0 dstTAXPYTSUBS从 Tile 逐元素减标量TSUBSTMULSTile 与标量逐元素乘法TMULSTDIVS与标量逐元素除法Tile/标量 或 标量/TileTDIVSTMINSTile 与标量逐元素最小值TMINSTMAXSTile 与标量逐元素最大值TMAXSTREMS与标量的余数remainder(src, scalar)TREMS逻辑运算docs/menu/scalar_logic_zh.md指令语义参考TANDSTile 与标量逐元素按位与TANDSTORSTile 与标量逐元素按位或TORSTXORSTile 与标量逐元素按位异或TXORSTCMPSTile 与标量比较并写入逐元素比较结果TCMPSTSELS用掩码 Tile 在源 Tile 与标量间选择TSELSTSHLSTile 按标量左移TSHLSTSHRSTile 按标量右移TSHRS3.5 归约运算轴归约归约为一列逐行归约docs/menu/reduce_to_col_zh.md指令语义参考TROWSUM对每行跨列求和TROWSUMTROWPROD对每行跨列求积TROWPRODTROWMAX每行最大值TROWMAXTROWMIN每行最小值TROWMINTROWARGMAX每行最大值对应列索引TROWARGMAXTROWARGMIN每行最小值对应列索引TROWARGMIN归约为一行逐列归约docs/menu/reduce_to_row_zh.md指令语义参考TCOLSUM对每列跨行求和TCOLSUMTCOLPROD对每列跨行求积TCOLPRODTCOLMAX每列最大值TCOLMAXTCOLMIN每列最小值TCOLMINTCOLARGMAX每列最大值对应行索引值行索引TCOLARGMAXTCOLARGMIN每列最小值对应行索引值行索引TCOLARGMIN3.6 广播运算轴扩展按行广播docs/menu/broadcast_row_zh.md指令语义参考TROWEXPAND将每个源行首元素广播到目标行TROWEXPANDTROWEXPANDADD行广播加法加每行标量向量TROWEXPANDADDTROWEXPANDSUB行广播减法TROWEXPANDSUBTROWEXPANDMUL行广播乘法TROWEXPANDMULTROWEXPANDDIV行广播除法TROWEXPANDDIVTROWEXPANDMAX行广播最大值TROWEXPANDMAXTROWEXPANDMIN行广播最小值TROWEXPANDMINTROWEXPANDEXPDIF行指数差exp(src0 - src1)TROWEXPANDEXPDIF按列广播docs/menu/broadcast_col_zh.md指令语义参考TCOLEXPAND将每个源列首元素广播到目标列TCOLEXPANDTCOLEXPANDADD列广播加法TCOLEXPANDADDTCOLEXPANDSUB列广播减法TCOLEXPANDSUBTCOLEXPANDMUL列广播乘法TCOLEXPANDMULTCOLEXPANDDIV列广播除法TCOLEXPANDDIVTCOLEXPANDMAX列广播最大值TCOLEXPANDMAXTCOLEXPANDMIN列广播最小值TCOLEXPANDMINTCOLEXPANDEXPDIF列指数差exp(src0 - src1)TCOLEXPANDEXPDIF3.7 矩阵运算矩阵乘矩阵docs/menu/matmul_mat_zh.md指令语义参考TMATMUL矩阵乘GEMM生成累加器/输出 TileTMATMULTMATMUL_BIAS矩阵乘加偏置TMATMUL_BIASTMATMUL_ACC带累加器输入的矩阵乘融合累加TMATMUL_ACCTMATMUL_MX带缩放 Tile 的混合精度/量化矩阵乘TMATMUL_MX矩阵乘向量docs/menu/matmul_vec_zh.md指令语义参考TGEMV通用矩阵-向量乘法生成累加器/输出 TileTGEMVTGEMV_BIASGEMV 加偏置TGEMV_BIASTGEMV_ACC带显式累加器输入/输出 Tile 的 GEMVTGEMV_ACCTGEMV_MX带缩放 Tile 的混合精度 GEMVTGEMV_MX3.8 数据搬运与访存规则访存docs/menu/regular_access_zh.md指令语义参考TLOAD从 GlobalTensorGM加载数据到 TileTLOADTSTORE从 Tile 存储数据到 GlobalTensorGM可选原子写或量化参数TSTORETPREFETCH从全局内存预取到 Tile 本地缓存/缓冲区提示TPREFETCH不规则访存docs/menu/irregular_access_zh.md指令语义参考MGATHER用逐元素索引从 GM 收集加载到 TileMGATHERMSCATTER用逐元素索引将 Tile 元素散播存储到 GMMSCATTER3.9 复杂变换计算初始化docs/menu/init_zh.md指令语义参考TEXPANDS将标量广播到目标 TileTEXPANDSTCI生成连续整数序列到目标 TileTCITTRI生成三角下/上掩码 TileTTRITRANDOM用计数器密码算法在目标 Tile 生成随机数TRANDOMTFILLPAD复制 Tile 并在有效区域外以编译期填充值填充TFILLPAD数据类型转换docs/menu/cast_zh.md指令语义参考TCVT带指定舍入模式的逐元素类型转换TCVTTQUANT量化 Tile如 FP32 → FP8生成指数/缩放/最大值输出TQUANTTDEQUANT仿射反量化S8/S16 → FP32dst (src - offset) * scaleTDEQUANT布局变换docs/menu/layout_zh.md指令语义参考TEXTRACT从源 Tile 提取子 TileTEXTRACTTINSERT在(indexRow, indexCol)偏移处插入子 TileTINSERTTGATHER用索引 Tile 或编译期掩码模式收集/选择元素TGATHERTSCATTER用逐元素行索引将源 Tile 行散播到目标 TileTSCATTERTCONCAT沿列维度水平拼接两个 TileTCONCATTTRANS转置使用实现定义的临时 TileTTRANSTIMG2COL类卷积工作负载的图像到列变换TIMG2COLTMOVTile 间移动/复制可选应用实现定义的转换模式TMOVTGATHERB使用字节偏移量收集元素TGATHERBTDEINTERLEAVE反交织为偶数/奇数元素流TINTERLEAVE 的逆TDEINTERLEAVETINTERLEAVE交织两个源 Tile 为交替偶/奇流拆分为两个目标半部分TINTERLEAVETRESHAPE将 Tile 重新解释为另一种类型/形状保留底层字节TRESHAPE排序docs/menu/sort_zh.md指令语义参考TSORT32对每 32 元素块连同idx条目排序输出排序后的 value-index 对TSORT32TMRGSORT多个已排序列表的归并排序实现定义的元素格式和布局TMRGSORTTHISTOGRAM逐字节直方图256 桶可级联高位字节过滤基数排序桶计数原语THISTOGRAMUnion 计算docs/menu/union_zh.md指令语义参考TPARTADD部分逐元素加法有效区域不匹配时实现定义TPARTADDTPARTMUL部分逐元素乘法TPARTMULTPARTMAX部分逐元素最大值TPARTMAXTPARTMIN部分逐元素最小值TPARTMINTPARTARGMAX部分最大值选择并返回对应索引argmaxTPARTARGMAXTPARTARGMIN部分最小值选择并返回对应索引argminTPARTARGMIN3.10 系统与控制调试docs/menu/debug_zh.md指令语义参考TASSIGN将 Tile 对象绑定到实现定义的片上地址Manual 手动放置TASSIGNTPRINT调试/打印 Tile 中的元素实现定义TPRINTCV 通信Cube-Vector 核间通信docs/menu/cv_comm_zh.md指令语义参考TPUSH将生产者 Tile 推入 TPipe FIFO用于 Cube-Vector 通信TPUSHTPOP从 TPipe FIFO 弹出消费者 Tile/GlobalTensorTPOPTALLOC将 TPipe FIFO 槽位分配为 GlobalTensor 视图TALLOCTFREE释放 TPipe FIFO 空间部分目标上对 TileData TPOP 流程为空操作TFREE同步docs/menu/sync_zh.md指令语义参考SYNCALL跨核同步屏障硬件 FFTS 或软件 GM 轮询SYNCALL3.11 通信片间通信扩展指令同步通信docs/menu/sync_comm_zh.md指令语义参考TPUT远程写本地数据传输到远端 NPU 内存GM → UB → GMTPUTTGET远程读远端 NPU 数据读取到本地GM → UB → GMTGETTBROADCAST将当前 NPU 数据广播到所有 rankTBROADCASTTREDUCE从所有 rank 收集数据并逐元素归约到本地TREDUCETNOTIFY向远端 NPU 发送标志通知TNOTIFYTWAIT阻塞等待直到信号满足比较条件TWAITTTEST非阻塞检测信号是否满足比较条件TTEST异步通信docs/menu/async_comm_zh.md指令语义参考TPUT_ASYNC异步远程写本地 GM → DMA 引擎 → 远端 GMTPUT_ASYNCTPUT_ASYNC_NOTIFY远程写并更新远端int32_tsignalTPUT_ASYNC_NOTIFYTGET_ASYNC异步远程读远端 GM → DMA 引擎 → 本地 GMTGET_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 * ColStrideRowMajor 步长为(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/ 下都有独立参考页结构统一为指令示意图 → 简介 → 数学语义 → 汇编语法 → IRLevel 1 / Level 2→ C 内建接口 → 约束 → 示例。以 TADD 为例汇编语法同步形式%dst tadd %src0, %src1 : !pto.tile...IR Level 1SSA%dst pto.tadd %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...IR Level 2DPSpto.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 TileTileType::Vec, int32_t, 16, 16, BLayout::RowMajor, -1, -1; using StaticTile TileTileType::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→TMADDTMULADDDST→TMULA。融合 add/ReLU/convert 或 add/dequant/ReLU 形式拆分为显式的算术、转换/反量化与TRELU步骤。TPairReduceSum改用与目标布局匹配的行/列归约原语。不要调用TGET_SCALE_ADDRAUTO 模式 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),仅供参考