人工智能指令集算子库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点击查看免费下载TXORTile XOR是 CANN PTO-ISA 虚拟指令集中用于对两个 Tile 执行逐元素按位异或bitwise XOR的矢量指令常见于位掩码、奇偶校验、图像/编码类算子的 Tile 级实现中。本文以 docs/isa/TXOR.md 为主干结合 A2A3Atlas A2/A3 训练与推理系列与 A5Ascend 950PR/950DT两套 NPU 后端实现、CPU 仿真实现及 ST 测试用例完整讲解 TXOR 的数学语义、三级汇编语法、C 内建接口、类型与形状约束、临时空间差异并给出可直接落地的调用示例。指令示意图简介TXOR 完成两个 Tile 的逐元素按位异或Elementwise Bitwise XOR。与算术运算类指令如 TADD、TMUL不同TXOR 属于逻辑/位运算家族与 TAND、TOR、TNOT 等指令同族在 docs/menu/binary_logic_zh.md 中被归入逻辑运算菜单。它天然具备可逆性a ^ b ^ b a因此在异或加密、校验和计算、双缓冲数据交换等场景中具有独特价值也是仓库内核示例如tests/cpu/st/testcase/hashfind/hashfind_kernel.cpp中位运算类算子的基础构件。数学语义TXOR 对有效区域valid region内的每个元素(i, j)执行$$ \mathrm{dst}{i,j} \mathrm{src0}{i,j} \oplus \mathrm{src1}_{i,j} $$其中dst、src0、src1均为!pto.tile...类型的 Tile 操作数运算在整数位层面逐位进行某一位上两个输入同为0或同为1时结果位为0否则为1。注意异或^与逻辑或|在语义上不同1 ^ 1 0而1 | 1 1这也决定了 A2A3 后端在实现上不能直接复用 OR 指令而需要额外的组合逻辑详见下文临时空间一节。运算的迭代范围由输出 Tile 决定即dst.GetValidRow()/dst.GetValidCol()所界定的有效行、列区域src0、src1的有效形状必须与之完全一致见约束一节。汇编语法同步形式PTO 汇编%dst txor %src0, %src1 : !pto.tile...这是指令最直观的 SSA 形式两个输入 Tile 产生一个输出 Tile类型标注为!pto.tile...尖括号内为该指令支持的整数元素类型见约束。AS Level 1SSA%dst pto.txor %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...在 Level 1 层级指令以pto.txor命名操作数通过 SSA 值引用函数签名明确写出两个输入类型与一个输出类型。AS Level 2DPSpto.txor ins(%src0, %src1 : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)在 Level 2Data Placement Specification层级操作数显式区分为ins(...)输入区与outs(...)输出区且 Tile 类型变为带存储视图的!pto.tile_buf...反映了资源buffer已确定后的指令形态。三级语法从无资源约束的纯数据流逐步过渡到绑定具体 tile buffer 的指令发射完整规范可参考 docs/isa/conventions.md 及 docs/isa/README.md。C 内建接口TXOR 的 C 内建函数声明于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpptemplate typename TileDataDst, typename TileDataSrc0, typename TileDataSrc1, typename TileDataTmp, typename... WaitEvents PTO_INST RecordEvent TXOR(TileDataDst dst, TileDataSrc0 src0, TileDataSrc1 src1, TileDataTmp tmp, WaitEvents ... events);从声明可以看出几个要点四个模板 Tile 参数dst、src0、src1之外还要求一个tmp临时 Tile。tmp的存在是为了兼容 A2A3 后端的分解式实现见临时空间即使 A5 后端不使用它接口签名仍然保留以保证跨平台 API 一致。WaitEvents... events可变参数用于指令间的同步等待。在 include/pto/common/pto_instr.hpp 的实现中接口先调用detail::PtoWaitEvents(events...)等待前序事件再通过MAP_INSTR_IMPL(TXOR, dst, src0, src1, tmp)宏映射到具体平台A2A3/A5/CPU的TXOR_IMPL实现返回RecordEvent以便后续指令依赖。相关标量变体为TXORSTile XOR Scalar声明于同一文件include/pto/common/pto_instr.hpp签名多出一个标量操作数TXORS(dst, src0, scalar, tmp, ...)用于Tile 与标量逐元素异或的场景。约束TXOR 在不同平台上执行不同的实现检查Implementation Checks可分为 A5 与 A2A3 两套。通用约束运算迭代范围固定为dst.GetValidRow()/dst.GetValidCol()。实现检查A5Ascend 950PR / Ascend 950DTdst、src0、src1的元素类型必须一致。支持的元素类型为uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、int64_t、uint64_t。dst、src0、src1必须为行主序row-major。src0.GetValidRow()/GetValidCol()与src1.GetValidRow()/GetValidCol()必须与dst一致。上述检查在 include/pto/npu/a5/TXor.hpp 的TXorCheck中以static_assert类型、布局与PTO_ASSERT有效形状两种方式落地类型不符会直接编译报错Fix: TXOR has invalid data type.形状不符则在运行时断言Fix: TXOR input tile src0 valid shape mismatch with output tile dst shape.。实现检查A2A3Atlas A2/A3 训练系列产品 / Atlas A2/A3 推理系列产品dst、src0、src1、tmp的元素类型必须一致。支持的元素类型为uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t不含 64 位类型这是与 A5 的显著差异。dst、src0、src1、tmp必须为行主序。src0、src1、tmp的有效形状必须与dst一致。手动模式下dst、src0、src1、tmp的内存区域不得重叠。对应检查见 include/pto/npu/a2a3/TXor.hpp 的TXorCheck。其中内存不重叠检查被#ifndef __PTO_AUTO__宏包裹即在**自动模式Auto Mode下由编译器/运行时统一管理资源放置允许绕过该检查而在手动模式Manual Mode**下必须由开发者保证四个操作数指向互不重叠的内存dst.data() ! src0.data()等逐对断言。临时空间A2A3 与 A5 的关键差异TXOR 是接口统一、实现分化的典型tmp参数在不同平台上扮演完全不同的角色。A2A3tmp被用作中间暂存A2A3 硬件没有单条 XOR 向量指令因此 include/pto/npu/a2a3/TXor.hpp 通过分解式计算实现 XOR利用恒等式$$ \mathrm{XOR}(a,b) \mathrm{AND}(\mathrm{NOT}(\mathrm{AND}(a,b)),\ \mathrm{OR}(a,b)) $$具体执行序列为TOR_IMPL(tmp, src0, src1); // tmp src0 | src1 pipe_barrier(PIPE_V); // 矢量流水线屏障 TAND_IMPL(dst, src0, src1); // dst src0 src1 pipe_barrier(PIPE_V); TNOT_IMPL(dst, dst); // dst NOT(dst) pipe_barrier(PIPE_V); TAND_IMPL(dst, dst, tmp); // dst dst tmp即先用TOR_IMPL把中间结果OR(a, b)暂存到tmp再用TAND_IMPL、TNOT_IMPL、TAND_IMPL组合出最终结果每一步之间通过pipe_barrier(PIPE_V)保证矢量流水线PIPE_V上的读写顺序。因此 A2A3 对tmp的要求是tmp元素类型与dst/src0/src1相同tmp必须为行主序tmp有效形状与dst一致tmp.GetValidRow() dst.GetValidRow()且tmp.GetValidCol() dst.GetValidCol()手动模式下tmp不得与dst、src0、src1内存重叠。A5tmp被接受但未使用A5 后端拥有原生vxor向量指令include/pto/npu/a5/TXor.hpp 中的XorOp::BinInstr直接将vxor映射为底层指令无需暂存 Tile对于 64 位元素int64_t/uint64_t走Int64BinaryInt64Op::Xor, ...专门路径其余类型走BinaryInstrXorOpT, ...通用二元指令路径elementsPerRepeat CCE_VL / sizeof(T)、blockSizeElem BLOCK_BYTE_SIZE / sizeof(T)由元素位宽自动推导。因此 A5 上tmp不被使用仅为了与 A2A3 保持 API 兼容而保留在接口签名中——调用时传一个与dst同形状的 Tile 即可其内容不会被读写。CPU 仿真实现同样忽略tmpinclude/pto/cpu/ElementTileOp.h 中(void)tmp;后直接调用BinaryElementTileOp_ImplElementOp::OP_XOR完成逐元素异或保证三端A2A3/A5/CPU行为一致。使用示例以下示例来自 docs/isa/TXOR.md演示如何用 C 内建接口在 16×16 的uint32_t矢量 Tile 上执行逐元素异或#include pto/pto-inst.hpp using namespace pto; void example() { using TileDst TileTileType::Vec, uint32_t, 16, 16; using TileSrc0 TileTileType::Vec, uint32_t, 16, 16; using TileSrc1 TileTileType::Vec, uint32_t, 16, 16; using TileTmp TileTileType::Vec, uint32_t, 16, 16; TileDst dst; TileSrc0 src0; TileSrc1 src1; TileTmp tmp; TXOR(dst, src0, src1, tmp); }关键点四个 Tile 的元素类型必须统一此处均为uint32_t否则触发 A5/A2A3 实现的static_assert编译错误TileTileType::Vec, ...表示矢量VectorTile16, 16为形状参数若需要跨指令调度可将TXOR返回的RecordEvent作为WaitEvents传入后续指令。ASM 形式示例自动模式Auto Mode自动模式下Tile 的物理资源放置与指令调度由编译器/运行时统一管理开发者只需描述数据流# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.txor %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...手动模式Manual Mode手动模式下资源必须先显式绑定通过pto.tassign将 SSA 值分配到指定 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.txor %src0, %src1 : (!pto.tile..., !pto.tile...) - !pto.tile...手动模式下必须自行保证dst/src0/src1以及 A2A3 上的tmp分配到互不重叠的内存否则会触发上文所述的运行时断言。PTO 汇编形式%dst txor %src0, %src1 : !pto.tile... # AS Level 2 (DPS) pto.txor ins(%src0, %src1 : !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)测试与验证仓库为 TXOR 提供了完整的跨平台 STSystem Test覆盖可用于验证本文所述语义与约束NPU 测试tests/npu/a2a3/src/st/testcase/txor/、tests/npu/a5/src/st/testcase/txor/、tests/npu/kirin9030/src/st/testcase/txor/、tests/npu/kirinDev0000/src/st/testcase/txor/各目录均含main.cppgtest 用例、txor_kernel.cpp算子内核与gen_data.py数据生成脚本CPU 测试tests/cpu/st/testcase/txor/提供 CPU 仿真侧的对照用例标量变体 TXORStests/npu/a2a3/src/st/testcase/txors/、tests/npu/a5/src/st/testcase/txors/等目录覆盖 Tile 与标量异或。以 tests/npu/a2a3/src/st/testcase/txor/main.cpp 为例测试通过test_txorT, dstTileH, dstTileW, src0TileH, src0TileW, src1TileH, src1TileW, vRows, vCols模板驱动先经 ACL 接口初始化设备与流aclInit/aclrtCreateStream读取input1.bin/input2.bin作为src0/src1发射 TXOR 内核后将输出写回并与golden.bin金标准逐元素比对ResultCmpT(golden, devFinal, 0.001f)。用例覆盖int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t六种类型并包含源 Tile 与目标 Tile 形状不同如src1为 32×256 而dst为 32×128以及非对齐列宽 127等边界场景用于验证有效区域valid region语义与形状约束断言。总结TXOR 是 PTO-ISA 逻辑运算指令族中语义最简单、但跨平台实现差异最典型的指令之一语义dst src0 ^ src1逐元素按位异或迭代范围由dst的有效区域决定语法从txor汇编形式、pto.txorSSALevel 1到ins/outsDPSLevel 2三级递进平台差异A5 直接使用原生vxor支持 8/16/32/64 位A2A3 通过AND(NOT(AND), OR)分解实现仅支持 8/16/32 位并需要tmp暂存中间结果CPU 仿真通过ElementOp::OP_XOR保持一致行为约束类型统一、行主序、形状对齐是硬性要求手动模式下 A2A3 还要求四个操作数内存互不重叠。理解这些约束与平台差异是编写可在 A2A3 与 A5 之间无缝迁移的位运算内核的前提。进一步可阅读 docs/isa/TXOR.md 英文原档、docs/isa/TAND.md 与 docs/isa/TOR.md 姊妹指令文档以及 docs/isa/conventions.md 中的通用约定。赞分享人工智能指令集算子库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 TXOR 指令详解Tile 逐元素按位异或的跨平台实现与约束PTO ISA TXOR 指令详解Tile 逐元素按位异或的跨平台实现与约束 TXORTile XOR是 CANN PTOParallel Tile O人工智能指令集算子库CANNAscendCANN PTO-ISA TRELU 指令详解Tile 逐元素 ReLU 的数学语义、汇编语法与跨平台实现CANN PTO ISA TRELU 指令详解Tile 逐元素 ReLU 的数学语义、汇编语法与跨平台实现 导读 本文围绕 CANN pto isa 开源仓库人工智能指令集算子库CANNAscendCANN pto-isa TXORS 指令详解Tile 与标量逐元素按位异或的跨平台实现CANN pto isa TXORS 指令详解Tile 与标量逐元素按位异或的跨平台实现 导读 本文深入解析 CANN pto isaParallel Ti人工智能指令集算子库CANNAscend上一篇一张消费级4090跑Qwen3-Coder-480B-A35B-Instruct这份极限“抠门”的量化与显存优化指南请收好下一篇从语法解析到实战修复DTStack/dt-sql-parser中FlinkSQL JSON_VALUE函数解析问题深度剖析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
