Skip to content

【访存类、reduction、elementwise算子】PTO ISA 与当前编译器 TileOP API 表达完备性对比(29 条指令,7 缺失 / 13 需修改 / 9 一致) #14

Description

@flaviomarix

#【访存类、reduction、elementwise算子】Duplicate of # PTO ISA 与当前编译器 TileOP API 表达完备性对比

目的:以 SuperNPUBench/benchmark-ptoisa/kernels/ 下全部 24 个 PTO 一层编程算子用到的 29 条 PTO ISA 指令为基准,逐条检查当前编译器(Linx-TileOP-API tileop_api.hpp)的 C++ 接口能否完整表达 PTO ISA 文档定义的语义。只关注 API 签名层面的表达力差异(参数、名称、行为语义),不涉及后端实现方式。

排序规则:完全缺失 → 需要修改 → 名称和核心参数一致。


汇总列表

# 类别 PTO ISA 指令 使用算子 当前编译器 差异要点
1 完全缺失 TREMS broadcast_pto 无标量取余 API;TREM 仅 tile-tile 且不支持 uint32
2 TINSERT vec_019, vec_039 无 tile 子区域写入 API;仅有反向操作 TEXTRACT
3 TCOLMAX reducemax_colvec×2 列向 max 归约完全缺失(有行向 TROWMAX
4 TCOLPROD reduceprod_colvec 列向 prod 归约完全缺失(无 TROWPROD 亦无 TCOLPROD
5 TCOLSUM reducesum_colvec×3 列向 sum 归约完全缺失(有行向 TROWSUM
6 TROWPROD reduceprod_rowvec 行向 prod 归约完全缺失(有 TROWSUM/TROWMAX 但无 TROWPROD
7 TMOV concat×2, transpose, reducesum_rowvec_single, reducemax_rowvec_single 通用 tile 拷贝/转换缺失;仅有专用布局转换 TMOV_DN2NZ
8 需要修改 MGATHER broadcast_pto, concat_gather, gather, transpose template_asm.h (部分) Coalesce/GatherOOB 模板参数;索引语义不同(字节偏移 vs 元素索引)
9 MSCATTER concat_scatter template_asm.h (部分) Coalesce/ScatterAtomicOp/ScatterOOB/ScatterConflict
10 TCVT gelu_pto TCVT (缺参数) RoundMode/SaturationMode/tmp 参数
11 TDIVS broadcast_pto, concat×2, transpose TDIVS (缺参数) PrecisionType;缺反向重载 scalar÷tile
12 TEXP gelu_pto TEXP (缺参数) PrecisionTypeDEFAULT/HIGH_PRECISION
13 TRECIP gelu_pto TRECIP (缺参数) PrecisionTypeDEFAULT/HIGH_PRECISION
14 TROWMAX reducemax_rowvec×2 TROWMAX (缺 tmp) PTO ISA 有 tmp 参数,当前编译器无
15 TROWSUM reducesum_rowvec×2 TROWSUM (缺 tmp) PTO ISA 有 tmp 参数,当前编译器无
16 TTRANS transpose, transpose_vector_007 TTRANS (缺 tmp) PTO ISA 有 tmp 参数,当前编译器无
17 TLOAD 全部算子 TCOPYIN (名不同) 名称不同;核心参数和行为一致
18 TSTORE 全部算子 TCOPYOUT (名不同) 名称不同;缺 AtomicType/preQuantScalar
19 TEXPANDS 全部算子 TEXPANDSCALAR (名不同) 名称不同;核心参数和行为一致
20 TROWEXPAND vec_07 TEXPANDROW (名不同) 名称不同;核心参数和行为一致
21 一致 TCI broadcast_pto, concat×2, transpose TCI 无差异
22 TADD broadcast_pto, concat×2, transpose, reduction×4, gelu_pto TADD 无差异
23 TADDS gelu_pto TADDS 无差异
24 TMAX reducemax_rowvec×2, reducemax_colvec×2 TMAX 无差异
25 TMAXS gelu_pto TMAXS 无差异
26 TMINS gelu_pto TMINS 无差异
27 TMUL gelu_pto, reduceprod×2 TMUL 无差异
28 TMULS broadcast_pto, concat×2, gelu_pto, transpose TMULS 无差异
29 TSUB concat×2, transpose TSUB 无差异

统计:完全缺失 7 条 · 需要修改 13 条 · 一致 9 条。


§1 完全缺失(当前编译器无对应 API)

1.1 TREMS — 标量取余

使用算子:broadcast_pto.hpp

PTO ISA 签名

template <auto PrecisionType = RemSAlgorithm::DEFAULT,
          typename TileDataDst, typename TileDataSrc,
          typename TileDataTmp, typename... WaitEvents>
PTO_INST RecordEvent TREMS(TileDataDst &dst, TileDataSrc &src,
                           typename TileDataSrc::DType scalar,
                           TileDataTmp &tmp, WaitEvents &... events);

当前编译器:无 TREMS。最接近的是 TREM(dst, src0, src1)(tile-tile),但:

维度 PTO ISA TREMS 当前编译器 TREM
操作形式 tile ÷ 标量 tile ÷ tile
tmp 参数
PrecisionType 有(DEFAULT / HIGH_PRECISION
支持类型 A5: float, int32, uint32, half, int16, uint16 int32, int16(不支持 uint32)

需补充:新增 TREMS API,包含 tmp/PrecisionType 参数,支持 uint32_t


1.2 TINSERT — tile 子区域写入

使用算子:broadcast_vec_019_pto.hpp, broadcast_vec_039_pto.hpp

PTO ISA 签名

template <typename DstTileData, typename SrcTileData, typename... WaitEvents>
PTO_INST RecordEvent TINSERT(DstTileData &dst, SrcTileData &src,
                             uint16_t indexRow, uint16_t indexCol,
                             WaitEvents &... events);

行为dst[indexRow+i, indexCol+j] = src[i,j]

当前编译器:无 TINSERT。仅有反向操作 TEXTRACT(dst, src, offset_i, offset_j)(从大 tile 中读取子区域),无写入子区域的操作。

需补充:新增 TINSERT API,与 TEXTRACT 对称。


1.3 TCOLMAX — 列向最大值归约

使用算子:reducemax_colvec.hpp, reducemax_colvec_unalign_120_8.hpp

PTO ISA 签名

template <typename TileDataOut, typename TileDataIn, typename... WaitEvents>
PTO_INST RecordEvent TCOLMAX(TileDataOut &dst, TileDataIn &src,
                             WaitEvents &... events);

行为dst[0, j] = max(src[i, j]) for all i(沿列方向取 max)

当前编译器:无 TCOLMAX。有行向 TROWMAX 但无列向对应。template_asm.hTCOLMAX_TEPL 内联汇编但不在标准 API 中。

需补充:新增 TCOLMAX API。


1.4 TCOLPROD — 列向乘积归约

使用算子:reduceprod_colvec.hpp

PTO ISA 签名

template <typename TileDataOut, typename TileDataIn, typename... WaitEvents>
PTO_INST RecordEvent TCOLPROD(TileDataOut &dst, TileDataIn &src,
                              WaitEvents &... events);

行为dst[0, j] = prod(src[i, j]) for all i(沿列方向取乘积)

当前编译器:无 TCOLPROD。也无 TROWPROD。归约类只有 TROWSUM/TROWMAX

需补充:新增 TCOLPROD API。


1.5 TCOLSUM — 列向求和归约

使用算子:reducesum_colvec.hpp, reducesum_colvec_unalign_120_8.hpp, reducesum_colvec_single_tree.hpp

PTO ISA 签名(两个重载):

// 简单形式
template <typename TileDataOut, typename TileDataIn, typename... WaitEvents>
PTO_INST RecordEvent TCOLSUM(TileDataOut &dst, TileDataIn &src,
                             WaitEvents &... events);

// 带 tmp + isBinary 的重载
template <typename TileDataOut, typename TileDataIn, typename TileDataTmp, typename... WaitEvents>
PTO_INST RecordEvent TCOLSUM(TileDataOut &dst, TileDataIn &src,
                             TileDataTmp &tmp, bool isBinary,
                             WaitEvents &... events);

行为dst[0, j] = sum(src[i, j]) for all i(沿列方向求和)

当前编译器:无 TCOLSUM。有行向 TROWSUM 但无列向对应。template_asm.hTCOLSUM_TEPL 内联汇编但不在标准 API 中。

需补充:新增 TCOLSUM API(含 tmp+isBinary 重载)。


1.6 TROWPROD — 行向乘积归约

使用算子:reduceprod_rowvec.hpp

PTO ISA 签名

template <typename TileDataOut, typename TileDataIn, typename TileDataTmp, typename... WaitEvents>
PTO_INST RecordEvent TROWPROD(TileDataOut &dst, TileDataIn &src,
                              TileDataTmp &tmp, WaitEvents &... events);

行为dst[i, 0] = prod(src[i, j]) for all j(沿行方向取乘积)

当前编译器:无 TROWPROD。有 TROWSUM/TROWMAX 但无 TROWPROD

需补充:新增 TROWPROD API(含 tmp 参数)。


1.7 TMOV — 通用 tile 拷贝/转换

使用算子:concat_gather.hpp, concat_scatter.hpp, transpose.hpp, reducesum_rowvec_single_tree.hpp, reducemax_rowvec_single_tree.hpp

PTO ISA 签名(6 个变体,核心形式):

// Variant 1: Standard Move (纯拷贝)
template <typename DstTileData, typename SrcTileData, typename... WaitEvents>
PTO_INST RecordEvent TMOV(DstTileData &dst, SrcTileData &src,
                          WaitEvents &... events);

// Variant 2: ReLU Move
TMOV<..., reluMode>(dst, src, events...);

// Variant 3: Accumulator-to-Vector
TMOV<..., mode, reluMode>(dst, src, events...);

// Variant 4: Vector-Quant Move (通过 fix-pipe 量化)
TMOV<..., FpTileData, mode, reluMode>(dst, src, fp, events...);

// Variant 5: Scalar-Quant Move
TMOV<..., reluMode>(dst, src, preQuantScalar, events...);

// Variant 6: Fix-Pipe Move (TMOV_FP)
TMOV_FP(dst, src, fp, events...);

行为:通用 tile 间数据拷贝/转换,支持 ReLU、量化、Acc→Vec 转换等多种模式。

当前编译器:无通用 TMOVjcore/template_asm.hpp 仅有专用布局转换变体(TMOV_DN2NZ, TMOV_DN2ZN, TMOV_NZ2DN 等),不支持通用 tile 间拷贝。TCOPY(dst, src) 仅支持同类型同布局拷贝。

需补充:新增通用 TMOV API,支持不同 tile 类型间拷贝和转换。


§2 需要修改(API 存在但名称或参数不完整)

2.1 MGATHER — 按索引从 global memory 取数

使用算子:broadcast_pto, concat_gather, gather_pto, transpose

维度 PTO ISA 当前编译器 (template_asm.h)
模板参数 <Coalesce Mode, GatherOOB Oob, ...> 无模式参数
Coalesce 模式 Row(按行 gather)/ Elem(逐元素 gather) 无选择
GatherOOB Undefined / Clamp / Wrap / Zero
索引语义 Coalesce::Elem:按元素索引 dst[i,j]=src[idx[i,j]]Coalesce::Row:按行索引 dst[r,:]=table[idx[r],:] 字节偏移取数

需修改:增加 Coalesce/GatherOOB 模板参数;增加 Coalesce::RowCoalesce::Elem 模式;统一索引语义(元素索引)。


2.2 MSCATTER — 按索引写回 global memory

使用算子:concat_scatter.hpp

维度 PTO ISA 当前编译器 (template_asm.h)
模板参数 <Coalesce, ScatterAtomicOp, ScatterOOB, [ScatterConflict], ...>
Coalesce Row / Elem
ScatterAtomicOp None / 原子操作模式
ScatterOOB Undefined / Clamp / Wrap / Zero
ScatterConflict Last 等(仅 A5) 无(A2A3 无此参数)
索引语义 行索引或元素索引 字节偏移

需修改:增加 Coalesce/ScatterAtomicOp/ScatterOOB/ScatterConflict 模板参数;统一索引语义。


2.3 TCVT — 类型转换

使用算子:gelu_pto.hpp

维度 PTO ISA 当前编译器
签名 4 个重载(带/不带 tmp × 带/不带 SaturationMode) TCVT(dst, src) 仅一种形式
RoundMode CAST_RINT / CAST_ROUND / CAST_FLOOR / CAST_CEIL / CAST_TRUNC
SaturationMode ON / OFF(可选)
tmp 参数 有(可选重载)

需修改:增加 RoundMode(必选)、SaturationMode(可选)、tmp(可选重载)参数。


2.4 TDIVS — 标量整除

使用算子:broadcast_pto, concat_gather, concat_scatter, transpose

维度 PTO ISA 当前编译器
PrecisionType DivAlgorithm::DEFAULT / HIGH_PRECISION
反向重载 有:TDIVS(dst, scalar, src0)(scalar ÷ tile)

需修改:增加 PrecisionType 模板参数;增加反向重载。


2.5 TEXP — 指数运算

使用算子:gelu_pto.hpp

维度 PTO ISA 当前编译器
PrecisionType ExpAlgorithm::DEFAULT / HIGH_PRECISION

需修改:增加 PrecisionType 模板参数。


2.6 TRECIP — 倒数

使用算子:gelu_pto.hpp

维度 PTO ISA 当前编译器
PrecisionType RecipAlgorithm::DEFAULT / HIGH_PRECISION

需修改:增加 PrecisionType 模板参数。


2.7 TROWMAX — 行向最大值归约

使用算子:reducemax_rowvec.hpp, reducemax_rowvec_single_tree.hpp

维度 PTO ISA 当前编译器
签名 TROWMAX(dst, src, tmp, events...) TROWMAX(tile_shape_out &dst, tile_shape_in &src)
tmp 参数 有:TileDataTmp &tmp

需修改:增加 tmp 参数。


2.8 TROWSUM — 行向求和归约

使用算子:reducesum_rowvec.hpp, reducesum_rowvec_single_tree.hpp

维度 PTO ISA 当前编译器
签名 TROWSUM(dst, src, tmp, events...) TROWSUM(tile_shape_out &dst, tile_shape_in &src)
tmp 参数 有:TileDataTmp &tmp

需修改:增加 tmp 参数。


2.9 TTRANS — 转置

使用算子:transpose.hpp, transpose_vector_007.hpp

维度 PTO ISA 当前编译器
签名 TTRANS(dst, src, tmp, events...) TTRANS(tile_shape_out &dst, tile_shape_in &src)
tmp 参数 有:TileDataTmp &tmp

需修改:增加 tmp 参数。


2.10 TLOAD — 从 global memory 加载到 tile

使用算子:全部 24 个算子

维度 PTO ISA 当前编译器
函数名 TLOAD TCOPYIN
核心参数 (dst, src) (dst, src) — 一致
行为 GM → UB GM → UB — 一致

需修改:重命名为 TLOAD(保留 TCOPYIN 为 deprecated 别名)。


2.11 TSTORE — tile 写回 global memory

使用算子:全部 24 个算子

维度 PTO ISA 当前编译器
函数名 TSTORE TCOPYOUT
AtomicType AtomicNone(默认)/ 原子写模式
preQuantScalar 重载 有:TSTORE(dst, src, preQuantScalar, events...)
核心参数 (dst, src) (dst, src) — 一致

需修改:重命名为 TSTORE;增加 AtomicType 模板参数;增加 preQuantScalar 重载。


2.12 TEXPANDS — 标量广播填充 tile

使用算子:全部 24 个算子

维度 PTO ISA 当前编译器
函数名 TEXPANDS TEXPANDSCALAR
核心参数 (dst, scalar) (dst, s) — 一致
行为 dst[i,j] = scalar 同 — 一致

需修改:重命名为 TEXPANDS(保留旧名别名)。


2.13 TROWEXPAND — 行广播

使用算子:broadcast_vec_07_pto.hpp

维度 PTO ISA 当前编译器
函数名 TROWEXPAND TEXPANDROW
核心参数 (dst, src) (dst, src) — 一致
行为 dst[i,j] = src[i,0] 同 — 一致
shape 约束 src.ValidRow == dst.ValidRowsrc.ValidCol 可 < dst.ValidCol 同(已有独立模板参数 tile_shape_out/tile_shape_in,支持不同 ValidCol)

需修改:重命名为 TROWEXPAND(保留旧名别名)。


§3 名称和核心参数一致

以下 9 条指令的函数名、核心参数列表、行为语义与 PTO ISA 文档一致,不需要修改

# 指令 PTO ISA 签名 当前编译器签名 行为
1 TCI TCI(dst, start) <int descending> TCI(dst, s) <int descending> dst[i] = start + i(升序)
2 TADD TADD(dst, src0, src1) TADD(dst, src0, src1) dst[i] = src0[i] + src1[i]
3 TADDS TADDS(dst, src0, scalar) TADDS(dst, src, s) dst[i] = src[i] + scalar
4 TMAX TMAX(dst, src0, src1) TMAX(dst, src0, src1) dst[i] = max(src0[i], src1[i])
5 TMAXS TMAXS(dst, src, scalar) TMAXS(dst, src, s) dst[i] = max(src[i], scalar)
6 TMINS TMINS(dst, src, scalar) TMINS(dst, src, s) dst[i] = min(src[i], scalar)
7 TMUL TMUL(dst, src0, src1) TMUL(dst, src0, src1) dst[i] = src0[i] * src1[i]
8 TMULS TMULS(dst, src0, scalar) TMULS(dst, src, s) dst[i] = src[i] * scalar
9 TSUB TSUB(dst, src0, src1) TSUB(dst, src0, src1) dst[i] = src0[i] - src1[i]

§4 修改优先级

P0 — 阻塞算子表达(无法写出 PTO 代码)

指令 问题 阻塞的算子
TREMS 完全缺失 broadcast_pto
TINSERT 完全缺失 broadcast_vec_019, broadcast_vec_039
TCOLMAX 完全缺失 reducemax_colvec×2
TCOLSUM 完全缺失 reducesum_colvec×3
TCOLPROD 完全缺失 reduceprod_colvec
TROWPROD 完全缺失 reduceprod_rowvec
TMOV 完全缺失 concat×2, transpose, reducesum_rowvec_single, reducemax_rowvec_single
TCVT RoundMode gelu_pto
MGATHER Coalesce 模式 + 索引语义不同 broadcast_pto, concat_gather, gather, transpose
MSCATTER Coalesce 模式 + 索引语义不同 concat_scatter

P1 — 语义不完整(可写但表达力受限)

指令 问题
TLOAD/TSTORE/TEXPANDS/TROWEXPAND 名称不同,PTO 代码无法直接编译
TDIVS/TEXP/TRECIP PrecisionType
TROWMAX/TROWSUM/TTRANS tmp 参数
TSTORE AtomicType/preQuantScalar

§5 统计总结

统计项 数量
PTO 算子使用指令总数 29
完全缺失(需新增 API) 7
需要修改(名称或参数不完整) 13
名称和核心参数一致 9
涉及的算子文件总数 24

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions