Skip to content

PTO ISA 与编译器/Linx ISA 表达完备性对比(29 条指令:编译器缺失 7 + Linx ISA 缺失 2 + PTO 独有功能分析) #19

Description

@flaviomarix

PTO ISA 与当前编译器 C++ API 表达完备性对比

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

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


汇总列表

# 类别 PTO ISA 指令 使用算子 当前编译器 Linx ISA 差异要点(编译器 / Linx ISA vs PTO ISA)
1 编译器缺失 + Linx 缺失 TINSERT vec_019, vec_039 ❌ 不存在 编译器无 API / Linx ISA 无此指令,仅有反向 TEXTRACT
2 编译器缺失 + Linx 有 TREMS broadcast_pto ✅ 存在 编译器无 API / Linx 有但缺 PTO 的 tmp+PrecisionType
3 TCOLMAX reducemax_colvec×2 ✅ 存在 编译器无 API / Linx 功能一致
4 TCOLPROD reduceprod_colvec ✅ 存在 编译器无 API / Linx 功能一致
5 TCOLSUM reducesum_colvec×3 ✅ 存在 编译器无 API / Linx 有但缺 PTO 的 tmp+isBinary 重载
6 TROWPROD reduceprod_rowvec ✅ 存在 编译器无 API / Linx 有但缺 PTO 的 tmp
7 TMOV concat×2, transpose, reducesum_rowvec_single, reducemax_rowvec_single ✅ 存在 编译器仅有专用 TMOV_DN2NZ / Linx 有 Layout 变换但缺 PTO 的 ReLU/量化/Acc→Vec 变体
8 需要修改 MGATHER broadcast_pto, concat_gather, gather, transpose template_asm.h (部分) ✅ 存在 编译器缺 Coalesce/GatherOOB / Linx 缺 Coalesce 模式,仅有 PadValue,索引为字节偏移非元素索引
9 MSCATTER concat_scatter template_asm.h (部分) ✅ 存在 编译器缺 Coalesce/ScatterAtomicOp/ScatterOOB/ScatterConflict / Linx 均无,OOB 直接跳过
10 TCVT gelu_pto TCVT (缺参数) ✅ 存在 编译器缺 RoundMode/SaturationMode/tmp / Linx 有 RMode(8种)+Sat(比 PTO 更丰富),但无 tmp
11 TDIVS broadcast_pto, concat×2, transpose TDIVS (缺参数) ✅ 存在 编译器缺 PrecisionType+反向重载 / Linx 均无
12 TEXP gelu_pto TEXP (缺参数) ✅ 存在 编译器缺 PrecisionType / Linx 无
13 TRECIP gelu_pto TRECIP (缺参数) ✅ 存在 编译器缺 PrecisionType / Linx 无
14 TROWMAX reducemax_rowvec×2 TROWMAX (缺 tmp) ✅ 存在 编译器缺 tmp / Linx 无 tmp
15 TROWSUM reducesum_rowvec×2 TROWSUM (缺 tmp) ✅ 存在 编译器缺 tmp / Linx 无 tmp
16 TTRANS transpose, transpose_vector_007 TTRANS (缺 tmp) ✅ 存在 编译器缺 tmp / Linx 无 tmp,但有 DepSrc/Dst 依赖槽(PTO 用 WaitEvents
17 TLOAD 全部算子 TCOPYIN (名不同) ✅ 存在 编译器名称不同 / Linx 有 Layout(NORM/ND2NZ/…)+Stride+DepSrc/Dst(PTO 无)
18 TSTORE 全部算子 TCOPYOUT (名不同) ✅ 存在 编译器名称不同,缺 AtomicType/preQuantScalar / Linx 有 Layout+Stride+DepSrc/Dst,但无原子/量化
19 TEXPANDS 全部算子 TEXPANDSCALAR (名不同) ✅ 存在 编译器名称不同 / Linx 功能一致
20 TROWEXPAND vec_07 TEXPANDROW (名不同) ✅ 存在 编译器名称不同 / Linx 基本功能一致,PTO 有 ADD/SUB/MUL/DIV/MAX/MIN/EXPDIF 融合变体
21 一致 TCI broadcast_pto, concat×2, transpose TCI ❌ 不存在 编译器 API 一致 / Linx ISA 无此指令,编译器当前用 __vec__ 模拟
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 ✅ 存在 无差异

统计

  • 编译器 vs PTO ISA:完全缺失 7 条 · 需要修改 13 条 · 一致 9 条
  • Linx ISA vs PTO ISA:缺失 2 条(TCI/TINSERT) · 存在差异 14 条 · 完全相同 13 条
  • 关键结论:编译器"缺失"的 7 条中,5 条是 Linx ISA 有但编译器未实现(TREMS/TCOLMAX/TCOLPROD/TCOLSUM/TROWPROD),1 条是 Linx ISA 有但仅有专用形式(TMOV),仅 1 条是 Linx ISA 本身就没有(TINSERT)。TCI 编译器有 API 但 Linx ISA 无硬件指令。

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

1.1 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 中读取子区域),无写入子区域的操作。

