ARTICLE DETAIL

资讯详情

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

PTO 指令 TROWPROD 深度解析:行乘积归约的数学语义、跨平台实现与 C++ 内建接口使用指南

PTO 指令 TROWPROD 深度解析:行乘积归约的数学语义、跨平台实现与 C++ 内建接口使用指南 人工智能指令集算子库CANNAscend【免费下载链接】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点击查看免费下载本指南以 docs/isa/TROWPROD.md 为骨架结合 CANN pto-isa 仓库中include/pto下的 CPU / A2A3 / A5 各平台实现与tests下的测试用例展开。TROWPROD 是 Parallel Tile OperationPTO虚拟指令集中用于逐行乘积累归约的向量 Tile 指令它将每个 Tile 行内的全部元素相乘把一行压缩为一个标量结果。读完本文你将掌握 TROWPROD 的数学语义、三层汇编表示、C 内建函数签名、布局与类型约束、tmp临时空间在 A2A3 与 A5 上的不同用法以及如何在 Auto / Manual 两种模式下正确编写与验证代码。指令语义与数学定义TROWPROD 属于 PTO 指令集中的行归约族与 TROWSUM、TROWMAX、TROWMIN 等并列可参考 docs/menu/reduce_to_row_zh.md。它对输入 Tile 的每一行独立执行连乘得到与行数相同数量、每行一个元素的结果并将结果沿列方向压缩到输出 Tile 中。设R src.GetValidRow()有效行数、C src.GetValidCol()有效列数对任意0 i R输出满足$$ \mathrm{dst}{i,0} \prod{j0}^{C-1} \mathrm{src}_{i,j} $$也就是说输出 Tile 第i行的第0列唯一有效列等于输入第i行所有有效列的连乘积。由于逐行相互独立TROWPROD 天然适合每行代表一个独立样本/通道、需要把行内特征压缩成单一标量的场景例如归一化因子计算、权值累乘或按行聚合的统计量计算。下图为 TROWPROD 的 Tile 操作示意图源文档插图从实现层面看该归约并非一次性完成而是通过分块乘入 树形归约实现详见下文 A2A3 与 A5 的实现差异。指令层次与汇编语法PTO 指令在不同抽象层级上有不同的语法表示TROWPROD 完整覆盖了从用户态同步形式到底层 DPS 形式的全部层级。同步形式PTO Assembly最上层的同步形式只暴露src操作数%dst trowprod %src : !pto.tile... - !pto.tile...注意汇编降级lowering过程中可能引入内部临时 tile因此在 C 内建函数级别必须显式传入tmp操作数。AS Level 1SSA 形式SSA 形式显式携带%tmp操作数类型为两个输入 Tile、一个输出 Tile%dst pto.trowprod %src, %tmp : (!pto.tile..., !pto.tile...) - !pto.tile...AS Level 2DPS 形式DPSDestructive Prefix Sum 风格的 in/out 分离形式使用ins/outs子句操作数类型为!pto.tile_buf...pto.trowprod ins(%src, %tmp : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)C 内建函数接口TROWPROD 的 C 内建函数声明位于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpptemplate typename TileDataOut, typename TileDataIn, typename TileDataTmp, typename... WaitEvents PTO_INST RecordEvent TROWPROD(TileDataOut dst, TileDataIn src, TileDataTmp tmp, WaitEvents ... events);接口设计要点返回值RecordEvent便于在异步流水线中与set_flag/wait_flag事件机制配合参见 docs/coding/Event.md变参WaitEvents ... events函数体内先调用detail::PtoWaitEvents(events...)等待依赖事件再通过MAP_INSTR_IMPL(TROWPROD, dst, src, tmp)分发到具体平台的TROWPROD_IMPL实现CPU、A2A3、A5 各有独立实现文件三个 Tile 操作数dst、src、tmp均需显式传入其中tmp的具体作用随平台而异见下文临时空间一节。约束条件与校验逻辑TROWPROD 的约束在编译期static_assert与运行期PTO_ASSERT两个层面执行且不同平台的检查实现相互独立。通用约束A2A3 / A5 共同综合源文档与 include/pto/npu/a2a3/TRowReduceOps.hpp、include/pto/npu/a5/TRowProd.hpp 中的检查代码可归纳为检查项约束内容检查方式Tile 位置dst与src必须均为TileType::Vec编译期static_assertsrc布局标准 ND 布局行主且非分形BLayout::RowMajor、SLayout::NoneBox编译期static_assertdst布局两种之一ND 布局BLayout::RowMajor、SLayout::NoneBox或列数严格为 1的 DN 布局BLayout::ColMajor、SLayout::NoneBox、Cols 1编译期static_assert元素类型dst与src的元素类型必须一致编译期static_assert有效区域src.GetValidRow() ! 0、src.GetValidCol() ! 0、src.GetValidRow() dst.GetValidRow()运行期PTO_ASSERTtmp操作数接口签名要求显式传入编译期其中运行期检查在 A2A3 实现中通过TRowReduceCheckTileDataOut, TileDataIn(validRow, validCol, dst.GetValidRow())完成行数在归约前后保持不变行数保留约束。若src有效行或有效列为 0将直接断言失败——TROWPROD 要求每行至少有一个元素。A2A3 实现检查A2A3Atlas A2/A3 训练及推理系列产品支持的元素类型为half、float、int32_t、int16_t由TRowReduceCheck中的static_assert强制。A5 实现检查A5Ascend 950PR / 950DT同样只支持half、float、int32_t、int16_t。当前实现路径中实际受约束的是src与dst没有额外要求tmp满足特定 shape/layout 约束——这与 A5 后端不使用tmp的实现策略一致。tmp 临时空间的平台差异A2A3 与 A5tmp是 TROWPROD 接口中存在感差异最大的操作数它在 A2A3 上是必需的累加缓冲区在 A5 上则是仅为 API 兼容而保留的占位符。A2A3tmp作为逐行累加器在 include/pto/npu/a2a3/TRowProd.hpp 的实现中tmp被实际使用其工作流程为初始化对每一行用vector_dup(tmpPtr, (T)1.0f, ...)将tmp该行初始化为1.0乘法单位元并插入pipe_barrier(PIPE_V)保证流水同步分块乘入按elemsPerRepeat REPEAT_BYTE / sizeof(T)划分 repeat 块先用vmul将 src 的连续块两两相乘写入tmp对应文档所述blocks of src data multiplied into tmp using vmul奇数块与剩余尾部repeatRemain通过掩码set_vector_mask处理树形归约进入归约循环不断执行vmul(tmpPtr, tmpPtr, tmpPtr elemsPerRepeat, ...)将tmp后半段折半乘入前半段直到收敛随后利用PtoSetWaitFlagPIPE_V, PIPE_S跨流水等待用标量乘如dstPtr[0] tmpPtr[0] * tmpPtr[1]完成最后的收尾并将结果写入dst对应行。其中elemsPerBlock BLOCK_BYTE_SIZE / sizeof(T)、elemsPerRepeat REPEAT_BYTE / sizeof(T)分别对应 block 与 repeat 的字节级常量定义于include/pto/common/constants.hpp这也解释了为何不同元素类型下归约的掩码步长elemsPerRepeat / 2、/4、/8…逐级减半。对于int32_t等 4 字节类型收尾阶段还额外处理了 block 跨界搬运逻辑。因此 A2A3 上tmp必须满足元素类型与src/dst相同尺寸下限至少 1 行、CeilDivision(TileDataIn::Cols / 2, REPEAT_BYTE_SIZE / sizeof(T))列安全默认将tmp声明为与src相同的形状即可如示例中的TmpT TileTileType::Vec, float, 16, 16。A5寄存器级树形归约tmp不使用在 include/pto/npu/a5/TRowProd.hpp 的实现中tmp被接口接受但不被使用。A5 后端在__VEC_SCOPE__的向量寄存器作用域内完成全部工作用vbr(dstReg, 1)将寄存器归约值初始化为1按elementsPerRepeat CCE_VL / sizeof(T)分 repeat用vlds(srcReg, src, ...)从 UB 加载每段数据vmul(dstReg, dstReg, srcReg, pReg, MODE_MERGING)逐段乘入寄存器末尾通过vintlvvector interleave将寄存器值拆成两半配合vmul反复执行树形归约nLoop次16 位类型与 32 位类型的循环次数由TROW_PROD_LOOP_B16/TROW_PROD_LOOP_B32区分最终以vsts(dstReg, dst, ..., oneElemMask, ...)按单元素掩码把每行的乘积存回 UB 的dst对应行。A5 全程无需暂存 Tile 存储tmp仅为了与 A2A3 的 C 接口保持 API 兼容而保留在签名中。这解释了为什么 A5 检查路径不强制tmp的 shape/layout——它根本不会访问该缓冲区。CPU同样忽略tmpCPU 仿真实现 include/pto/cpu/TRowProd.hpp 也接受tmp但以(void)tmp忽略直接用cpu::parallel_for_1d对每一行做循环连乘再按GetTileElementOffset将结果写回dst行首为 CPU 上的数值验证提供了参考实现。使用示例Auto 模式与 Manual 模式PTO 支持 Auto编译器/运行时管理资源与 Manual开发者显式绑定地址两种编程模式参见 docs/auto_mode/Auto_Mode_Overview.md 与 docs/coding/ProgrammingModel.md。Auto 模式#include pto/pto-inst.hpp using namespace pto; void example_auto() { using SrcT TileTileType::Vec, float, 16, 16; using DstT TileTileType::Vec, float, 16, 1, BLayout::ColMajor; using TmpT TileTileType::Vec, float, 16, 16; SrcT src; DstT dst; TmpT tmp; TROWPROD(dst, src, tmp); }要点SrcT使用默认的 ND 布局BLayout::RowMajorSLayout::NoneBox满足src布局约束DstT采用BLayout::ColMajor且Cols 1的 DN 布局恰好命中列数严格为 1 的 DN 布局这一合法分支——这是行归约输出的典型形状每行一个结果TmpT与src同形状满足 A2A3 的安全默认建议。Manual 模式Manual 模式下必须先用TASSIGN为每个 Tile 显式绑定 UB 地址再发起指令#include pto/pto-inst.hpp using namespace pto; void example_manual() { using SrcT TileTileType::Vec, float, 16, 16; using DstT TileTileType::Vec, float, 16, 1, BLayout::ColMajor; using TmpT TileTileType::Vec, float, 16, 16; SrcT src; DstT dst; TmpT tmp; TASSIGN(src, 0x1000); TASSIGN(dst, 0x2000); TASSIGN(tmp, 0x3000); TROWPROD(dst, src, tmp); }ASM 形式示例Auto 模式Auto 模式下资源的放置与调度交由编译器/运行时管理指令本身与 SSA 层一致# Auto 模式编译器/运行时管理的放置和调度。 %dst pto.trowprod %src, %tmp : (!pto.tile..., !pto.tile...) - !pto.tile...Manual 模式Manual 模式要求在发出指令前显式绑定资源pto.tassign对 Tile 操作数可选# Manual 模式在发出指令前显式绑定资源。 # Tile 操作数可选 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.trowprod %src, %tmp : (!pto.tile..., !pto.tile...) - !pto.tile...PTO 汇编形式%dst trowprod %src : !pto.tile... - !pto.tile... # AS Level 2 (DPS) pto.trowprod ins(%src, %tmp : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)测试验证覆盖矩阵与工程实践仓库中为 TROWPROD 提供了跨平台、跨类型的系统化测试是验证本文所述约束与语义的直接证据A2A3 ST 用例tests/npu/a2a3/src/st/testcase/trowprod/ 下的 trowprod_kernel.cpp 共 18 个 case覆盖floatCase 1–8、__fp16Case 9–10、int32_tCase 11–15、int16_tCase 16–18并专门覆盖了单行/多行如validRow取 1、2、3与行数小于物理行数的 valid-region 场景如 Case 10物理 26 行、有效 19 行非对齐的有效列数Case 4srcValidCol5Case 5srcValidCol11用于触发repeatRemain掩码分支与tmp尾部处理测试模板同时演示了完整的数据流TLOAD搬运输入 →set_flag/wait_flag(PIPE_MTE2, PIPE_V, ...)同步 →TROWPROD→set_flag/wait_flag(PIPE_V, PIPE_MTE3, ...)→TSTORE写回并给出三块 UB 的TASSIGN地址布局A5 ST 用例tests/npu/a5/src/st/testcase/trowprod/trowprod_kernel.cpp 同时覆盖 ND 输出与 DN 输出dstTileDataDN TileTileType::Vec, T, row, 1, BLayout::ColMajor, row, 1两种dst布局分支且其tmpTile与srcTile共用同一 Tile 类型——印证了 A5 路径不校验tmp形状的结论CPU 用例tests/cpu/st/testcase/trowprod/trowprod_kernel.cpp 提供float/half下的参考数值实现配合 gen_data.py 生成输入数据可在 CPU 仿真环境快速核对归约结果。此外CPU 与 NPU 的 ST 用例可通过仓库根目录的 tests/run_st.sh 与 tests/run_cpu_tests.sh 组织运行trowprod用例目录命名遵循 tests/validate_testcase_names.py 所检查的命名规范。小结TROWPROD 是 PTO 行归约指令族中语义直观逐行连乘但实现考究的一条指令它在汇编层经历了同步形式 → AS1(SSA) → AS2(DPS)的三级降级在 C 层通过RecordEvent 变参事件机制接入异步流水线tmp操作数在 A2A3 上承担逐行累加器的实质角色初始化 1.0 →vmul分块乘入 → 树形折半归约 → 标量收尾在 A5 上则由向量寄存器 vintlv树形归约完全替代仅保留占位以维持接口统一。编写 TROWPROD 代码时牢记三件事src用标准 ND 布局、dst用 ND 或单列 DN 布局、元素类型限制在half/float/int32_t/int16_t并把tmp声明为与src同形状即可安全覆盖两种平台路径。赞分享人工智能指令集算子库CANNAscend【免费下载链接】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点击查看免费下载相关推荐PTO-ISA TROWPROD 指令深度解析逐行乘积归约的语义、约束与跨平台实现PTO ISA TROWPROD 指令深度解析逐行乘积归约的语义、约束与跨平台实现 TROWPRODTile Row Product是 Ascend CA人工智能指令集算子库CANNAscendCANN PTO-ISA TCOLPROD 指令详解列归约乘积跨行乘积的语义、约束与源码实现CANN PTO ISA TCOLPROD 指令详解列归约乘积跨行乘积的语义、约束与源码实现 导读 TCOLPROD 是 Ascend CANN 并行 T人工智能指令集算子库CANNAscendCANN PTO 列归约指令 TCOLSUM 完全指南语义、汇编、C 接口与跨平台实现CANN PTO 列归约指令 TCOLSUM 完全指南语义、汇编、C 接口与跨平台实现 本篇技术指南以 CANN/PTOParallel Tile Op人工智能指令集算子库CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表