TROWARGMIN¶
指令示意图¶
简介¶
获取每行最小值对应列索引,或同时获取每行最小值及其对应列索引。
数学语义¶
设 R = src.GetValidRow(),C = src.GetValidCol()。对 0 <= i < R:
\[ \mathrm{dst}_{i,0} = \underset{0 \le j < C}{\operatorname{argmin}} \; \mathrm{src}_{i,j} \]
\[ \mathrm{dstval}_{i,0} = \min_{0 \le j < C} \mathrm{src}_{i,j} \]
汇编语法¶
同步形式:
%dst = trowargmin %src : !pto.tile<...> -> !pto.tile<...>
Lowering may introduce internal scratch tiles; the C++ intrinsic requires an explicit tmp operand.
IR Level 1(SSA)¶
%dst = pto.trowargmin %src, %tmp : (!pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>
IR Level 2(DPS)¶
pto.trowargmin ins(%src, %tmp : !pto.tile_buf<...>, !pto.tile_buf<...>) outs(%dst : !pto.tile_buf<...>)
C++内建接口¶
声明于 include/pto/common/pto_instr.hpp:
公共包含头为
<pto/pto-inst.hpp>,内部声明位于pto/common/pto_instr.hpp。
仅输出索引:
template <typename TileDataOut, typename TileDataIn, typename TileDataTmp, typename... WaitEvents>
PTO_INST RecordEvent TROWARGMIN(TileDataOut& dst, TileDataIn& src, TileDataTmp& tmp, WaitEvents&... events);
同时输出值和索引:
template <typename TileDataOutVal, typename TileDataOutIdx, typename TileDataIn, typename TileDataTmp,
typename... WaitEvents>
PTO_INST RecordEvent TROWARGMIN(TileDataOutVal &dstVal, TileDataOutIdx &dstIdx, TileDataIn &src, TileDataTmp &tmp,
WaitEvents &... events);
约束¶
通用约束或检查¶
- 支持的源元素类型:
half、float、int32_t、int16_t(A2A3)。A5 接受任意 2/4 字节源(half、bfloat16_t、int16_t、uint16_t、float、int32_t、uint32_t)。 src必须使用标准ND布局:行主且非分形(BLayout::RowMajor、SLayout::NoneBox)。- 仅输出索引时:
-
dst和src必须为TileType::Vec。- 支持的目标元素类型:
uint32_t、int32_t。 - 运行时检查遵循共享的行归约检查路径:
src.GetValidRow() != 0src.GetValidCol() != 0src.GetValidRow() == dst.GetValidRow()
dst通过共享的行归约索引检查路径约束,可使用以下任一非分形布局:- 单列DN布局(
BLayout::ColMajor、Cols == 1),或 - 有效列数为1的ND布局。
- 单列DN布局(
- 支持的目标元素类型:
- 同时输出值和索引时:
dstVal、dstIdx、src必须为TileType::Vec。dstVal的元素类型必须与src的元素类型一致。- 支持的目标元素类型:
- 源元素类型为
float时,支持uint32_t、int32_t。 - 源元素类型为
half时,支持uint16_t、int16_t。
- 源元素类型为
- 运行时检查遵循共享的行归约检查路径:
src.GetValidRow() != 0src.GetValidCol() != 0src.GetValidRow() == dstIdx.GetValidRow()src.GetValidRow() == dstVal.GetValidRow()
dstVal、dstIdx通过共享的行归约索引检查路径约束,可使用以下任一非分形布局:- 单列DN布局(
BLayout::ColMajor、Cols == 1),或 - 有效列数为1的ND布局。
- 单列DN布局(
tmp临时Tile相关说明¶
- 仅Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品使用
tmp临时Tile,Ascend 950PR/Ascend 950DT接收tmp但实际并不使用。 - Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品实现根据
srcValidCol与elementPerRepeat(以下缩写为elemPerRpt)的关系选择三条代码路径之一:
情况1:srcValidCol <= elemPerRpt¶
- 仅输出索引模式:
tmp不使用。硬件vcmin指令直接写入dst。 - 值+索引模式:
tmp用作小型缓冲区(每行2个元素:一个值 + 一个索引)。tmp可使用以下任一非分形布局:- 单列DN布局(
BLayout::ColMajor、Cols == 1),有效行数为srcValidRow * 2。 - 有效行数为
srcValidRow且有效列数为2的ND布局。
- 单列DN布局(
情况2:elemPerRpt < srcValidCol <= elemPerRpt²(单阶段归约)¶
tmp被使用于单阶段归约。tmptile的行数与src相同。tmptile每行所需stride按以下公式计算:
R1 = ceil(srcValidCol / elemPerRpt)
stride = (ceil(R1 * 2 / elemPerBlock) + ceil(R1 / elemPerBlock)) * elemPerBlock
情况3:srcValidCol > elemPerRpt²(两阶段归约)¶
tmp被使用于两阶段归约,所需空间大于单阶段。tmptile的行数与src相同。tmptile每行所需stride按以下公式计算:
R1 = ceil(srcValidCol / elemPerRpt)
R2 = ceil(R1 / elemPerRpt)
stage1_size = ceil(R1 * 2 / elemPerBlock) * elemPerBlock
stage2_end = ceil(R1 / elemPerBlock) * elemPerBlock + ceil(R2 * 2 / elemPerBlock) * elemPerBlock
stride = max(stage1_size, stage2_end) + 2
+ 2用于存放每行tmp区域末尾的最终值+索引结果。
示例¶
自动(Auto)¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example_auto() {
using SrcT = Tile<TileType::Vec, float, 16, 16>;
using DstT = Tile<TileType::Vec, float, 16, 1, BLayout::ColMajor>;
using DstValT = Tile<TileType::Vec, float, 16, 1, BLayout::ColMajor>;
using TmpT = Tile<TileType::Vec, float, 16, 16>;
SrcT src;
DstT dstIdx;
DstValT dstVal;
TmpT tmp;
TROWARGMIN(dstIdx, src, tmp);
TROWARGMIN(dstVal, dstIdx, src, tmp);
}
手动(Manual)¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example_manual() {
using SrcT = Tile<TileType::Vec, float, 16, 16>;
using DstT = Tile<TileType::Vec, float, 16, 1, BLayout::ColMajor>;
using DstValT = Tile<TileType::Vec, float, 16, 1, BLayout::ColMajor>;
using TmpT = Tile<TileType::Vec, float, 16, 16>;
SrcT src;
DstT dstIdx;
DstValT dstVal;
TmpT tmp;
TASSIGN(src, 0x1000);
TASSIGN(dstIdx, 0x2000);
TASSIGN(dstVal, 0x3000);
TASSIGN(tmp, 0x4000);
TROWARGMIN(dstIdx, src, tmp);
TROWARGMIN(dstVal, dstIdx, src, tmp);
}
汇编示例(ASM)¶
自动模式¶
# 自动模式:由编译器/运行时负责资源放置与调度。
%dst = pto.trowargmin %src, %tmp : (!pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>
手动模式¶
# 手动模式:先显式绑定资源,再发射指令。
# 可选(当该指令包含 tile 操作数时):
# pto.tassign %arg0, @tile(0x1000)
# pto.tassign %arg1, @tile(0x2000)
%dst = pto.trowargmin %src, %tmp : (!pto.tile<...>, !pto.tile<...>) -> !pto.tile<...>
PTO汇编形式¶
%dst = trowargmin %src : !pto.tile<...> -> !pto.tile<...>
# IR Level 2 (DPS)
pto.trowargmin ins(%src, %tmp : !pto.tile_buf<...>, !pto.tile_buf<...>) outs(%dst : !pto.tile_buf<...>)