Linx ISA 状态:❌ 不存在。Linx ISA 张量指令集中无 TINSERT,也无类似子区域写入指令。

影响:这是ISA 级缺口——Linx ISA 和编译器都没有。broadcast_vec_019/039 使用 TINSERT 将输入 tile 插入输出 tile 的多个列偏移位置。替代方案:用 TMOV + 手动地址偏移,或用 MGATHER 从 GM 直接取数。

需补充:编译器需用其他指令组合模拟(Linx ISA 无硬件指令支持)。


1.2 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)

Linx ISA 状态:✅ 存在。Linx ISA 有 TREMS 指令(BSTART.TEPL TREMS, DataType),基本功能 dst[i] = src[i] % scalar 完整,支持 b64/b32/b16/b8 全类型(含 uint32)。

PTO vs Linx ISA 差异

维度 PTO ISA Linx ISA
基本功能 dst[i] = src[i] % scalar 同 — 一致
tmp 参数 有(A2A3 路径需要)
PrecisionType DEFAULT / HIGH_PRECISION
支持类型 A5: float, int32, uint32, half, int16, uint16 b64/b32/b16/b8 全类型(更广)

PTO 多出功能的应用场景

  • tmp:A2A3 平台取余实现路径需要临时 tile。当前算子 broadcast_pto 未显式使用,但 A2A3 后端实现需要。
  • PrecisionType::HIGH_PRECISION:数值敏感场景的取余精度选择。当前算子未用。

需补充:直接按 Linx ISA 的 TREMS 指令编码实现编译器 API(Linx ISA 已有硬件指令,编译器只是没实现)。


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 中。

Linx ISA 状态:✅ 存在。Linx ISA 有 TCOLMAX 指令(BSTART.TEPL TCOLMAX, DataType),功能与 PTO ISA 完全一致。

需补充:直接按 Linx ISA 指令实现编译器 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。归约类只有 TROWSUM/TROWMAX

Linx ISA 状态:✅ 存在。Linx ISA 有 TCOLPROD 指令,功能与 PTO ISA 完全一致。

需补充:直接按 Linx ISA 指令实现编译器 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 中。

Linx ISA 状态:✅ 存在。Linx ISA 有 TCOLSUM 指令(BSTART.TEPL TCOLSUM, DataType),基本功能完整。

PTO vs Linx ISA 差异

维度 PTO ISA Linx ISA
基本功能 列向求和 同 — 一致
tmp+isBinary 重载 有(A2A3 路径需要临时 tile + 二进制树求和标志)

PTO 多出功能的应用场景

  • tmp+isBinary:A2A3 平台的树形归约优化路径。当前算子未显式使用。

需补充:按 Linx ISA 指令实现编译器 API,可选支持 PTO 的 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

Linx ISA 状态:✅ 存在。Linx ISA 有 TROWPROD 指令,基本功能完整。

PTO vs Linx ISA 差异

维度 PTO ISA Linx ISA
基本功能 行向乘积归约 同 — 一致
tmp 参数 有(A2A3 路径需要)

需补充:按 Linx ISA 指令实现编译器 API。


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) 仅支持同类型同布局拷贝。

