尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PTO Tile Lib 编译流程全解析:从 C++ intrinsic 源码到 CPU 仿真 / NPU 多后端构建产物

PTO Tile Lib 编译流程全解析:从 C++ intrinsic 源码到 CPU 仿真 / NPU 多后端构建产物 PTO Tile Lib 编译流程全解析从 C intrinsic 源码到 CPU 仿真 / NPU 多后端构建产物【免费下载链接】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 仓库中的《编译流程说明》为核心骨架结合仓库内include/pto/头文件组织、backend 选择机制与测试脚本系统梳理 PTO Tile Lib 从 C 源码到构建产物的完整路径。读者将掌握如何用 PTO intrinsics 编写 kernel、编译时 backend 是如何被选中的、CPU 仿真与 NPU 两条路径的差异以及编译失败时按什么顺序排查问题。1. 概述PTO kernel 的编写模型PTOParallel Tile Operation是 Ascend CANN 定义的一种面向 tile 级操作的虚拟指令集架构。PTO kernel 以 C 形式编写通过TLOAD、TADD、TMATMUL、TSTORE等PTO intrinsic表达计算与数据移动当需要控制执行顺序时通过 event 机制表达依赖关系。对于上层开发者最常用的公共入口头文件是#include pto/pto-inst.hpp该头文件位于 include/pto/pto-inst.hpp是官方推荐的统一入口详见 include/pto/README.md。intrinsic 层主要由 include/pto/README.md 所描述的头文件树提供其中最核心的是include/pto/common/pto_instr.hpp。从源码结构看见 include/pto/README.mdinclude/pto/目录被组织为几个明确的分层common/平台无关的 Tile 类型系统与指令基础设施包括pto_tile.hpp核心 Tile 类型与 layout、pto_instr.hpp/pto_instr_impl.hpp指令声明与共享实现、memory.hpp、constants.hpp、type.hpp等通用工具cpu/CPU 侧仿真与调试支持npu/按 SoC 代际拆分的 NPU 侧实现例如npu/a2a3/Ascend A2/A3 系列、npu/a5/Ascend A5 系列comm/通信指令库入口为pto_comm_inst.hpp核心类型定义在comm_types.hpp平台分发层为pto_comm_instr_impl.hpp。这种“公共头文件在前、平台实现按目录拆分”的组织方式是理解 PTO 编译流程的起点同一份源码通过不同的构建配置可以对接完全不同的 backend。2. 构建与编译特征PTO Tile Lib 采用C intrinsic 接口从公共 API 角度看具有以下特征header-based / template-based 使用方式绝大多数接口以头文件 模板形式提供公共 API 在使用时直接可见多 backend 可对接同一份 PTO 源码可以在不同 build 配置下对接不同 backendCPU 仿真、costmodel、NPUCPU 仿真是首选验证路径用于功能开发与正确性验证NPU 执行则依赖 Ascend CANN 环境语言标准要求代码库要求C20 或更高版本。从 include/pto/pto-inst.hpp 的实现可以看到 backend 选择是如何在头文件层面发生的。该统一入口头文件在包含公共基础设施之后按编译宏分派#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_SIM、__CCE_AICORE__、__COSTMODEL这三个宏分别对应 CPU 仿真、NPU设备端编译通常由昇腾编译器定义__CCE_AICORE__与成本模型三类 backend它们决定了最终包含哪一套 intrinsic 实现。项目级构建说明可参考 README.md 与 快速开始。3. 构建流程概览从开发者视角看PTO 的构建流程可以概括为PTO C 源码 - C 预处理 / 编译 - PTO intrinsic 头文件选择对应 backend 实现 - 构建系统编译测试、kernel 或 demo - 生成二进制或测试产物需要特别说明的是该描述是开发者视角的概括只描述源代码到构建产物之间的主要关系。当前文档并不将某个完整的专有编译器流水线表述为公开契约——例如“frontend - PTO intrinsic expansion - middle-end IR - backend lowering”这样的固定内部阶段顺序。这类内部阶段可能存在于工具链中但不作为本文档中的规范接口说明。PTO 的公开面是公共编程接口与使用模型编译器内部阶段属于实现细节。顶层构建入口是仓库根目录的 CMakeLists.txt其结构非常精简通过include(cmake/fetch_cann_cmake.cmake)引入 CANN 项目的公共 CMake 基础设施随后调用init_cann_project()、add_cann_target_options()并加载 cmake/package.cmake、cmake/func.cmake、version.cmake 等模块完成打包与版本信息配置。4. 公共 intrinsic 层与 backend 选择机制公共 intrinsic 入口位于include/pto/common/pto_instr.hpp。该头文件对外暴露以下一类接口声明形式见 include/pto/common/pto_instr.hppTASSIGNTLOADTSTORETADD、TMUL、TEXP等向量类指令TMATMUL等矩阵类指令同时这个头文件会根据构建条件包含不同的 backend 实现头文件。其中的关键机制是MAP_INSTR_IMPL宏族公共 API 通过宏把调用转发到对应的API##_IMPL实现符号例如#define MAP_INSTR_IMPL(API, ...) API##_IMPL(__VA_ARGS__)在__CPU_SIM下宏还会额外插入PtoInstrTraceScope追踪作用域配合 include/pto/cpu 下的 trace 实现完成指令级仿真记录见include/pto/common/pto_instr.hpp中#ifdef __CPU_SIM分支。非仿真构建下宏仅做纯粹的函数转发。backend 具体实现则进一步由架构宏决定。在 include/pto/common/arch_macro.hpp 中架构特征宏由__NPU_ARCH__推导而来__NPU_ARCH__ 2201-PTO_NPU_ARCH_A2A3Ascend A2/A3 系列__NPU_ARCH__ 3101 / 3510-PTO_NPU_ARCH_A5Ascend A5 系列其中 3510 还定义PTO_URMA_SUPPORTED__NPU_ARCH__ 3113 / 3003 / 5101 / 9201- 分别映射到 Kirin9030 / KirinX90 / KirinDev0000 / A6并定义PTO_COMM_NOT_SUPPORTED同时__DAV_CUBE__/__DAV_VEC__cube/vector 核与__CPU_SIM组合决定PTO_COMPILE_CUBE/PTO_COMPILE_VEC编译能力宏。结合 include/pto/README.md 可以看到include/pto/npu/下的实现正是按a2a3/、a5/等目录拆分与架构宏一一对应。因此从开发者角度理解编译过程时更准确的方式是使用 PTO intrinsics 编写 C 代码按照仓库的构建配置进行编译构建系统负责传入__CPU_SIM、__NPU_ARCH__等宏由所选 backend 提供具体实现路径。5. 本仓库中实际使用的构建工具与命令当前仓库可以明确依赖以下工具CMake顶层 CMakeLists.txt 与 cmake/ 下的构建脚本Python用于脚本和测试支持 C20 的编译器本仓库中常见的命令例如# CPU 仿真 python3 tests/run_cpu.py --clean --verbose # 在 CPU 仿真上运行 demo python3 tests/run_cpu.py --demo gemm --verbose # 在 simulator backend 上运行 ST python3 tests/script/run_st.py -r sim -v a3 -t tadd -g TADDTest.case_float_64x64_64x64上述命令来自 tests/run_cpu.py 与 tests/script/run_st.py。其中-r sim指定 simulator backend、-v a3指定 SoC 版本对应上文PTO_NPU_ARCH_A2A3、-t tadd指定测试用例目录、-g指定 gtest 过滤器精确到单个 case。测试相关的更多说明可参考 tests/README.md。在本仓库内进行构建时建议优先采用已有脚本和文档中的命令而不是自行假设一套独立的构建流程。6. CPU 仿真路径与 NPU 路径6.1 CPU 仿真路径CPU 仿真路径主要用于功能开发和正确性验证。在该路径下PTO intrinsic 仍以 C 源码形式直接出现开发者可以像写普通 C 一样阅读和调试backend 行为由 CPU 仿真实现建模编译时通过__CPU_SIM宏触发见 include/pto/pto-inst.hpp 中的cpu_stub.hpp引入某些仅设备端有效的同步细节会被简化或者表现为 no-op。与之配套的是 CPU 仿真说明、快速开始教程 与 事件与同步 等文档。6.2 NPU 路径NPU 路径面向 Ascend 硬件或 simulator 侧执行。在该路径下会使用面向 NPU 的 backend 实现__CCE_AICORE__设备端编译按__NPU_ARCH__选择 include/pto/npu 下对应 SoC 代际的实现设备端约束如 cube/vector 核能力、片上存储、同步语义会更直接地影响代码合法性指令是否可用需要结合 backend 支持表逐项确认。相关参考后端实现状态PTO ISA 参考此外仓库还提供 costmodel 路径__COSTMODEL宏用于性能仿真与成本建模其实现位于 include/pto/costmodel用户指南见 costmodel 文档。7. 编译相关检查项当 PTO kernel 编译失败或行为不符合预期时最可靠的检查路径是头文件级 API 用法intrinsic 的使用方式是否符合 include/pto/common/pto_instr.hpp 中的声明例如TASSIGN同时存在运行时地址重载与编译期地址模板重载TASSIGNAddr(tile)后者会在编译期对 Tile / ConvTile 触发静态边界与对齐检查tassign_static_check这类编译期能力是排查赋值类问题的重要线索。ISA 约束docs/isa/ 中对应指令是否允许当前 tile 类型、布局和操作数组合Tile 与 GlobalTensor 定义tile shape、valid region、layout 是否合法GlobalTensor的 shape / stride 声明是否正确backend 支持情况目标指令在所选 backend 上是否已实现可参考 后端实现状态某些指令会通过PTO_STATIC_ASSERT在编译期直接拒绝不支持的 backend例如SYNCALL在非 A2A3 / A5 / CPU_SIM 后端会触发 “SYNCALL is not supported on this backend.” 的静态断言见 include/pto/common/pto_instr.hpp。构建环境编译器需支持 C20、Python 环境、CANN 环境是否满足要求8. 关于构建示例的说明一些在通用 AI 工具或网络示例中常见的片段例如通用的find_package(PTO REQUIRED)、假设存在的PTO::pto链接目标等不能直接视为本仓库已经正式定义的标准集成方式。本仓库当前的构建入口是根目录 CMakeLists.txt 及其引入的 cmake/ 脚本体系配套的测试与 demo 构建方式位于 tests/ 与 demos/ 目录。补充文档或扩展 PTO Tile Lib 时应以仓库内构建脚本、顶层CMakeLists.txt以及现有测试和 demo 的构建方式为主要参考。9. 总结PTO Tile Lib 的编译流程可以概括为PTO 代码以 C 和公共 intrinsics如TLOAD、TADD、TMATMUL、TSTORE形式编写统一入口为#include pto/pto-inst.hpp构建系统CMake Python 脚本根据配置__CPU_SIM/__CCE_AICORE__/__COSTMODEL/__NPU_ARCH__等宏选择对应的 backend 实现CPU 仿真是推荐的首选验证路径NPU 执行依赖 Ascend CANN 环境backend 支持情况与指令合法性ISA 约束、Tile/GlobalTensor 定义、构建环境在开发过程中需显式检查。需要再次强调的是本仓库文档重点说明公共编程接口和使用模型除非在专门的工具链文档中另行定义编译器内部阶段如 IR 中间表示与 lowering 的具体顺序仍属于实现细节不作为公共契约。【免费下载链接】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),仅供参考
返回列表