ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PTO 指令集公共头文件体系全解:include/pto 目录结构与 T 指令 API 使用指南

PTO 指令集公共头文件体系全解:include/pto 目录结构与 T 指令 API 使用指南 PTO 指令集公共头文件体系全解include/pto 目录结构与 T 指令 API 使用指南【免费下载链接】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-isainclude/pto 是 CANN pto-isa 仓库中 PTOParallel Tile OperationTile 库的公共头文件入口集中承载了 Tile 类型系统、T 系列指令 APIAuto/Manual 两种形态、CPU 仿真桩与按 SoC 分代的 NPU 指令实现。本文以 include/pto/README.md 为骨架逐层拆解该目录的组织方式、统一入口头文件的编译宏分派机制并结合仓库源码给出实际的包含方式、指令调用示例与 SoC 选择方法帮助读者在自定义算子开发中正确引用 PTO 头文件并定位对应实现。include/pto 是什么PTO Tile Lib 的公共头文件入口include/pto/是 PTO Tile Lib 面向上层代码的唯一公共头文件目录。它本身不实现指令而是把四类能力组织在一起构成一个自洽的头文件体系Tile 类型系统与共享工具负责 Tile 的 Shape/Stride 描述、内存布局、常量与通用工具全部位于common/子目录PTO 指令 API 声明Auto/Manual 形态指令既有面向算子的自动化封装也有供手动 Kernel 调用的底层形态声明统一集中在 pto_instr.hppCPU 仿真/桩支持在不具备 NPU 环境时提供指令级仿真与调试能力见cpu/与 cpu_stub.hppNPU 指令实现按 SoC 分代同一指令在不同昇腾芯片代际上有不同的优化实现与流水细节见npu/下按 SoC 划分的子目录。推荐包含方式统一入口头文件 pto-inst.hpp官方推荐的包含方式是只引入一个头文件#include pto/pto-inst.hpppto-inst.hpp 的包含逻辑是理解整个头文件体系的钥匙。它首先无条件引入平台无关的type.hpp与kernel_meta.hpp然后依据编译宏做三路分派#include pto/common/type.hpp #include pto/common/kernel_meta.hpp #if defined(__CPU_SIM) #include pto/common/cpu_stub.hpp #elif defined(__COSTMODEL) #include pto/costmodel/runtime_stub.hpp #endif #include pto/common/memory.hpp #if defined(__CPU_SIM) || defined(__CCE_AICORE__) || defined(__COSTMODEL) #include pto/common/arch_macro.hpp #include pto/common/arch_capability.hpp #include pto/common/pto_tile.hpp #if defined(__COSTMODEL) #include pto/costmodel/pto_instr.hpp #else #include pto/common/pto_instr.hpp #endif #endif三种编译宏对应的运行形态是编译宏含义拉入的头文件__CPU_SIMCPU 仿真场景cpu_stub.hpp提供__global__、__aicore__、pipe_t等桩定义与aclrtMalloc等内存接口的仿真实现__COSTMODEL代价模型/性能仿真场景pto/costmodel/runtime_stub.hpp与 pto_instr.hpp供 perf-sim 使用__CCE_AICORE__昇腾 AI Core 真实编译场景走common/pto_instr.hpp的真实指令声明可见同一份上层 Kernel 代码在三种形态下使用同一个头文件入口指令的 CPU 仿真、代价建模与 NPU 实际执行完全共用 API 表面这正是 PTO 跨平台特性的头文件层支撑。目录布局总览按 include/pto/README.md 的 Layout 说明整体结构如下include/pto/ ├── pto-inst.hpp # 统一入口头文件上层代码推荐包含 ├── common/ # 平台无关的 Tile 与指令基础设施 │ ├── pto_tile.hpp # 核心 Tile 类型与布局 │ ├── pto_instr.hpp # 指令声明含 CPU 仿真 trace 宏 │ ├── pto_instr_impl.hpp# 指令共享实现 按 SoC 分发的 include │ ├── memory.hpp # 内存分配/搬移相关接口 │ ├── constants.hpp # 常量定义 │ ├── utils.hpp # 通用工具 │ └── type.hpp # 基础类型 ├── cpu/ # CPU 侧仿真/调试支持启用时生效 ├── npu/ # NPU 侧实现按 SoC 分代 │ ├── a2a3/ # Ascend A2/A3 系列 │ ├── a5/ # Ascend A5 系列 │ └── ... └── comm/ # 通信指令库 ├── pto_comm_inst.hpp # 通信指令统一入口头文件 ├── comm_types.hpp # 通信指令核心类型定义 └── pto_comm_instr_impl.hpp # 通信指令平台分发层common/平台无关的 Tile 与指令基础设施common/是 PTO 指令体系的地基所有平台形态CPU 仿真、代价模型、NPU 真实执行都共享这一层。pto_tile.hpp核心 Tile 类型与布局pto_tile.hpp 定义了 PTO 的维度抽象。它用DYNAMIC值为-1标记运行时才知道的维度Shape与Stride都是五维模板类静态已知的维度在编译期固化动态维度则在构造时写入constexpr int DYNAMIC -1; template int64_t N1 DYNAMIC, ..., int64_t N5 DYNAMIC struct Shape { static constexpr int64_t staticShape[5] {N1, N2, N3, N4, N5}; int64_t shape[GlobalTensorDim::TOTAL_DIM] {1}; // 根据 N1..N5 中哪些是 DYNAMIC对应维度由构造参数填充 }; template int64_t SN1 DYNAMIC, ... struct Stride { ... };值得注意的编译期约束Shape构造函数的参数个数必须与动态维度个数一致否则触发static_assert报错。例如ShapeDYNAMIC, 64是一维动态的 Shape只能用单参数构造。这种静态优先、动态兜底的设计让编译器可以对固定维度做常量折叠与边界检查与 TASSIGN 的编译期地址校验tassign_static_check静态断言一脉相承。pto_instr.hpp指令声明与调用宏pto_instr.hpp 集中声明所有 T 指令的公共 API。以TASSIGN为例指令的声明层只是一个薄封装真正的实现通过宏展开映射到XXX_IMPLtemplate typename T, typename AddrType PTO_INST void TASSIGN(T obj, AddrType addr) { MAP_INSTR_IMPL(TASSIGN, obj, addr); }MAP_INSTR_IMPL系列宏pto_instr.hpp是声明层–实现层分离机制的核心在__CPU_SIM下宏会额外插入一个PtoInstrTraceScope指令追踪作用域对象用于 CPU 仿真时的指令级 trace在非仿真编译下则退化为纯函数调用API##_IMPL(__VA_ARGS__)。宏族还包括模板参数形态MAP_INSTR_IMPL_T与输出数量标注形态MAP_INSTR_IMPL_OUTS覆盖指令的多种签名需求。此外pto_instr.hpp在非代价模型且支持通信时自动引入pto/comm/pto_comm_inst.hpp见 pto_instr.hpp#L81-L83因此上层只需包含pto-inst.hpp即可同时获得计算指令与通信指令的全部 API。pto_instr_impl.hpp共享实现与 SoC 分发pto_instr_impl.hpp 是共享实现 分代实现的汇合点它先引入平台无关的基础头文件随后依据PTO_NPU_ARCH_A2A3、PTO_NPU_ARCH_A5等宏把对应 SoC 的指令实现如npu/a2a3/TAdd.hpp、npu/a2a3/TMatmul.hpp、npu/a2a3/TLoad.hpp拉入编译单元代价模型形态则切换到npu/a2a3/下供 costmodel 使用的同名实现。这样指令的 API 签名全局统一而每个 SoC 版本可以有自己的优化实现与流水细节上层 Kernel 无需感知具体芯片代际。common/中其余文件各司其职memory.hpp 提供内存分配与搬移接口、constants.hpp 集中常量、utils.hpp 提供通用工具、type.hpp 定义基础类型。cpu/CPU 仿真与调试支持在无 NPU 的开发环境下通过定义__CPU_SIM即可启用 CPU 仿真形态。cpu_stub.hpp 是这个形态的翻译层它把昇腾设备侧的语言要素映射到标准 C将__global__、__aicore__、__gm__、__ubuf__等地址空间/关键字宏替换为空定义定义pipe_t与PIPE_S、PIPE_V、PIPE_MTE1……PIPE_ALL等流水常量并提供空实现的pipe_barrier提供aclrtMalloc、aclrtMallocHost、aclFloat16ToFloat等 ACL 接口的仿真版本其中内存分配直接落到宿主机堆上calloc。借助这一层开发者可以在纯 CPU 环境里编译运行 Kernel 逻辑、借助PtoInstrTraceScope得到指令执行轨迹再结合 CPU 仿真与调试文档、调试指南 定位问题最后无缝切换到 NPU 真实编译。仓库的 tests/cpu/st 下 480 个测试文件正是依赖这套仿真桩在 CPU 上完成指令级验证的。npu/按 SoC 分代的 NPU 指令实现npu/目录按昇腾芯片代际组织指令实现。README 明确列出的两代是a2a3/Ascend A2/A3 系列如 TAdd.hpp、TMatmul.hpp、TLoad.hpp 等a5/Ascend A5 系列同名指令的独立优化实现。实际仓库中该目录还包含a6/、kirin9030/、kirinX90/、kirinDev0000/等更多平台子目录以及存放共享 Kernel 实现的kernels/子目录印证了同一指令 API、多平台实现的演进路径。每代实现都会依据各自的硬件流水如 MTE/Vector/Cube 的并行能力做针对性优化。SoC 版本如何选择SoC 的选择由构建系统与测试脚本控制见 include/pto/npu/README.mdtests/script/run_st.py 与 tests/script/build_st.py通过-v a3|a5参数选择目标 SoCtests/npu/soc/src/st/CMakeLists.txt 系列按 SoC 构建对应的 ST 测试目标与依赖。对端到端的上手流程官方建议从 docs/getting-started.md 开始。仓库中的真实算子示例可作为配套参考例如 demos/baseline/add 展示了包含pto-inst.hpp、编写 T 指令 Kernel 并完成编译运行的完整闭环。comm/通信指令库comm/是 PTO 的通信指令库面向 NPU 间数据传输、信号同步与集合通信。按 include/pto/comm/README.md 的说明其入口与分发同样采用统一头文件 平台分发的模式。统一入口与平台分发pto_comm_inst.hpp公共 API 头文件上层代码只包含它即可它会自动拉入所需类型并分发到正确后端NPU 原生或 CPU 仿真comm_types.hpp核心类型定义包括ParallelGroup、Signal、Signal2D、NotifyOp、WaitCmp、ReduceOp、DmaEngine、AsyncEvent等pto_comm_instr_impl.hpp编译期后端分发层按PTO_NPU_ARCH_A5、__CCE_AICORE__、__CPU_SIM分别引入 a5/a2a3/CPU 仿真实现。以远程写指令TPUT为例pto_comm_inst.hpp#L26-L75其数据流为 本地 GM → staging Tile(UB) → 远端 GM支持编译期模板参数与运行期参数两种方式指定原子操作AtomicNone/AtomicAdd并提供单缓冲与乒乓双缓冲ping-pong两种形态用于重叠相邻分块的 TLOAD/TSTORE// 编译期指定原子类型TPUTAtomicType::AtomicAdd(dst, src, stagingTile); // 运行期指定原子类型TPUT(dst, src, stagingTile, AtomicType::AtomicAdd); // 乒乓双缓冲 TPUT(dst, src, pingTile, pongTile);指令分类comm/下指令按功能分为四类include/pto/comm/README.md类别指令说明点对点同步TPUT、TGET经 UB 中转 Tile 的远程写/远程读支持单缓冲与乒乓双缓冲点对点异步TPUT_ASYNC、TGET_ASYNC基于 SDMA、URMA 或 RDMA 引擎的 GM 到 GM DMA返回AsyncEvent供后续 Wait/Test信号同步TNOTIFY、TWAIT、TTEST基于标志位的跨 NPU 同步信号为int32_t标量或 2D 信号网格集合通信TGATHER、TSCATTER、TBROADCAST、TREDUCE基于ParallelGroup的多 rank 操作root 发起支持分块 2D 滑动与乒乓其中异步指令的后端能力按 SoC 差异明显a2a3 仅支持 SDMA而 a5 支持 SDMA含 MTE 回退、URMA 与 RDMA 三种引擎见 comm/README.md 中a5/async/的说明。上层通过BuildAsyncSessionengine()构建引擎无关的AsyncSession再用AsyncEvent::Wait(session)/.Test(session)完成同步从而屏蔽后端差异。相关文档与进一步阅读指令参考docs/isa/ 是全部 T 指令的语义规范与示例含 TLOAD、TSTORE、TMATMUL、TGATHER 等与include/pto的声明一一对应头文件与库说明PTO-ISA-Header-and-Library-Description.md 从整体上描述头文件与库的组织虚拟指令集手册PTO-Virtual-ISA-Manual.md 讲解指令语义与编程模型入门与算子开发docs/getting-started.md 提供端到端上手流程docs/coding/ 下的教程如 vec-add.md、gemm.md给出从包含头文件到写出完整 Kernel 的分步示例。小结include/pto通过一个统一入口pto-inst.hpp、三层平台形态CPU 仿真/代价模型/NPU、两级分代实现计算指令按 SoC、通信指令按后端的设计让上层算子代码只依赖一套稳定的 T 指令 API即可横跨昇腾多代芯片与多种开发环境。理解这个目录的骨架是阅读、调试与编写 PTO 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),仅供参考
返回列表