Linx ISA 状态:✅ 存在。Linx ISA 有 TMOV 指令(BSTART.TMA TMOV, DataType),支持 Layout 变换(NORM/NZ2ND/NZ2ZN 等)和 PadValue

PTO vs Linx ISA 差异

维度 PTO ISA Linx ISA
标准拷贝 ✅ Variant 1 Layout=NORM
布局变换 ❌ 无(PTO 用独立指令 TMOV_DN2NZ 等) Layout=ND2NZ
ReLU 拷贝 ✅ Variant 2 ❌ 无
Acc→Vec 转换 ✅ Variant 3 ❌ 无
量化拷贝 ✅ Variant 4/5/6 ❌ 无

PTO 多出功能的应用场景

  • TMOV ReLU 变体:矩阵乘输出后 ReLU 激活(融合,省一条指令)。当前算子未用。
  • TMOV Acc→Vec:GEMM 输出从 Acc 转 Vec 再做后处理。当前算子未用。
  • TMOV 量化变体:量化推理中 Acc→int8 的融合量化路径。当前算子未用。

:Linx ISA 的 TMOVLayout 变换功能,PTO ISA 文档中布局变换用独立指令(TMOV_DN2NZ 等)。双方各有对方没有的功能。

需补充:编译器可直接按 Linx ISA 的 TMOV 指令实现通用拷贝 API;ReLU/量化变体需编译器扩展(Linx ISA 无对应硬件功能,可能需 fix-pipe 路径)。


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

2.1 MGATHER — 按索引从 global memory 取数

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

维度 PTO ISA 当前编译器 (template_asm.h) Linx ISA
Coalesce 模式 Row(按行 gather)/ Elem(逐元素 gather) 无选择 — 只有一种模式
GatherOOB Undefined / Clamp / Wrap / Zero PadValue(Null/Zero/Max/Min)
索引语义 Row: 行索引;Elem: 元素索引 字节偏移 字节偏移(u16/u32/u64)
OOB 语义 Clamp 钳位、Wrap 取模、Zero 填零、Undefined 不检查 PadValue 填固定值,无 Clamp/Wrap

PTO vs Linx ISA 关键差异:Linx ISA 的 MGATHER 仅有字节偏移模式,无 Coalesce 模式选择。PTO ISA 的 Coalesce::Row(按行索引取整行,DMA 合并)和 Coalesce::Elem(逐元素索引)在 Linx ISA 中无法表达。

PTO 多出功能的应用场景

PTO 多出的功能 作用 当前算子是否用到 其他应用场景
Coalesce::Row 一个行索引取整行,DMA 合并 ✅ gather_pto Embedding lookup、KV-cache 读取
Coalesce::Elem 每个元素独立索引 ✅ broadcast_pto、concat_gather、transpose 随机索引取数
GatherOOB::Clamp 越界索引钳到合法范围 Embedding lookup 中 padding 处理
GatherOOB::Wrap 越界索引取模绕回 循环缓冲区读取、哈希表查找
GatherOOB::Zero 越界位置填零 变长序列 padding(attention mask)
元素索引语义 调用方无需手动乘 sizeof ✅ 全部用 MGATHER 的算子 所有逐元素 gather 场景

需修改:增加 Coalesce/GatherOOB 模板参数;增加 Coalesce::RowCoalesce::Elem 模式;统一索引语义(元素索引)。其中 Coalesce 模式是 PTO ISA 独有的,Linx ISA 无对应硬件功能,编译器需在软件层模拟或扩展硬件。


2.2 MSCATTER — 按索引写回 global memory

使用算子:concat_scatter.hpp

