拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PTO-ISA 位运算指令 TOR 详解:Tile 逐元素按位或的原理、语法与实战

PTO-ISA 位运算指令 TOR 详解Tile 逐元素按位或的原理、语法与实战【免费下载链接】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-isaTORTile OR是 CANN pto-isa 虚拟指令集中的二进制位逻辑指令对两个 Tile 逐元素执行按位或bitwise OR输出结果 Tile。本文以 docs/isa/TOR.md 为骨架结合 include/pto/npu/a2a3/TOr.hpp、include/pto/npu/a5/TOr.hpp 及 tests/cpu/st/testcase/tor 中的实现与测试用例完整讲解 TOR 的数学语义、三种汇编形式、C 内建接口、平台约束与约束检查机制并给出可直接编译运行的 kernel 示例。读者读完可掌握在 Ascend 多平台Atlas A2/A3 系列、Ascend 950 系列上正确使用 TOR 进行整型掩码/标志位运算的方法并能依据约束条件写出健壮代码。图TOR 指令操作示意两个输入 Tile 逐元素按位或输出到目标 Tile。1. 指令定位与适用场景TOR 属于 pto-isa 的**二进制逻辑运算binary logic**指令家族与之同族的还有逐元素按位与 TAND见 docs/isa/TAND.md、按位异或 TXOR见 docs/isa/TXOR.md以及带标量操作数的 TORS见 docs/isa/TORS.md。这些指令在整型 Tile 数据上执行逐位逻辑操作常见于位掩码bitmask的合并与累加标志位flag的置位与组合整型数据按位处理的向量化算子如图像/视频编解码、哈希与校验类 kernel。从源码看TOR 与 TAND、TXOR 等共享同一套模板化二元操作框架include/pto/npu/a2a3/TOr.hpp定义了OrOp结构体通过BinInstr封装底层向量指令A5 平台实现位于 include/pto/npu/a5/TOr.hpp同样以OrOp形式复用TBinOp.hpp的BinaryInstr派发逻辑。2. 数学语义TOR 对两个输入 Tilesrc0与src1在有效区域valid region内逐元素执行按位或。设有效区域内的任一元素位置为(i, j)则有$$ \mathrm{dst}{i,j} \mathrm{src0}{i,j} ;|; \mathrm{src1}_{i,j} $$即结果 Tile 的每个元素是两个输入对应元素的按位或。运算规则符合标准位运算真值表1 | 1 1、1 | 0 1、0 | 1 1、0 | 0 0。由于是位级操作它天然适用于所有整数类型的 Tile不涉及浮点语义。有效区域Valid RegionTOR 的迭代域由dst的有效行/列数决定即dst.GetValidRow() / dst.GetValidCol()。这意味着输出 Tile 的有效形状是运算的基准两个输入 Tile 的有效形状必须与之完全一致详见第 4 节约束。这也符合 pto-isa 中 Tile 携带形状 有效区域双元信息的设计——GetValidRow()/GetValidCol()才是实际参与运算的元素范围而非 Tile 的物理分配大小。3. 汇编语法TOR 在汇编层面提供同步形式、AS Level 1SSA与 AS Level 2DPS三种表达方式分别面向不同抽象层级。3.1 同步形式PTO 汇编最简形式直接以指令助记符tor出现dst为输出src0、src1为输入%dst tor %src0, %src1 : !pto.tile...3.2 AS Level 1SSA 形式带pto.前缀、显式声明函数类型的 SSA 形式%dst pto.tor %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...此形式中!pto.tile...是虚拟 Tile 类型携带元素类型与形状信息指令以 SSA 值语义出现便于编译器分析数据依赖。3.3 AS Level 2DPS 形式DPSData Parallel Semantics形式显式区分输入/输出操作数并改用缓冲区类型!pto.tile_buf...pto.tor ins(%src0, %src1 : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)ins(...)与outs(...)分别标注只读输入与可写输出为调度器提供更明确的资源归属信息。4. C 内建接口TOR 的 C 内建函数声明于公共头文件 include/pto/common/pto_instr.hpp开发者在代码中通过公共包含头pto/pto-inst.hpp引入template typename TileData, typename... WaitEvents PTO_INST RecordEvent TOR(TileData dst, TileData src0, TileData src1, WaitEvents ... events);接口要点参数dst为输出 Tilesrc0、src1为输入 Tile三者均按引用传递变参WaitEvents ... events用于事件同步Event 机制参见 docs/coding/Event.md可传入零个或多个事件指令发射后返回RecordEvent支持异步流水编排不传事件时即为同步使用宏派发接口内部通过MAP_INSTR_IMPL(TOR, dst, src0, src1)路由到平台相关实现TOR_IMPLinclude/pto/common/pto_instr.hpp平台实现Atlas A2/A3 系列走 include/pto/npu/a2a3/TOr.hppAscend 950 系列PR/DT走 include/pto/npu/a5/TOr.hppCPU 仿真路径对应 include/pto/cpu/TBinSOps.hpp 等二元操作实现。4.1 最小使用示例原文档示例直接构造 Vec 类型 Tile 并调用 TOR#include pto/pto-inst.hpp using namespace pto; void example() { using TileT TileTileType::Vec, int32_t, 16, 16; TileT a, b, out; TOR(out, a, b); }TileTileType::Vec, int32_t, 16, 16表示 16 行 × 16 列的向量 Tile元素类型为int32_t。该示例中a、b已假定通过 TLOAD 等指令装载数据。5. 约束条件与检查机制TOR 的约束分为编译期静态检查static_assert与运行时断言PTO_ASSERT并在不同平台上有差异化的类型支持。5.1 平台差异支持的元素类型平台支持元素类型Atlas A2/A3 系列训练/推理uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_tAscend 950PR / 950DT上表全部类型另加int64_t、uint64_t对应源码事实A2A3 实现中TOr依据元素宽度选择B322B16Trait或B82B16Trait做数据变换include/pto/npu/a2a3/TOr.hppA5 实现则通过static_assert(sizeof(T) 8 || 4 || 2 || 1)约束类型宽度并对int64_t/uint64_t走专门的Int64BinaryInt64Op::Or, ...路径include/pto/npu/a5/TOr.hpp普通宽度类型走OrOpBinaryInstr向量化路径。可以推断64 位整型支持是 A5 平台相对 A2A3 的能力扩展。5.2 通用约束两平台一致类型一致dst、src0、src1必须使用相同的元素类型。源码中的静态断言为Fix: TOR the data type of dst must be consistent with of src0 and src1.A2A3 版/Fix: TOR input tile src0, src1 and dst tile data type mismatch.A5 版。行主序三个 Tile 必须均为行主序RowMajor静态断言信息为 Fix: TOR only support row major layout.。有效形状一致运行时src0.GetValidRow()/GetValidCol()与src1.GetValidRow()/GetValidCol()必须与dst完全一致否则触发PTO_ASSERT提示 TOR input tile src0/src1 valid shape mismatch with output tile dst shape.。迭代域以dst的有效行/列作为实际计算范围。5.3 底层指令映射A2A3OrOp::BinInstr调用昇腾向量指令vor(dst, src0, src1, repeats, 1, 1, 1, dstRepeatStride, src0RepeatStride, src1RepeatStride)即一次repeats次重复、支持各操作数独立 repeat 步长的向量或运算include/pto/npu/a2a3/TOr.hpp。当三个 Tile 行步长一致时走快速路径BinaryInstrOrOpT, T, TileDataDst, elementsPerRepeat, blockSizeElem, dstRowStride否则走通用分步长路径。A5OrOp将寄存器按位宽规整为uint8_t/uint16_t/uint32_t视图后调用vor(dstReg, src0Reg, src1Reg, pReg)其中pReg为掩码寄存器MaskReg用于表达有效列范围内的屏蔽include/pto/npu/a5/TOr.hpp。6. 汇编形式示例自动模式与手动模式TOR 在 Auto Mode 与 Manual Mode 下均有对应汇编表达二者区别在于资源绑定职责的归属。6.1 Auto Mode自动模式编译器/运行时负责 Tile 资源的放置与调度指令直接以 SSA 形式出现# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.tor %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...6.2 Manual Mode手动模式资源必须由开发者显式绑定后再发射指令。可用pto.tassign将操作数绑定到指定 tile 地址可选当指令包含 tile 操作数时# Manual mode: resources must be bound explicitly before issuing the instruction. # Optional for tile operands: # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.tor %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...6.3 PTO 汇编完整形式将同步形式与 DPS 形式并列展示%dst tor %src0, %src1 : !pto.tile... # AS Level 2 (DPS) pto.tor ins(%src0, %src1 : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)7. 实战完整 Kernel 与测试验证TOR 在实际 kernel 中通常与 TLOAD/TSTORE/TASSIGN 组合使用先加载全局数据到 Tile执行 TOR再写回全局内存。仓库测试 tests/cpu/st/testcase/tor/tor_kernel.cpp 给出了完整流程#include pto/pto-inst.hpp #include pto/common/constants.hpp using namespace pto; template typename T, int kGRows_, int kGCols_, int kTRows_, int kTCols_ AICORE void runTOr(__gm__ T __out__* out, __gm__ T __in__* src0, __gm__ T __in__* src1) { using DynShapeDim5 Shape1, 1, 1, kGRows_, kGCols_; using DynStridDim5 Stride1, 1, 1, kGCols_, 1; using GlobalData GlobalTensorT, DynShapeDim5, DynStridDim5; using TileData TileTileType::Vec, T, kTRows_, kTCols_, BLayout::RowMajor, -1, -1; TileData src0Tile(kTRows_, kTCols_); TileData src1Tile(kTRows_, kTCols_); TileData dstTile(kTRows_, kTCols_); GlobalData src0Global(src0); GlobalData src1Global(src1); GlobalData dstGlobal(out); TASSIGN(src0Tile, 0); TASSIGN(src1Tile, kTRows_ * kTCols_ * sizeof(typename TileData::DType)); TASSIGN(dstTile, 2 * kTRows_ * kTCols_ * sizeof(typename TileData::DType)); TLOAD(src0Tile, src0Global); TLOAD(src1Tile, src1Global); TOR(dstTile, src0Tile, src1Tile); TSTORE(dstGlobal, dstTile); out dstGlobal.data(); }代码要点Tile 类型使用TileTileType::Vec, T, kTRows_, kTCols_, BLayout::RowMajor, -1, -1其中RowMajor显式满足 TOR 的行主序约束-1表示动态行/列步长TASSIGN 手动分配三个 Tile 在统一缓冲区UB内以不同偏移错开分配0、kTRows_*kTCols_*sizeof(T)、2*...对应第 6.2 节 Manual Mode 的资源绑定思想数据流TLOAD载入两个输入 →TOR计算 →TSTORE写回全局构成完整的最小可运行 kernel。7.1 测试用例与黄金数据比对对应测试 tests/cpu/st/testcase/tor/main.cpp 通过 ACL 运行时申请设备内存、读取input1.bin/input2.bin作为输入运行 kernel 后写出output.bin再与golden.bin逐元素比对ResultCmpT(golden, devFinal, 0.001f)。覆盖用例包括用例名元素类型全局形状Tile 形状case_int16_64x64_64x64_64x64int16_t64×6464×64case_int32_16x256_16x256_16x256int32_t16×25616×256case_int32_64x64_64x64_64x64int32_t64×6464×64case_int32_77x96_77x96_77x96int32_t77×9677×96case_int32_32x32_32x32_32x32int32_t32×3232×32case_uint32_64x64_64x64_64x64uint32_t64×6464×64case_uint32_16x32_16x32_16x32uint32_t16×3216×32case_uint32_77x96_77x96_77x96uint32_t77×9677×96case_uint32_32x64_32x64_32x64uint32_t32×6432×64用例特意覆盖 77×96、16×32 等非对齐/非整块形状用于验证有效区域valid region机制在非均匀 Tile 下的正确性。CPU 仿真侧可通过 tests/run_cpu_tests.sh 等脚本运行同类用例。8. 常见错误与排查建议基于源码中的静态断言与运行时断言信息整理 TOR 使用时的常见错误类型不一致三个操作数元素类型不同。编译期报 data type of dst must be consistent with of src0 and src1需统一为同一整数类型。非行主序任一操作数使用非 RowMajor 布局。编译期报 TOR only support row major layout.改用BLayout::RowMajor构造 Tile。有效形状不匹配src0或src1的GetValidRow()/GetValidCol()与dst不一致。运行时触发PTO_ASSERT报 valid shape mismatch需保证三者有效区域相同。越界访问由于迭代域取自dst若dst有效区域大于输入实际装载区域可能读取到未初始化数据务必保证输入 Tile 有效区域覆盖输出所需范围。平台类型限制在 Atlas A2/A3 系列上使用 64 位整型int64_t/uint64_t会触发类型宽度断言该能力仅在 Ascend 950 系列PR/DT上支持。9. 相关资源指令文档docs/isa/TOR.md英文、docs/isa/TOR_zh.md中文、示意图 docs/figures/isa/TOR.svg同族逻辑指令TANDdocs/isa/TAND.md、TXORdocs/isa/TXOR.md、TNOTdocs/isa/TNOT.md、标量版 TORSdocs/isa/TORS.md公共内建接口include/pto/common/pto_instr.hppTOR 接口见 L720-L723平台实现include/pto/npu/a2a3/TOr.hpp、include/pto/npu/a5/TOr.hpp测试用例tests/cpu/st/testcase/tor/main.cpp、tests/cpu/st/testcase/tor/tor_kernel.cpp背景知识PTO 指令集总览 docs/PTOISA_zh.mdTile 与事件同步机制见 docs/coding/Tile.md、docs/coding/Event.md【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门