PTO ISA 标量余数指令 TFMODS 深度解析:数学语义、精度算法与 A2A3/A5 跨平台实现

发布时间:2026/9/19 8:13:40
PTO ISA 标量余数指令 TFMODS 深度解析:数学语义、精度算法与 A2A3/A5 跨平台实现 PTO ISA 标量余数指令 TFMODS 深度解析数学语义、精度算法与 A2A3/A5 跨平台实现【免费下载链接】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-isaTFMODSTile FMod with Scalar是 CANN PTOParallel Tile Operation虚拟指令集体系中的一条标量二元运算指令用于将 Tile 中每个元素与一个标量做逐元素fmod余数运算。本文以 docs/isa/TFMODS_zh.md 为骨架结合仓库中的 A2A3 实现、A5 实现、公共内建接口 以及 CPU/NPU 测试用例完整讲解该指令的数学语义、三级汇编语法、C 内建接口、精度算法选择、平台约束差异与实战用法。读完本文你将掌握 TFMODS 的调用方式、两种精度算法的取舍依据以及如何在不同昇腾平台约束下正确编写和验证该指令的 Kernel。一、指令概览与数学语义TFMODS 属于 PTO ISA 中Tile 与标量形式的逐元素算术指令族同类还有TDIVS、TMULS、TADDS、TSUBS等。它的语义是将输入 Tilesrc的每个元素与标量scalar做 C 语言风格的fmod取余运算结果写入输出 Tiledst。与二元形式TFMOD两个 Tile 逐元素取余见 docs/isa/TFMOD_zh.md不同TFMODS 的第二个操作数是标量而非 Tile因此不涉及第二个 Tile 的搬运与布局约束在归一化、去均值等逐元素对常量取余场景中更简洁高效。数学语义对有效区域valid region内的每个元素(i, j)dst(i, j) fmod(src(i, j), scalar)其中fmod的符号语义遵循 C 标准结果符号与被除数即src元素相同。例如fmod(7.5, 3.0) 1.5fmod(-7.5, 3.0) -1.5fmod(7.5, -3.0) 1.5该语义通过截断除法实现其恒等关系为fmod(a, b) a - trunc(a / b) * b该公式在 A2A3 实现 源码注释中明确给出这也是底层向量指令序列的推导基础。二、汇编语法三级抽象与两种编程模式TFMODS 在 PTO 指令集中按抽象层级分为同步形式、AS Level 1SSA 形式与 AS Level 2DPS 形式分别面向不同阶段的编译表示与硬件描述。同步形式伪汇编%dst tfmods %src, %scalar : !pto.tile..., f32AS Level 1SSASSA 形式使用pto.tfmods操作名操作数仍是逻辑 Tile 句柄%dst pto.tfmods %src, %scalar : !pto.tile..., f32AS Level 2DPSDPSData Parallel Semantics形式显式区分ins输入与outs输出操作数类型为物理 Tile 缓冲区!pto.tile_buf...pto.tfmods ins(%src, %scalar : !pto.tile_buf..., f32) outs(%dst : !pto.tile_buf...)自动模式与手动模式在实际汇编编写中TFMODS 支持两种资源管理模式相关约定详见 docs/isa/conventions_zh.md自动模式由编译器/运行时负责 Tile 资源的放置与调度无需用户干预# 自动模式由编译器/运行时负责资源放置与调度。 %dst pto.tfmods %src, %scalar : !pto.tile..., f32手动模式用户需在发射指令前显式绑定 Tile 资源可通过pto.tassign将逻辑 Tile 操作数绑定到指定物理地址如tile(0x1000)、tile(0x2000)# 手动模式先显式绑定资源再发射指令。 # 可选当该指令包含 tile 操作数时 # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.tfmods %src, %scalar : !pto.tile..., f32手动模式的典型应用是在 A5 测试 Kernel 中通过TASSIGN(srcTile, 0x0)、TASSIGN(dstTile, srcTileRow * srcTileCol * sizeof(T))显式规划片上地址而自动模式__PTO_AUTO__定义下则由编译器接管资源与调度。三、C 内建接口签名与调用机制TFMODS 的 C 内建接口声明于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpp内部声明位于pto/common/pto_instr.hpptemplate auto PrecisionType FmodSAlgorithm::DEFAULT, typename TileDataDst, typename TileDataSrc, typename... WaitEvents PTO_INST RecordEvent TFMODS(TileDataDst dst, TileDataSrc src, typename TileDataSrc::DType scalar, WaitEvents ...events);对签名各部分的解析PrecisionType非类型模板参数默认FmodSAlgorithm::DEFAULT用于选择余数算法实现详见下一节。该枚举定义于 include/pto/common/type.hppenum class FmodSAlgorithm : uint8_t { DEFAULT, HIGH_PRECISION };dst/src分别为输出与输入 Tile模板参数TileDataDst/TileDataSrc约束其元素类型、布局与位置属性标量scalar的类型被限定为TileDataSrc::DType即必须与输入 Tile 的元素类型一致。WaitEvents ...events可变参数事件列表。从 pto_instr.hpp 的实现 可以看到TFMODS 会先调用detail::PtoWaitEvents(events...)等待传入事件再执行TFMODS_IMPLPrecisionType(dst, src, scalar)最后返回RecordEvent供后续指令依赖实现指令间的流水同步template auto PrecisionType FmodSAlgorithm::DEFAULT, typename TileDataDst, typename TileDataSrc, typename... WaitEvents PTO_INST RecordEvent TFMODS(TileDataDst dst, TileDataSrc src, typename TileDataSrc::DType scalar, WaitEvents... events) { detail::PtoWaitEvents(events...); TFMODS_IMPLPrecisionType(dst, src, scalar); return {}; }四、精度算法DEFAULT 与 HIGH_PRECISION 的实现原理FmodSAlgorithm提供两种算法算法取值说明适用类型FmodSAlgorithm::DEFAULT普通算法速度快但精度较低float/half等FmodSAlgorithm::HIGH_PRECISION高精度算法速度较慢仅float且仅在 A5 上生效A3 上该选项被忽略DEFAULT 算法的向量指令序列从源码结构看两种平台均以fmod(a, b) a - trunc(a / b) * b为基本公式构造指令序列差异在于向零截断的实现方式。A2A3 实现include/pto/npu/a2a3/TFmodS.hpp中FmodSOp::FmodSF32Instr的完整流水为vector_dup(dst, x, 1, 1, 1, 8, 8); // 1. 将标量 x 广播为向量 vdiv(dst, src, dst, 1, 1, 1, 1, 8, 8, 8); // 2. src / x vconv_f322f32z(dst, dst, 1, 1, 1, 8, 8); // 3. 向零截断trunc vmuls(dst, dst, x, 1, 1, 1, 8, 8); // 4. 乘以 x vsub(dst, src, dst, 1, 1, 1, 1, 8, 8, 8); // 5. src - trunc(src/x)*x每一步之间通过pipe_barrier(PIPE_V)保证向量流水内的执行顺序。这里的关键是vconv_f322f32z它利用float 到 float 的转换按ROUND_Z向零舍入语义完成截断从而得到trunc效果。A5 实现include/pto/npu/a5/TFModS.hpp则采用寄存器张量RegTensorT与谓词寄存器MaskReg驱动float分支vdiv求商 →vtrc(reg_dst, reg_dst, ROUND_Z)向零截断 →vmuls乘回标量 →vsub求余。half分支由于half无法直接承载足够精度的中间运算实现将奇偶位拆分为两个float通道vcvt(..., PART_EVEN)/vcvt(..., PART_ODD)各自完成vdiv → vtrc → vmuls → vsub后再通过vor合并回half结果最终以vcvt(..., ROUND_Z, RS_ENABLE, ...)完成舍入与缩位。这正是 A5 支持 2 字节类型half而 A2A3 仅支持 4 字节float的底层原因之一。其它 2/4 字节类型分支走vdiv → vmuls → vsub的简化序列省略显式截断适用于整数类型。HIGH_PRECISION 算法当PrecisionType FmodSAlgorithm::HIGH_PRECISION T float且目标架构为 A5/A6 时FModSOp::BinSInstr 会转向TFmodRemHPtrue(reg_dst, reg_src0, reg_src1, preg)实现位于custom/TFmodRemHp.hpp随include/pto/npu/a5目录分发以更高精度的迭代/修正算法换取更精确的余数结果代价是执行速度下降。文档明确提示高精度选项仅在 A5 上有效在 A3 上该PrecisionType选项将被忽略。五、约束与平台差异A2A3 vs A5TFMODS 的合法性检查在 A2A3 的TFMODS_IMPL与 A5 的TFModSCheck中均有对应静态断言与运行时断言实现。综合文档与源码约束如下A2A3 平台约束dst与src元素类型必须一致仅支持float与float32_t源码中static_assert直接限定见 TFmodS.hppdst与src必须为向量 TileTileType::Vec断言见 TFmodS.hpp必须为行主序row-major布局断言见 TFmodS.hpp运行时要求dst.GetValidRow() src.GetValidRow() 0且dst.GetValidCol() src.GetValidCol() 0断言见 TFmodS.hpp。A5 平台约束dst与src元素类型必须一致支持目标实现所支持的 2 字节或 4 字节类型含half与float源码断言为sizeof(T) 2 || sizeof(T) 4见 TFModS.hpp必须为向量 TileTileType::Vec两个 Tile 的静态有效边界需满足ValidRow Rows且ValidCol Cols见 TFModS.hpp运行时要求dst.GetValidRow() src.GetValidRow()且dst.GetValidCol() src.GetValidCol()见 TFModS.hpp。通用行为约束迭代域指令以dst.GetValidRow()/dst.GetValidCol()作为循环迭代边界对应 A2A3 实现中for (int i 0; i validRows; i)并按行步进指针的写法见 TFmodS.hpp。除零scalar为 0 时行为由目标实现定义CPU 模拟器在调试构建中会触发断言。因此在生产 Kernel 中应先保证scalar ! 0或仅在算法上允许未定义结果。平台差异速查维度A2A3A5支持元素类型float/float32_t2/4 字节类型含half、float布局要求行主序行主序BLayout::RowMajor有效边界运行时相等且大于 0静态ValidRow/ValidCol Rows/Cols运行时相等高精度算法不支持选项被忽略支持仅float六、完整编程示例以下示例来自 docs/isa/TFMODS_zh.md可直接编译运行需包含pto/pto-inst.hpp#include pto/pto-inst.hpp using namespace pto; void example() { using TileT TileTileType::Vec, float, 16, 16; TileT x, out; TFMODS(out, x, 3.0f); }若要显式选择高精度算法并接入事件同步例如在 A5 上要求更精确的余数可写为#include pto/pto-inst.hpp using namespace pto; void exampleHighPrecision() { using TileT TileTileType::Vec, float, 64, 64; TileT x, out; auto ev TFMODSFmodSAlgorithm::HIGH_PRECISION(out, x, 3.0f); // ev 为 RecordEvent可作为后续指令的 WaitEvents 传入实现流水同步 }一个更贴近真实 Kernel 的用法可参考 A5 测试 Kernel通过GlobalTensor描述全局内存动态形状TLOAD将数据加载进 Tile显式TASSIGN绑定片上地址发射TFMODSprecisionType(dstTile, srcTile, scalar)后以set_flag/wait_flag完成MTE2 → V → MTE3流水同步最后TSTORE写回。该用例同时以模板参数开关演示了FmodSAlgorithm::DEFAULT与HIGH_PRECISION两种路径。七、测试验证CPU 模拟器与 NPU 端到端TFMODS 在仓库中拥有完整的 CPU 与 NPU 双端测试覆盖可作为实现行为的权威佐证CPU 模拟器测试tests/cpu/st/testcase/tfmods/main.cpp覆盖float、int32_t、int16_t、aclFloat16以及在CPU_SIM_BFLOAT_ENABLED下bfloat16_t多种类型并包含全局尺寸与 Tile 尺寸不一致的场景如64x512全局对64x64Tile、32x512全局对16x256Tile用于验证有效区域迭代与跨行步进对比误差阈值ResultCmpT(golden, devFinal, 0.001f)配套gen_data.py生成输入与 golden 数据。NPU A2A3/A5/Kirin 系列测试各平台目录下均有独立的tfmods测试套件如 tests/npu/a5/src/st/testcase/tfmods、tests/npu/a2a3/src/st/testcase/tfmods通过aclrtMalloc/aclrtMemcpy完成 Host/Device 数据搬运将算子输出与 golden 对比。其中 A5 用例还显式覆盖了highPrecisiontrue的 float 场景如64x64Tile 取validCol64/61两种边界见 tfmods_kernel.cpp。这些测试同时印证了文档中的约束整数类型仅在支持 2/4 字节类型的目标实现A5 系上可用而 CPU 模拟器对int系列的支持使其可作为开发阶段的快速验证环境CPU 端TFMODS_IMPL位于include/pto/cpu/TBinSOps.hpp。八、与相关指令的辨析在 PTO ISA 标量运算族中TFMODS 与下列指令易混淆选择时需注意TFMOD二元余数src0与src1均为 Tile语义dst fmod(src0, src1)示例使用int32_tTile见 docs/isa/TFMOD_zh.md。TREM/TREMS取余运算的另一种形式C 语言%的余数语义TREMS同样为 Tile-标量形式且需要额外的临时 Tile 参数tmp见 pto_instr.hpp 中TREMS声明。TDIVSTile-标量除法与 TFMODS 共享除数为标量的形式且同样提供DivAlgorithm::{DEFAULT, HIGH_PRECISION}精度选择见 pto_instr.hpp常用于配合实现余数流水。九、小结TFMODS 是 PTO ISA 中实现逐元素对标量取余的核心指令其设计体现了该指令集的三个典型特征统一的Tile Scalar接口形态返回RecordEvent支持流水同步、按平台分层的约束体系A2A3 严格限定float与行主序A5 放宽至 2/4 字节类型并支持高精度算法、以及由trunc(a/b)*b公式推导出的向量指令序列A2A3 以vconv_f322f32z实现截断A5 以vtrc ROUND_Z并针对half做奇偶拆分。开发者在使用时应根据目标平台选择合法元素类型在精度与性能之间通过FmodSAlgorithm权衡并利用仓库内 CPU 模拟器测试 与 NPU 测试套件 验证行为正确性。更完整的指令全景可参阅 docs/PTO-Virtual-ISA-Manual_zh.md 与 docs/isa/README_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),仅供参考