
人工智能指令集算子库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点击查看免费下载导读本文聚焦 CANN PTO-ISAParallel Tile Operation 虚拟指令集中的逐元素幂运算指令TPOW基于 docs/isa/TPOW.md 展开。TPOW 用于计算 Tile 中每个元素的base的exp次幂是向量TileType::Vec运算族中的核心指令之一。读完本文你将掌握 TPOW 的数学语义、两级汇编SSA/DPS语法、C 内建接口TPOW()的用法与PowAlgorithm精度策略、跨 A2A3/A5 平台的数据类型与临时空间差异以及如何结合仓库源码理解其浮点/整数双路径实现与测试验证方法。指令概览与数学语义TPOW 是逐元素elementwise幂运算指令。对有效区域内每个元素(i, j)其数学定义为$$ \mathrm{dst}{i,j} \mathrm{base}{i,j}^{\mathrm{exp}_{i,j}} $$其中base为底数 Tileexp为指数 Tiledst为输出 Tile三者尺寸与有效区域一致i Rj CR dst.GetValidRow()C dst.GetValidCol()。对于浮点类型仓库实现遵循dst exp(ln(|base|) * exp)的恒等变换并针对负数底数、非整数指数等边界情形做特殊处理整数类型则走独立的整数幂计算路径。这部分语义在 A2A3 实现 与 A5 实现 中均有对应代码印证。汇编语法同步形式TPOW 需要三个输入操作数base、exp、tmp与一个输出操作数dst同步形式如下%dst tpow %base, %exp, %tmp : !pto.tile...降低lowering过程中编译器可能引入内部临时 TileC 内建接口要求显式传入tmp操作数这是 TPOW 区别于普通二元运算指令的显著特征。AS Level 1SSASSA 形式将四个操作数全部作为值value参与数据流%dst pto.tpow %base, %exp, %tmp : (!pto.tile..., !pto.tile..., !pto.tile...) - !pto.tile...AS Level 2DPSDPSDestination-Passing Style形式显式区分输入ins与输出outs操作数类型为!pto.tile_buf...pto.tpow ins(%base, %exp, %tmp : !pto.tile_buf..., !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)C 内建接口接口签名TPOW 的 C 内建接口声明于 include/pto/common/pto_instr.hpp公共包含头为pto/pto-inst.hpptemplate auto PrecisionType PowAlgorithm::DEFAULT, typename DstTile, typename BaseTile, typename ExpTile, typename TmpTile, typename... WaitEvents PTO_INTERNAL RecordEvent TPOW(DstTile dst, BaseTile base, ExpTile exp, TmpTile tmp, WaitEvents ... events);接口要点模板参数PrecisionType默认PowAlgorithm::DEFAULT用于选择算法精度策略PowAlgorithm枚举定义于 include/pto/common/type.hppenum class PowAlgorithm : uint8_t { DEFAULT, HIGH_PRECISION };。变参WaitEvents支持事件同步Event实现指令间的依赖编排例如 TLOAD → TPOW → TSTORE 流水。返回RecordEvent返回记录事件可继续传递给后续指令。精度策略PowAlgorithm取值说明PowAlgorithm::DEFAULT普通算法速度较快但精度相对较低A2A3 仅支持该策略PowAlgorithm::HIGH_PRECISION高精度算法精度更高但速度较慢仅 A5 支持且仅限浮点类型约束与合法性检查通用约束各平台一致dst、base、exp必须均为TileType::Vec见 A2A3 TPowCheckType 中的static_assert。所有 Tile 必须使用行主序布局TileData::isRowMajor。dst、base、exp的元素类型必须一致编译期static_assert保证。静态有效区域约束TileData::ValidRow TileData::Rows且TileData::ValidCol TileData::Cols。运行时有效区域检查由PTO_ASSERT实施dst.GetValidRow() base.GetValidRow()dst.GetValidCol() base.GetValidCol()dst.GetValidRow() exp.GetValidRow()dst.GetValidCol() exp.GetValidCol()内建接口签名强制要求显式传入tmp操作数。A2A3 实现检查支持元素类型int32_t、int16_t、int8_t、uint32_t、uint16_t、uint8_t、float不含half/bfloat16_t。不支持HIGH_PRECISIONPrecisionType选项被忽略恒走 DEFAULT 路径。额外tmp有效区域检查dst.GetValidRow() tmp.GetValidRow()且dst.GetValidCol() tmp.GetValidCol()浮点场景下由 TPOW_IMPL 的PTO_ASSERT实施。A5 实现检查DEFAULT算法支持uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、half、float、bfloat16_t。HIGH_PRECISION算法支持仅half、float、bfloat16_t浮点类型见 A5 PowCheckType 的static_assert。整数类型使用独立的整数幂计算路径PowI命名空间与浮点路径分离。临时空间tmp 操作数语义A2A3 平台浮点类型floattmp被使用作为中间暂存存储。实现按pow(base, exp) exp(ln(|base|) * exp)计算tmp存放带绝对值的exp(ln(|base|) * exp)结果用于负数底数配奇数整数指数的特殊情形处理SwitchPowFResult见 A2A3 实现。此时要求tmp与dst/base/exp元素类型一致tmp.GetValidRow() dst.GetValidRow()且tmp.GetValidCol() dst.GetValidCol()注意此处是“不小于”与输入 Tile 的相等检查不同。整数类型tmp不使用整数幂路径TPowI/TPowICore基于标量循环计算无需暂存 Tile。A5 平台tmp被接口接受但A5 实现不使用。A5 后端基于向量寄存器RegTensor在__VEC_SCOPE__内完成计算无需 scratch Tile 存储tmp仅为了与 A2A3 保持 API 兼容而保留在签名中A5 TPOW_IMPL 中未将tmp传入计算核。实现原理浮点与整数双路径浮点路径exp(ln(|base|) * exp)A2A3 浮点实现TPowF按三步流水执行通过PowOpT, true对base取绝对值后执行vln自然对数结果写入tmp通过PowOpT, false在dst上执行vln(base)两路分别执行vmul乘以exp与vexp指数最终由ProcessSpecialCaseForPowF用标量核PIPE_S修正特殊情况并通过PtoSetWaitFlagPIPE_V, PIPE_S/PtoSetWaitFlagPIPE_S, PIPE_V完成向量/标量流水屏障。A5 浮点实现TPowFloat则完全基于向量寄存器GetTPowFloatCore中vabs→vln→vmul→vexp一气呵成配合ProcessFloatSpecialCase处理base^01、1^exp1、NaN/±inf 传播、(-1)^(±inf)1、负数底数配非整数指数返回 NaN 等边界ProcessFloatSpecialCase。A5 高精度路径PowF::TPowFloatHighPrecisionImpl则通过GetLogFExtStepOne/GetLogFExtStepTwo对log2做更精细的区间约化reduction与多项式拟合再用GetExpCore完成指数运算从而提升精度但指令数与流水开销更大。整数路径A2A3TPowICore实现快速幂square-and-multiply并处理exp0返回 1含0^0、base0返回 0、base±1特判、负指数返回 0对齐 PyTorch 语义整数底数不允许负指数等情形TPowICore。A5PowI::TPowInteger使用向量寄存器按位循环PowIntegerCore按指数最低位选择乘积累加、指数右移、底数自乘并对 8 位整数类型通过ConvTypeint8_t → int16_t、uint8_t → uint16_t提升计算宽度后回写。CPU 参考实现include/pto/cpu/TPow.hpp 提供 CPU 参考实现整数走integer_pow快速幂 边界处理浮点走std::powhalf结果先经float转换用于 CPU 仿真与 golden 对照。使用示例Auto 模式Auto 模式下 Tile 的内存布局与调度由编译器/运行时自动管理无需显式绑定地址#include pto/pto-inst.hpp using namespace pto; void example_auto() { using TileT TileTileType::Vec, float, 16, 16; TileT base, exp, dst, tmp; TPOW(dst, base, exp, tmp); TPOWPowAlgorithm::HIGH_PRECISION(dst, base, exp, tmp); }Manual 模式Manual 模式下需先通过TASSIGN显式绑定 Tile 的地址UB 空间偏移再发射指令#include pto/pto-inst.hpp using namespace pto; void example_manual() { using TileT TileTileType::Vec, float, 16, 16; TileT base, exp, dst, tmp; TASSIGN(base, 0x1000); TASSIGN(exp, 0x2000); TASSIGN(dst, 0x3000); TASSIGN(tmp, 0x4000); TPOW(dst, base, exp, tmp); }ASM 形式示例Auto 模式# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.tpow %base, %exp, %tmp : (!pto.tile..., !pto.tile..., !pto.tile...) - !pto.tile...Manual 模式# 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) # pto.tassign %arg2, tile(0x3000) %dst pto.tpow %base, %exp, %tmp : (!pto.tile..., !pto.tile..., !pto.tile...) - !pto.tile...PTO 汇编形式%dst tpow %base, %exp, %tmp : !pto.tile... # AS Level 2 (DPS) pto.tpow ins(%base, %exp, %tmp : !pto.tile_buf..., !pto.tile_buf..., !pto.tile_buf...) outs(%dst : !pto.tile_buf...)测试验证与实战参考仓库在 CPU 与 NPUA2A3/A5/kirin 系列均提供 TPOW/TPOWS 的 ST 测试用例可用于验证本文描述的所有行为A2A3 测试tests/npu/a2a3/src/st/testcase/tpow/main.cpp入口、tpow_kernel.cppkernel 与 launch、gen_data.pygolden 数据生成A5 测试tests/npu/a5/src/st/testcase/tpow/main.cppCPU 测试tests/cpu/st/testcase/tpow/main.cpp。以 A2A3 的 tpow_kernel.cpp 为例一个完整的 TPOW 调用链展示了事件同步的标准写法EventOp::TLOAD, Op::TPOW evt0; EventOp::TPOW, Op::TSTORE_VEC evt1; TLOAD(baseTile, baseGlobal); evt0 TLOAD(expTile, expGlobal); evt1 TPOW(dstTile, baseTile, expTile, tmpTile, evt0); TSTORE(dstGlobal, dstTile, evt1);这里TPOW的WaitEvents参数evt0建立 TLOAD → TPOW 的依赖返回值evt1又作为 TSTORE 的前置事件形成 TLOAD → TPOW → TSTORE 的指令流水。gen_data.py 则给出了 TPOW 边界用例的覆盖思路可帮助你理解特殊情形的行为约定case12base 1、exp 01^0 1case13base/exp含 NaN结果应为 NaNcase14base ±inf / 0exp取 ±3.0、2.0、3.5、-4.0 等覆盖零底数、负指数、负数底数配非整数指数case15base -1、exp ±inf(-1)^(±inf) 1。golden 数据统一由np.power计算并只对[0:valid_row, 0:valid_col]有效区域断言与“有效区域”语义一致。小结与选型建议精度优先在 A5 上对half/float/bfloat16_t使用TPOWPowAlgorithm::HIGH_PRECISIONA2A3 上该参数会被忽略无需额外开销。临时空间A2A3 浮点场景必须为tmp分配与dst同类型、有效区域不小于输出的 TileA5 与整数场景可传入占位 Tile。边界语义0^01、负数底数配非整数指数返回 NaN、整数负指数返回 0、(-1)^(±inf)1等约定已在各平台实现与测试中固化业务侧可直接依赖。如需查看 TPOW 在浮点/整数/高精度三种路径下的完整源码实现可继续阅读 include/pto/npu/a2a3/TPow.hpp 与 include/pto/npu/a5/TPow.hpp。赞分享人工智能指令集算子库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点击查看免费下载相关推荐CANN PTO-ISA 指令详解TPOW 逐元素幂运算的数学语义、精度算法与跨平台实现CANN PTO ISA 指令详解TPOW 逐元素幂运算的数学语义、精度算法与跨平台实现 导读 TPOWTile Power是 CANN PTO ISA人工智能指令集算子库CANNAscendCANN pto-isa 指令详解TGATHERB 字节偏移 Gather 指令的语法、约束与跨平台实现CANN pto isa 指令详解TGATHERB 字节偏移 Gather 指令的语法、约束与跨平台实现 TGATHERB 是 CANN pto isaPa人工智能指令集算子库CANNAscendCANN PTO-ISA TAND 指令全解析Tile 逐元素按位与的语法、约束与多平台实现CANN PTO ISA TAND 指令全解析Tile 逐元素按位与的语法、约束与多平台实现 TANDTile AND是 CANN PTO ISAPar人工智能指令集算子库CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考