维度 PTO ISA 当前编译器 (template_asm.h) Linx ISA
Coalesce 模式 Row / Elem
ScatterAtomicOp None / Add / Max / Min
ScatterOOB Undefined / Skip / Clamp / Wrap OOB 直接跳过(等价 Skip
ScatterConflict (A5) Last / Default
索引语义 行索引或元素索引 字节偏移 字节偏移

PTO 多出功能的应用场景

PTO 多出的功能 作用 当前算子是否用到 其他应用场景
ScatterAtomicOp::Add 原子加法 scatter 梯度累积(分布式训练中多个 worker 向同一参数 buffer 原子累加梯度)
ScatterAtomicOp::Max 原子取最大 scatter NMS(非极大值抑制)中按索引更新最大值
ScatterAtomicOp::Min 原子取最小 scatter 距离场计算中按索引更新最小值
ScatterConflict::Last 确定性冲突解决 A5 SIMT 并行 scatter 需要确定性结果
Coalesce::Row 按行 scatter 反向 embedding lookup、KV-cache 更新

需修改:增加模式参数;统一索引语义。ScatterAtomicOp/ScatterConflict 是 PTO ISA 独有,Linx ISA 无对应硬件功能。


2.3 TCVT — 类型转换

使用算子:gelu_pto.hpp

维度 PTO ISA 当前编译器 Linx ISA
签名 4 个重载(带/不带 tmp × 带/不带 SaturationMode) TCVT(dst, src) 仅一种 有完整 RMode+Sat
RoundMode CAST_RINT/CAST_ROUND/CAST_FLOOR/CAST_CEIL/CAST_TRUNC(5种) RNONE/RNE/RTZ/RDN/RUP/RNA/RTO/RHB8种,更丰富
SaturationMode ON / OFF(可选) Sat 标志(功能一致)
tmp 参数 有(可选重载)

PTO vs Linx ISA 关键差异:Linx ISA 的 RMode 比 PTO ISA RoundMode 多 3 种RNONE/RNA/RTO/RHB),表达力更强。PTO ISA 多出 tmp 参数(A2A3 路径需要)。

PTO 多出功能的应用场景

  • tmp 参数:A2A3 平台 fp16↔fp32 转换需要临时 tile。✅ gelu_pto 直接使用(fp16↔fp32)。

需修改:增加 RoundMode(必选,可直接映射 Linx ISA 的 RMode)、SaturationMode(可选)、tmp(可选重载)。


2.4 TDIVS — 标量整除

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

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

PTO 多出功能的应用场景

  • HIGH_PRECISION:需要数值精度的场景(如 LayerNorm 中的均值/方差计算)。当前算子未用。
  • 反向重载:归一化中 scale / x 的场景。当前算子未用。

需修改:增加 PrecisionType 模板参数;增加反向重载。Linx ISA 无 PrecisionType,编译器需在软件层模拟高精度模式。


2.5 TEXP — 指数运算

使用算子:gelu_pto.hpp

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

PTO 多出功能的应用场景

  • HIGH_PRECISION:GELU/Softmax 中 exp 的精度影响数值稳定性。当前算子 gelu_pto 使用默认精度。

需修改:增加 PrecisionType 模板参数。Linx ISA 无此参数,编译器需在软件层模拟。


2.6 TRECIP — 倒数

使用算子:gelu_pto.hpp

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

PTO 多出功能的应用场景

  • HIGH_PRECISION:1/x 计算中避免精度损失(如 softmax 分母 1/(1+exp))。当前算子 gelu_pto 使用默认精度。

需修改:增加 PrecisionType 模板参数。Linx ISA 无此参数。


2.7 TROWMAX — 行向最大值归约

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

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

PTO vs Linx ISA 差异:PTO ISA 有 tmp 参数(A2A3 路径需要临时 tile 存中间结果),Linx ISA 无。

PTO 多出功能的应用场景

  • tmp:A2A3 平台归约需要临时 tile。当前算子未显式传 tmp。A5 平台 tmp 接受但不参与约束。

需修改:增加 tmp 参数。Linx ISA 无此参数,编译器对 A2A3 需自行分配临时 tile。


2.8 TROWSUM — 行向求和归约

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

维度 PTO ISA 当前编译器 Linx ISA
签名 TROWSUM(dst, src, tmp, events...) TROWSUM(dst, src) TROWSUM(dst, src) — 无 tmp
tmp 参数

同 TROWMAX,PTO 多出 tmp(A2A3 路径)。需修改:增加 tmp 参数。


2.9 TTRANS — 转置

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

