PTO ISA TCMP 指令详解:Tile 逐元素比较与谓词掩码打包
PTO ISA TCMP 指令详解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-isaTCMP 是 CANN pto-isa 虚拟指令集Parallel Tile Operation面向昇腾平台的 Tile 级虚拟 ISA中用于逐元素比较两个 Tile 并将结果打包为谓词掩码的核心指令广泛服务于算子开发中的条件筛选、数据对齐检查、Mask 生成等场景。本文以 docs/isa/TCMP_zh.md 为主体结合仓库内 A2/A3、A5 平台的底层实现与 CPU 仿真代码及 ST 测试用例系统讲解 TCMP 的数学语义、汇编语法、C 内建接口、平台约束、掩码编码规则与实战用法读完即可在 Auto / Manual 两种模式下正确使用 TCMP 并理解其指令级行为。指令概述与数学语义TCMP 将两个 Tilesrc0、src1在有效区域valid region内按元素逐一比较并把每个位置的比较结果写成一个打包的**谓词掩码predicate mask**存入目标 Tiledst。概念上对于有效区域中的每个元素(i, j)定义谓词$$ p_{i,j} \left(\mathrm{src0}{i,j}\ \mathrm{cmpMode}\ \mathrm{src1}{i,j}\right) $$其中cmpMode为比较模式。谓词掩码使用实现定义的打包布局存储在dst中——即多个布尔比较结果被按位压缩进uint8_t或uint32_t字节流而非每个结果占用一个独立元素因此 TCMP 天然具备极高的掩码生成密度与带宽效率。比较模式由CmpMode枚举定义声明于 include/pto/common/type.hppenum class CmpMode : uint8_t { EQ 0, // 等于 NE 1, // 不等于 LT 2, // 小于 LE 3, // 小于等于 GT 4, // 大于 GE 5, // 大于等于 };同一枚举同时驱动 A2/A3、A5 的 NPU 后端与 CPU 仿真后端保证跨平台语义一致。汇编语法TCMP 提供同步形式的 PTO 汇编以及 AS Level 1SSA与 AS Level 2DPS两档抽象层级。同步形式%dst tcmp %src0, %src1 {cmpMode #pto.cmpEQ} : !pto.tile... - !pto.tile...AS Level 1SSA%dst pto.tcmp %src0, %src1{cmpMode #ptocmp xx}: (!pto.tile..., !pto.tile...) - !pto.tile...SSA 形式下%dst为新建 SSA 值资源放置与调度交由编译器/运行时完成。AS Level 2DPSpto.tcmp ins(%src0, %src1{cmpMode #ptocmp xx}: !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)DPSData Parallel Semantics形式显式声明ins(...)输入与outs(...)输出操作对象为!pto.tile_buf...物理缓冲区。PTO 汇编形式%dst tcmp %src0, %src1 {cmpMode #pto.cmpEQ} : !pto.tile... - !pto.tile... # AS Level 2 (DPS) pto.tcmp ins(%src0, %src1{cmpMode #ptocmp xx}: !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)汇编中的#pto.cmp...与#ptocmp xx即对应 C 侧CmpMode枚举EQ/NE/LT/LE/GT/GE两种书写风格分别用于 PTO 汇编与 MLIR 方言文本表示。C 内建接口TCMP 的 C 内建函数声明于 include/pto/common/pto_instr.hpp类型定义位于 include/pto/common/type.hpp。公共包含头为pto/pto-inst.hpp内部声明位于pto/common/pto_instr.hpp。template typename TileDataDst, typename TileDataSrc0, typename TileDataSrc1, typename... WaitEvents PTO_INST RecordEvent TCMP(TileDataDst dst, TileDataSrc0 src0, TileDataSrc1 src1, CmpMode cmpMode, WaitEvents ... events);接口要点模板参数TileDataDst/TileDataSrc0/TileDataSrc1为目标与两个源 Tile 类型三者均需为Tile或其派生类型WaitEvents...为可变事件参数用于异步流水依赖管理。返回值PTO_INST RecordEvent可用于与其他指令建立事件依赖。实参顺序dst, src0, src1, cmpMode, events...与汇编形式tcmp %src0, %src1相比C 接口将目标dst放在最前。事件处理实现内部先调用detail::PtoWaitEvents(events...)等待前置事件再经MAP_INSTR_IMPL宏分发到各平台实现TCMP_IMPL从源码结构看该分发由编译期宏根据PTO_NPU_ARCH_*/__CPU_SIM__等宏选择后端。同文件还提供了标量比较变体 TCMPSinclude/pto/common/pto_instr.hppsrc1可为typename TileDataSrc::DType标量或 Tile用于 Tile 与标量的比较场景语义与 TCMP 一致。平台约束TCMP 的可用性与行为随目标平台不同而有差异仓库在 A2/A3 与 A5含 A6后端分别实施了不同的静态检查。Atlas A2/A3 训练/推理系列产品对应实现见 include/pto/npu/a2a3/TCmp.hpp约束如下输入类型必须是int32_t、half、float之一输出类型必须是uint8_t。src0、src1、dst的 tile 位置必须为TileType::Vec。静态有效边界TileDataSrc::ValidRow TileDataSrc::Rows且TileDataSrc::ValidCol TileDataSrc::Cols。运行时断言src0与src1的有效行列数分别相等且src0.GetValidRow() dst.GetValidRow()。目标有效列数表示打包容量不要求等于源有效列数。对于int32_t输入支持EQ与NENE对相等比较结果取反其余模式走EQ路径。上述约束在源码中以static_assert与PTO_ASSERT双重形式落地include/pto/npu/a2a3/TCmp.hpp编译器可拦截类型/布局/边界错误运行时继续校验有效行列一致性。Ascend 950PR / Ascend 950DTA5/A6对应实现见 include/pto/npu/a5/TCmp.hpp约束如下输入类型支持更广uint32_t、int32_t、int64_t、uint64_t、uint16_t、int16_t、uint8_t、int8_t、float、half、bfloat16_t。输出为打包谓词字节可使用 RowMajoruint8_t掩码 Tile。迭代域为src0.GetValidRow()/src0.GetValidCol()src1须提供对应有效元素。目标有效列数表示打包容量不决定比较次数。TcmpCheckinclude/pto/npu/a5/TCmp.hpp中静态断言src0/src1类型必须相同、三个 Tile 必须为 RowMajor 且位于TileType::Vec、有效行列不得超过物理行列。掩码编码规则谓词掩码的按位打包布局是正确消费 TCMP 输出结果的关键64 位输入Ascend 950PR/Ascend 950DT列j的比较结果存于该行第j / 8字节的第j % 8位低位在前least significant bit first。对uint8_t掩码有效形状可设为[R, ceil(C / 8)]物理Cols按 32 字节对齐其中[R, C]为源有效形状。行地址按目标物理步长RowStride计算最后一个有效位之后的填充值未指定。掩码 tile 被解释为目标定义布局中的打包谓词位。该规则在 CPU 仿真实现中同样成立include/pto/cpu/TCmp.h的TCmp内核对每行按kBitsPerWorduint32_t输出为 32 位uint8_t输出为 8 位进行打包packedWord | (cmp bit)即实现“低位在前”的位序include/pto/cpu/TCmp.h与 A5 硬件行为保持一致可用于在 CPU 上预验证掩码布局。代码示例自动Auto模式自动模式下由编译器/运行时负责资源放置与调度只需声明 Tile 类型并调用内建接口#include pto/pto-inst.hpp using namespace pto; void example_auto() { using SrcT TileTileType::Vec, float, 16, 16; using MaskT TileTileType::Vec, uint8_t, 16, 32, BLayout::RowMajor, -1, -1; SrcT src0, src1; MaskT mask(16, 2); TCMP(mask, src0, src1, CmpMode::GT); }要点说明SrcT为 16×16 的floatVec TileMaskT为 16 行、物理 32 列的uint8_t掩码 Tile其构造参数(16, 2)设置有效形状为 16 行 × 2 列恰好容纳 16 个float元素的比较结果16 bit → 2 字节。掩码有效列数2即“打包容量”由 16 个源列除以每字节 8 位得出ceil(16 / 8) 2。手动Manual模式手动模式下先用TASSIGN显式绑定 Tile 物理地址再发射指令#include pto/pto-inst.hpp using namespace pto; void example_manual() { using SrcT TileTileType::Vec, float, 16, 16; using MaskT TileTileType::Vec, uint8_t, 16, 32, BLayout::RowMajor, -1, -1; SrcT src0, src1; MaskT mask(16, 2); TASSIGN(src0, 0x1000); TASSIGN(src1, 0x2000); TASSIGN(mask, 0x3000); TCMP(mask, src0, src1, CmpMode::GT); }TASSIGN将各 Tile 绑定到 UBUnified Buffer上的指定地址0x1000/0x2000/0x3000随后TCMP直接在这些物理位置上执行。汇编示例ASM自动模式# 自动模式由编译器/运行时负责资源放置与调度。 %dst pto.tcmp %src0, %src1{cmpMode #ptocmp xx}: (!pto.tile..., !pto.tile...) - !pto.tile...手动模式# 手动模式先显式绑定资源再发射指令。 # 可选当该指令包含 tile 操作数时 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.tcmp %src0, %src1{cmpMode #ptocmp xx}: (!pto.tile..., !pto.tile...) - !pto.tile...源码级实现解析TCMP 的跨平台实现按sizeof(T)分派到不同的底层比较与打包路径理解这些路径有助于预估指令开销并写出更优的算子。A2/A3 后端vcmpv_* 按行循环include/pto/npu/a2a3/TCmp.hpp中TCmp将每行有效列数换算为 repeat 次数按TCMP_REPEAT_MAX 240切分循环核心通过vcmpv_eq/lt/gt/ge/le指令完成比较。int32_t输入固定走vcmpv_eqEQ 路径而NE模式在全部比较完成后通过pipe_barrier(PIPE_V)同步、再以vnot对uint16_t视图按SetVectorCount计数逐位取反实现include/pto/npu/a2a3/TCmp.hpp与文档“NE对相等比较结果取反”的描述完全对应。A5 后端按位宽三分支include/pto/npu/a5/TCmp.hpp中TCMP_IMPL按sizeof(T)选择实现sizeof(T) 8int64/uint64Int64Compare将 64 位值拆为高低 32 位两部分使用vcmp_eq与vcmp_lt/le/gt/ge组合出关系比较再经psel依据高位相等标志选择低位结果include/pto/npu/a5/TCmp.hppEQ/NE则分别用双 32 位等值比较与por逻辑或实现。每 repeat 处理 64 个 int64 元素512B通过pdintlv_b8与psts(PK)完成位交叉打包include/pto/npu/a5/TCmp.hpp。sizeof(T) 4TCmp_32B每次迭代加载两批各一个 repeat数据比较后用pdintlv_b8(dstReg, tmpMask2, tmpMask0, tmpMask1)将两个掩码按 8 位交叉再psts以PK分布模式写入dstRepeatStride 2 * repeatElm / 32include/pto/npu/a5/TCmp.hpp。sizeof(T) 2 或 1half/bfloat16/int16/uint16/int8/uint8TCmp_8B_16B按repeatElm CCE_VL / sizeof(T)逐 repeat 比较CmpCall依据CmpMode分发到vcmp_eq/ne/lt/gt/ge/leinclude/pto/npu/a5/TCmp.hpp输出分布模式对 2 字节输入使用PK、其余使用NORM。从源码结构看A5 端对不同位宽采用了独立的寄存加载与掩码交叉策略int64的比较路径最复杂涉及高低位拆分与条件选择这也是 64 位输入编码规则单独说明的原因。CPU 仿真后端include/pto/cpu/TCmp.h提供可在 CPU 上运行的参考实现CmpResult用 C 原生比较符实现六种模式TCmp按行并行cpu::parallel_for_rows逐位打包写入前先ZeroTileData将目标清零include/pto/cpu/TCmp.h。该实现既可用于无 NPU 环境下的功能预验证也作为掩码布局的事实参照。测试与验证仓库在 tests/npu/a5/src/st/testcase/tcmp/tcmp_kernel.cpp 提供了 TCMP 的 ST 测试核覆盖了全类型aclFloat16、float、int32_t、int16_t、bf16、int64_t/uint64_t等与全模式EQ/NE/LT/GT/GE/LE并包含非规则形状用例例如TileTileType::Vec, int32_t, 77, 80, ..., 32, 32物理 77×80、有效 32×32用于验证有效区域与打包容量的解耦逻辑int64 侧另有INSTANTIATE_TCMP_INT64*宏批量实例化窄4×16 有效 4×15与宽4×64两种形状。相关用例可直接结合 tests/run_st.sh 的测试流程运行。使用建议掩码 Tile 尺寸目标有效列数按ceil(源有效列数 / 8)设置即可物理Cols建议按 32 字节对齐不要用源列数直接作为掩码列数。迭代域口径A5 端比较次数由src0的有效行列决定dst有效列仅表示容量两端口径不要混用。类型匹配src0与src1类型必须一致编译期断言跨类型比较需先做TCVT等转换。依赖管理异步场景下将前序指令返回的RecordEvent作为WaitEvents传入TCMP避免数据竞争。平台适配A2/A3 仅支持int32_t/half/float且int32_t只有 EQ/NE 有效语义需要更宽类型或关系比较请选用 A5Ascend 950PR/Ascend 950DT目标。相关参考指令总览见 docs/PTO-Virtual-ISA-Manual_zh.md 与 docs/isa/README_zh.md标量比较变体 TCMPS 见 docs/isa/TCMPS_zh.mdTile 类型系统见 docs/coding/Tile_zh.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),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →