- 人工智能
- 指令集
- 算子库
- CANN
- Ascend
【免费下载链接】pto-isa
Parallel 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.
导读
本文聚焦 CANN PTO-ISA(Parallel 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为底数 Tile,exp为指数 Tile,dst为输出 Tile,三者尺寸与有效区域一致(i < R,j < C,R = 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)过程中编译器可能引入内部临时 Tile;C++ 内建接口要求显式传入tmp操作数,这是 TPOW 区别于普通二元运算指令的显著特征。
AS Level 1(SSA)
SSA 形式将四个操作数全部作为值(value)参与数据流:
%dst = pto.tpow %base, %exp, %tmp : (!pto.tile<...>, !pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>AS Level 2(DPS)
DPS(Destination-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.hpp>:
template <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.hpp(enum 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_PRECISION:PrecisionType选项被忽略,恒走 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 平台
- 浮点类型(
float):tmp被使用,作为中间暂存存储。实现按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)按三步流水执行:
- 通过
PowOp<T, true>对base取绝对值后执行vln(自然对数),结果写入tmp; - 通过
PowOp<T, false>在dst上执行vln(base); - 两路分别执行
vmul(乘以exp)与vexp(指数),最终由ProcessSpecialCaseForPowF用标量核(PIPE_S)修正特殊情况,并通过PtoSetWaitFlag<PIPE_V, PIPE_S>/PtoSetWaitFlag<PIPE_S, PIPE_V>完成向量/标量流水屏障。
A5 浮点实现(TPowFloat)则完全基于向量寄存器:GetTPowFloatCore中vabs→vln→vmul→vexp一气呵成,配合ProcessFloatSpecialCase处理base^0=1、1^exp=1、NaN/±inf 传播、(-1)^(±inf)=1、负数底数配非整数指数返回 NaN 等边界(ProcessFloatSpecialCase)。
A5 高精度路径(PowF::TPowFloatHighPrecisionImpl)则通过GetLogFExtStepOne/GetLogFExtStepTwo对log2做更精细的区间约化(reduction)与多项式拟合,再用GetExpCore完成指数运算,从而提升精度,但指令数与流水开销更大。
整数路径
- A2A3:
TPowICore实现快速幂(square-and-multiply),并处理exp==0返回 1(含0^0)、base==0返回 0、base==±1特判、负指数返回 0(对齐 PyTorch 语义:整数底数不允许负指数)等情形(TPowICore)。 - A5:
PowI::TPowInteger使用向量寄存器按位循环(PowIntegerCore:按指数最低位选择乘积累加、指数右移、底数自乘),并对 8 位整数类型通过ConvType(int8_t → int16_t、uint8_t → uint16_t)提升计算宽度后回写。
CPU 参考实现
include/pto/cpu/TPow.hpp 提供 CPU 参考实现:整数走integer_pow(快速幂 + 边界处理),浮点走std::pow(half结果先经float转换),用于 CPU 仿真与 golden 对照。
使用示例
Auto 模式
Auto 模式下 Tile 的内存布局与调度由编译器/运行时自动管理,无需显式绑定地址:
#include <pto/pto-inst.hpp> using namespace pto; void example_auto() { using TileT = Tile<TileType::Vec, float, 16, 16>; TileT base, exp, dst, tmp; TPOW(dst, base, exp, tmp); TPOW<PowAlgorithm::HIGH_PRECISION>(dst, base, exp, tmp); }Manual 模式
Manual 模式下需先通过TASSIGN显式绑定 Tile 的地址(UB 空间偏移),再发射指令:
#include <pto/pto-inst.hpp> using namespace pto; void example_manual() { using TileT = Tile<TileType::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 与 NPU(A2A3/A5/kirin 系列)均提供 TPOW/TPOWS 的 ST 测试用例,可用于验证本文描述的所有行为:
- A2A3 测试:tests/npu/a2a3/src/st/testcase/tpow/main.cpp(入口)、tpow_kernel.cpp(kernel 与 launch)、gen_data.py(golden 数据生成);
- A5 测试:tests/npu/a5/src/st/testcase/tpow/main.cpp;
- CPU 测试:tests/cpu/st/testcase/tpow/main.cpp。
以 A2A3 的 tpow_kernel.cpp 为例,一个完整的 TPOW 调用链展示了事件同步的标准写法:
Event<Op::TLOAD, Op::TPOW> evt0; Event<Op::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 边界用例的覆盖思路,可帮助你理解特殊情形的行为约定:
case12:base = 1、exp = 0(1^0 = 1);case13:base/exp含 NaN(结果应为 NaN);case14:base = ±inf / 0,exp取 ±3.0、2.0、3.5、-4.0 等(覆盖零底数、负指数、负数底数配非整数指数);case15:base = -1、exp = ±inf((-1)^(±inf) = 1)。
golden 数据统一由np.power计算,并只对[0:valid_row, 0:valid_col]有效区域断言,与“有效区域”语义一致。
小结与选型建议
- 精度优先:在 A5 上对
half/float/bfloat16_t使用TPOW<PowAlgorithm::HIGH_PRECISION>;A2A3 上该参数会被忽略,无需额外开销。 - 临时空间:A2A3 浮点场景必须为
tmp分配与dst同类型、有效区域不小于输出的 Tile;A5 与整数场景可传入占位 Tile。 - 边界语义:
0^0=1、负数底数配非整数指数返回 NaN、整数负指数返回 0、(-1)^(±inf)=1等约定已在各平台实现与测试中固化,业务侧可直接依赖。
如需查看 TPOW 在浮点/整数/高精度三种路径下的完整源码实现,可继续阅读 include/pto/npu/a2a3/TPow.hpp 与 include/pto/npu/a5/TPow.hpp。
- 人工智能
- 指令集
- 算子库
- CANN
- Ascend
【免费下载链接】pto-isa
Parallel 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.
相关推荐
CANN PTO-ISA 指令详解:TPOW 逐元素幂运算的数学语义、精度算法与跨平台实现
CANN PTO ISA 指令详解:TPOW 逐元素幂运算的数学语义、精度算法与跨平台实现 导读 TPOW(Tile Power)是 CANN PTO ISA(
人工智能指令集算子库CANNAscendCANN pto-isa 指令详解:TGATHERB 字节偏移 Gather 指令的语法、约束与跨平台实现
CANN pto isa 指令详解:TGATHERB 字节偏移 Gather 指令的语法、约束与跨平台实现 TGATHERB 是 CANN pto isa(Pa
人工智能指令集算子库CANNAscendCANN PTO-ISA TAND 指令全解析:Tile 逐元素按位与的语法、约束与多平台实现
CANN PTO ISA TAND 指令全解析:Tile 逐元素按位与的语法、约束与多平台实现 TAND(Tile AND)是 CANN PTO ISA(Par
人工智能指令集算子库CANNAscend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考