维度 PTO ISA 当前编译器 Linx ISA
签名 TTRANS(dst, src, tmp, events...) TTRANS(dst, src) TTRANS(dst, src) — 无 tmp
tmp 参数
依赖槽 WaitEvents DepSrc/Dst 依赖槽

PTO vs Linx ISA 差异:PTO 有 tmp,Linx 无。Linx 有 DepSrc/Dst 依赖槽(PTO 用 WaitEvents 代替)。

需修改:增加 tmp 参数。


2.10 TLOAD — 从 global memory 加载到 tile

使用算子:全部 24 个算子

维度 PTO ISA 当前编译器 Linx ISA
函数名 TLOAD TCOPYIN TLOAD
核心参数 (dst, src) (dst, src) — 一致 (dst, src) + Layout + Stride + DepSrc/Dst
Layout 变换 无(PTO 用独立指令) NORM/ND2NZ/ND2ZN/DN2NZ/DN2ZN
Stride RegSrc1 跨步参数

PTO vs Linx ISA 差异:Linx ISA 的 TLOAD 功能更丰富——支持加载时做布局变换(ND2NZ 等)和跨步访存,PTO ISA 无这些功能。

需修改:重命名为 TLOAD(保留 TCOPYIN 为 deprecated 别名)。编译器可利用 Linx ISA 的 Layout/Stride 增强功能。


2.11 TSTORE — tile 写回 global memory

使用算子:全部 24 个算子

维度 PTO ISA 当前编译器 Linx ISA
函数名 TSTORE TCOPYOUT TSTORE
AtomicType AtomicNone(默认)/ 原子写
preQuantScalar 有重载
Layout 变换 NORM/NZ2ND/ZN2ND
Stride RegSrc1 跨步

PTO vs Linx ISA 差异双方各有对方没有的功能。PTO 有 AtomicType/preQuantScalar(Linx 无);Linx 有 Layout/Stride(PTO 无)。

PTO 多出功能的应用场景

  • AtomicType:原子更新参数(分布式训练)、原子累加输出。当前算子未用。
  • preQuantScalar:量化推理中 fp32→int8 写回时融合量化,减少一次单独量化 pass。当前算子未用。

需修改:重命名为 TSTORE;增加 AtomicType/preQuantScalar(Linx ISA 无对应硬件功能)。


2.12 TEXPANDS — 标量广播填充 tile

使用算子:全部 24 个算子

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

Linx ISA 状态:✅ 存在,功能完全一致。

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


2.13 TROWEXPAND — 行广播

使用算子:broadcast_vec_07_pto.hpp

维度 PTO ISA 当前编译器 Linx ISA
函数名 TROWEXPAND TEXPANDROW TROWEXPAND
核心参数 (dst, src) (dst, src) — 一致 (dst, src) — 一致
行为 dst[i,j] = src[i,0]
融合变体 TROWEXPANDADD/SUB/MUL/DIV/MAX/MIN/EXPDIF Linx ISA 导航显示有同名变体

PTO 多出功能的应用场景

PTO 多出的功能 作用 当前算子是否用到 其他应用场景
TROWEXPANDADD 广播+加法融合:dst[i,j] = src0[i,j] + src1[i,0] Softmax 中行最大值广播+减法、LayerNorm 中均值广播+减法
TROWEXPANDMUL 广播+乘法融合 Softmax 中行求和广播+除法、scale 乘法
TROWEXPANDEXPDIF 广播+exp(差)融合 Softmax 中 exp(x - row_max) 一步完成

:这些融合变体对 Softmax/LayerNorm 等归约+广播模式算子非常有价值,可将"归约→广播→逐元素运算"三步融合为两步。

需修改:重命名为 TROWEXPAND;可选支持融合变体。


§3 名称和核心参数一致

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

# 指令 PTO ISA 签名 当前编译器签名 Linx 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]

TCI 特殊说明:编译器 API 与 PTO ISA 一致,但 Linx ISA 无此硬件指令。编译器当前用 __vec__ 块模拟实现(jcore/TCI.hpp)。若要真正一层化,需用其他 Linx ISA 指令组合(如 TEXPANDS + TADDS 迭代)或扩展硬件 ISA。

