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

CANN PTO-ISA TNOT 指令深度解析:Tile 逐元素按位取反的语义、汇编形式与向量单元实现

CANN PTO-ISA TNOT 指令深度解析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-isaTNOT 是 CANN PTOParallel Tile Operation虚拟指令集中用于对 Tile 执行逐元素按位取反bitwise NOT的向量一元指令覆盖 Atlas A2/A3 与 Ascend 950 系列产品是搭建逻辑运算内核如掩码翻转、与TXOR/TAND/TOR组合的标量逻辑运算的基础构件。本文以 docs/isa/TNOT_zh.md 为主线结合include/pto下的源码实现与tests中的 ST 用例完整讲解该指令的数学语义、三层汇编语法、C 内建接口、平台约束以及底层向量指令映射读完即可独立编写与验证基于 TNOT 的算子内核。指令定位与数学语义TNOT 是 PTO 指令集中典型的逐元素elementwise一元按位逻辑指令对 Tile 有效区域内的每个元素执行按位取反~输出与输入具有完全相同的形状、数据类型与内存布局。对有效区域内的每个元素(i, j)其数学语义可表示为$$ \mathrm{dst}{i,j} \sim\mathrm{src}{i,j} $$即 dst 中每个二进制位均为 src 对应位的逻辑反0 变 1、1 变 0。由于是按位运算而非算术运算TNOT不感知符号位与数值大小因此同时适用于有符号整型与无符号整型浮点类型不在约束范围内。从源码结构看TNOT 在 include/pto/common/pto_instr.hpp 中与TRELU、TGATHERB、TEXP等指令并列声明归属于向量VectorTileType::Vec一元运算族在指令文档分类上它属于docs/menu中的一元逻辑运算集合常与TAND、TOR、TXOR、TNOT组成完整的按位逻辑指令族。汇编语法与三层抽象PTO 的指令描述分三个层级TNOT 在每一层都有对应的语法形式从最高层的同步助记符到最低层的 DPSData Parallel Semantics形式逐层细化。同步形式最高层助记符%dst tnot %src : !pto.tile...这是最简洁的抽象写法隐藏了资源放置与调度细节由编译器/运行时负责推导。AS Level 1SSA 形式%dst pto.tnot %src : !pto.tile... - !pto.tile...显式给出输入与输出的!pto.tile...类型含 shape 与 dtype 参数符合 SSA 静态单赋值形式便于编译优化与验证。AS Level 2DPS 形式pto.tnot ins(%src : !pto.tile_buf...) outs(%dst : !pto.tile_buf...)在 DPS 层操作数由 SSA 值降级为显式的 tile buffer!pto.tile_buf...ins(...)/outs(...)明确区分输入与输出缓冲区对应底层硬件上的内存操作视图。自动模式与手动模式的 ASM 示例自动模式下编译器/运行时负责资源放置与调度直接发射指令即可# 自动模式由编译器/运行时负责资源放置与调度。 %dst pto.tnot %src : !pto.tile... - !pto.tile...手动模式下需先显式绑定资源tile 地址再发射指令# 手动模式先显式绑定资源再发射指令。 # 可选当该指令包含 tile 操作数时 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.tnot %src : !pto.tile... - !pto.tile...手动模式中的pto.tassign %arg, tile(0x...)用于将 tile 值绑定到具体的片上 buffer 地址如 UB 空间偏移是内核开发者精细控制数据放置的关键手段这一模式与仓库中手动算子示例如 kernels/manual 下的实现保持一致。PTO 汇编形式的完整组合%dst tnot %src : !pto.tile... # AS Level 2 (DPS) pto.tnot ins(%src : !pto.tile_buf...) outs(%dst : !pto.tile_buf...)C 内建接口TNOT 以模板函数形式暴露给算子开发者声明位于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpp内部声明位于pto/common/pto_instr.hpptemplate typename TileDataDst, typename TileDataSrc, typename... WaitEvents PTO_INST RecordEvent TNOT(TileDataDst dst, TileDataSrc src, WaitEvents ... events);接口要点返回RecordEvent所有 PTO 指令统一返回RecordEvent类型配合WaitEvents参数实现事件同步可变参数WaitEvents... events调用TNOT前可通过该参数等待其他指令完成函数体内会先执行detail::PtoWaitEvents(events...)再通过MAP_INSTR_IMPL(TNOT, dst, src)分发到具体平台的TNOT_IMPL实现见 include/pto/common/pto_instr.hppdst 与 src 类型参数独立TileDataDst/TileDataSrc允许编译器在编译期对数据类型、布局、位置做静态约束检查。一个最小可编译示例来自 docs/isa/TNOT_zh.md#include pto/pto-inst.hpp using namespace pto; void example() { using TileT TileTileType::Vec, uint16_t, 16, 16; TileT x, out; TNOT(out, x); }TileTileType::Vec, uint16_t, 16, 16声明了一个位于向量单元Vec、元素类型为uint16_t、16 行 × 16 列的 tileTNOT(out, x)将x逐元素按位取反写入out。约束与有效区域TNOT 在不同硬件平台上存在差异化的实现检查约束二者共同点是要求行主序布局、向量位置、静态有效边界合法且运行时src/dst的validRow/validCol一致。实现检查Atlas A2/A3 训练系列产品 / Atlas A2/A3 推理系列产品TileData::DType必须是以下之一int16_t、uint16_t、uint32_t、int32_t、int8_t、uint8_tTile 布局必须是行主序TileData::isRowMajorTile 位置必须是向量TileData::Loc TileType::Vec静态有效边界TileData::ValidRow TileData::Rows且TileData::ValidCol TileData::Cols运行时src与dsttile 应具有相同的validRow/validCol。对应 A2/A3 平台的源码实现在 include/pto/npu/a2a3/TUnaryOp.hpp通过TUNARY_IMPL的模板参数false, true控制检查行为并在发射vnot前按元素位宽选择数据类型转换策略详见下文实现解析。实现检查Ascend 950PR / Ascend 950DTTileData::DType必须是以下之一uint32_t、int32_t、int64_t、uint64_t、uint16_t、int16_t、uint8_t、int8_t相比 A2/A3 额外支持int64_t/uint64_tTile 布局必须是行主序TileData::isRowMajorTile 位置必须是向量TileData::Loc TileType::Vec静态有效边界TileData::ValidRow TileData::Rows且TileData::ValidCol TileData::Cols运行时src与dsttile 应具有相同的validRow/validCol。Ascend 950 系列A5的实现在 include/pto/npu/a5/TUnaryOp.hpp先用TUnaryCheckDstTile, SrcTile, false()做通用一元检查再以static_assert在编译期锁定 8 种允许的数据类型运行时通过PTO_ASSERT校验dst/src的行、列有效数一致最后按类型分派到TNot内核发射。有效区域迭代域该操作使用dst.GetValidRow()/dst.GetValidCol()作为迭代域src/dst假定是兼容的此操作中不通过显式运行时检查进行验证。也就是说只有validRow × validCol覆盖的区域会被真实计算超出有效区域的部分不保证结果因此在调用前应确保src/dst有效边界设置正确且一致。源码级实现解析A2/A3vnot 指令 位宽转换A2/A3 平台的TNOT_IMPLinclude/pto/npu/a2a3/TUnaryOp.hpp定义如下template typename DstTile, typename SrcTile PTO_INTERNAL void TNOT_IMPL(DstTile dst, SrcTile src) { using TOrig typename DstTile::DType; using TRANS std::conditional_tsizeof(TOrig) sizeof(uint32_t), B322B16TraitTOrig, B82B16TraitTOrig; TUNARY_IMPLNotOptypename TRANS::TransType, DstTile, SrcTile, false, true(dst, src); }底层NotOp::UnaryInstr最终映射到向量指令vnot(dst, src, repeat, 1, 1, dstStride, srcStride)repeat由有效区域与 repeat 粒度推导dstStride/srcStride控制 block 间步长。由于底层vnot以 16 位为基本处理宽度实现对 8/32 位数据通过B82B16Trait/B322B16Trait做位宽适配转换这也是 A2/A3 支持 6 种整型的原因。A5Int64 特化路径Ascend 950 系列的TNOT_IMPLinclude/pto/npu/a5/TUnaryOp.hpp在发射前通过if constexpr区分路径if constexpr (std::is_same_vT, int64_t || std::is_same_vT, uint64_t) { Int64UnaryInt64Op::Not, T, DstTile::Cols, SrcTile::Cols(dst, src, validRow, validCol); } else { TUnaryOpDstTile, SrcTile, NotOpT(dst, src, validRow, validCol, version); }64 位元素走Int64Unary特化路径A5 新增能力其余 8/16/32 位类型走通用TUnaryOp因此 A5 在约束中额外放开了int64_t/uint64_t。TNOT 作为上层指令的构件TNOT 不仅是独立指令还作为更复杂指令的内部构件。例如 A2/A3 的TXORS_IMPL标量异或include/pto/npu/a2a3/TBitwiseSOp.hpp在实现中依次调用TORS_IMPL、TANDS_IMPL、TNOT_IMPL、TAND_IMPL完成dst (src | scalar) ~src tmp的组合逻辑且各步骤之间通过pipe_barrier(PIPE_V)保证向量流水顺序。可见掌握 TNOT 有助于理解 PTO 逻辑运算族的组合实现方式。测试验证与实战参考仓库为 TNOT 提供了跨平台、跨类型的完整 STSoftware Test用例是验证内核行为最直接的参考NPU A2/A3tests/npu/a2a3/src/st/testcase/tnot/ 下的tnot_kernel.cpp使用TASSIGN手动绑定 tile 地址srcTile绑到0x0 0x400 * block_idxdstTile绑到0x4000 0x400 * block_idx通过set_flag/wait_flag完成 MTE2→V→MTE3 流水同步覆盖int16_t、uint16_t、int8_t、uint8_t、int32_t、uint32_t六种类型tnot_kernel.cpp 模板实例化清单NPU A5tests/npu/a5/src/st/testcase/tnot/ 覆盖 A5 的 8 种整型集合其他平台tests/npu/kirin9030/src/st/testcase/tnot/、tests/npu/kirinDev0000/src/st/testcase/tnot/ 提供了 Kirin 系列验证CPU 仿真tests/cpu/st/testcase/tnot/ 提供 CPU 侧 golden 仿真实现用于无硬件环境下验证语义正确性可通过 tests/run_st.sh 统一驱动。测试数据由各用例目录下的gen_data.py生成main.cpp基于 gtest 将内核输出与 golden 数据逐元素比对。上述用例同时展示了“TLOAD →流水同步→ TNOT →流水同步→ TSTORE”的典型向量算子骨架可直接作为编写 TNOT 内核的模板。小结TNOT 是 PTO 指令集中语义最简洁的按位逻辑指令之一一条数学公式dst ~src、三层汇编视图同步助记符 / AS L1 SSA / AS L2 DPS、一个统一的 C 内建接口以及因平台而异的类型集合A2/A3 支持 6 种整型A5 额外支持 64 位整型。理解其约束行主序、TileType::Vec、有效区域迭代域与底层实现A2/A3 的vnot位宽适配、A5 的Int64Unary特化即可在自动/手动两种模式下安全地组合使用配合 tests 中的跨平台用例完成内核验证。【免费下载链接】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 小时内出具建站方案 · 河南本地可上门