Linx ISA 通用特性:Linx ISA 张量指令普遍有 PadValue(OOB 填充值:Null/Zero/Max/Min)参数,PTO ISA 文档未显式提及此参数。PadValue 是 Linx ISA 的通用机制,不改变核心计算语义。


§4 修改优先级

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

指令 问题 Linx ISA 是否有 阻塞的算子
TREMS 编译器无 API ✅ 有 broadcast_pto
TINSERT 编译器无 API ❌ 无(ISA 级缺口) broadcast_vec_019, broadcast_vec_039
TCOLMAX 编译器无 API ✅ 有 reducemax_colvec×2
TCOLSUM 编译器无 API ✅ 有 reducesum_colvec×3
TCOLPROD 编译器无 API ✅ 有 reduceprod_colvec
TROWPROD 编译器无 API ✅ 有 reduceprod_rowvec
TMOV 编译器无通用 API ✅ 有(Layout 变换版) concat×2, transpose, reducesum_rowvec_single, reducemax_rowvec_single
TCVT RoundMode ✅ 有(RMode+Sat gelu_pto
MGATHER Coalesce 模式 + 索引语义不同 ✅ 有(但无 Coalesce) broadcast_pto, concat_gather, gather, transpose
MSCATTER Coalesce 模式 + 索引语义不同 ✅ 有(但无 Coalesce) concat_scatter

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

指令 问题 Linx ISA 是否有
TLOAD/TSTORE/TEXPANDS/TROWEXPAND 名称不同,PTO 代码无法直接编译 ✅ 有(名称一致)
TDIVS/TEXP/TRECIP PrecisionType ✅ 有(但无 PrecisionType)
TROWMAX/TROWSUM/TTRANS tmp 参数 ✅ 有(但无 tmp)
TSTORE AtomicType/preQuantScalar ✅ 有(但无原子/量化)

P2 — PTO ISA 独有功能扩展(Linx ISA 无对应硬件功能)

PTO 多出的功能 应用场景 Linx ISA 状态
MGATHER::Coalesce (Row/Elem) gather、broadcast、concat、transpose — 当前算子直接使用 ❌ 无
MSCATTER::ScatterAtomicOp (Add/Max/Min) 梯度累积、NMS、距离场 ❌ 无
MSCATTER::ScatterConflict A5 并行 scatter 确定性 ❌ 无
TSTORE::preQuantScalar 量化推理融合写回 ❌ 无
TROWEXPAND 融合变体 (ADD/SUB/MUL/EXPDIF) Softmax、LayerNorm 归约+广播融合 需验证
TMOV ReLU/量化变体 GEMM 后处理融合 ❌ 无
PrecisionType (TEXP/TRECIP/TDIVS) 数值敏感场景(Softmax/LayerNorm/GELU) ❌ 无
TCI 索引序列生成 — broadcast_pto 直接使用 ❌ 无(ISA 级缺口)
TINSERT tile 子区域写入 — vec_019/039 直接使用 ❌ 无(ISA 级缺口)

§5 统计总结

统计项 数量
PTO 算子使用指令总数 29
编译器 vs PTO ISA:完全缺失(需新增 API) 7
编译器 vs PTO ISA:需要修改(名称或参数不完整) 13
编译器 vs PTO ISA:一致 9
Linx ISA vs PTO ISA:缺失(ISA 级缺口) 2(TCI/TINSERT)
Linx ISA vs PTO ISA:存在差异 14
Linx ISA vs PTO ISA:完全相同 13
编译器缺失中 Linx ISA 有的(可直接实现) 6(TREMS/TCOLMAX/TCOLPROD/TCOLSUM/TROWPROD/TMOV)
编译器缺失中 Linx ISA 也没有的(ISA 级缺口) 1(TINSERT)
编译器有 API 但 Linx ISA 无硬件指令的 1(TCI)
PTO ISA 独有功能(Linx ISA 无对应) Coalesce/ScatterAtomicOp/PrecisionType/tmp/融合变体/AtomicType/preQuantScalar
涉及的算子文件总数 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