TPAIRREDUCESUM¶
指令示意图¶
简介¶
对源 Tile 中每两个相邻元素求和(Pair-Reduction),并将结果写入目标 Tile 的下半部分。该指令使用 vcpadd 向量对加法原语,对每个对索引 k 计算 src0[i, 2k] + src0[i, 2k+1],将归约后的值打包存储到每行的位置 0 … ⌈validCols/2⌉−1。目标行上半部分(位置 ⌈validCols/2⌉ … validCols−1)的元素填充为 0。无效元素(有效区域之外的位置)也视为 0。
数学语义¶
给定源 Tile src0 和目标 Tile dst,两者具有相同的有效形状 (validRows, validCols),对于每行 i 和对索引 k:
\[ \mathrm{dst}_{i,k} = \mathrm{src0}_{i, 2k} + \mathrm{src0}_{i, 2k+1}, \quad 0 \le k < \left\lceil \frac{\mathrm{validCols}}{2} \right\rceil \]
dst 每行中位置 ⌈validCols/2⌉ … validCols−1 的元素填充为 0。无效元素(有效区域之外的位置)也视为 0。
其中 validRows = dst.GetValidRow() 且 validCols = dst.GetValidCol()。
汇编语法¶
PTO-AS 形式:参见 PTO-AS 规范。
同步形式:
%dst = tpairreducesum %src : !pto.tile<...>
AS Level 1(SSA)¶
%dst = pto.tpairreducesum %src : !pto.tile<...> -> !pto.tile<...>
AS Level 2(DPS)¶
pto.tpairreducesum ins(%src : !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 TileDataDst, typename TileDataSrc0, typename... WaitEvents>
PTO_INST RecordEvent TPAIRREDUCESUM(TileDataDst &dst, TileDataSrc0 &src0, WaitEvents &...events);
约束¶
- 实现检查 (A2A3 & A5):
TileData::DType必须为float或half。- Tile 布局必须是行主序(
TileData::isRowMajor)。 dst和src0必须具有相同的DType。src0必须与dst具有相同的有效形状(src0.GetValidRow() == dst.GetValidRow()且src0.GetValidCol() == dst.GetValidCol())。
- 有效区域:
- 该操作使用
dst.GetValidRow()/dst.GetValidCol()作为迭代域。 - 每个目标行的下半部分(位置
0 … ⌈validCols/2⌉−1)存储对归约结果;上半部分(位置⌈validCols/2⌉ … validCols−1)填充为 0。有效区域之外的无效元素也视为 0。
- 该操作使用
示例¶
自动(Auto)¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example_auto() {
using TileDst = Tile<TileType::Vec, float, 16, 32>;
using TileSrc = Tile<TileType::Vec, float, 16, 64>;
TileDst dst(16, 32);
TileSrc src0(16, 32);
TPAIRREDUCESUM(dst, src0);
}
手动(Manual)¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example_manual() {
using TileDst = Tile<TileType::Vec, half, 16, 64, BLayout::RowMajor, 16, 64>;
using TileSrc = Tile<TileType::Vec, half, 16, 128, BLayout::RowMajor, 16, 128>;
TileDst dst;
TileSrc src0;
TASSIGN(src0, 0x1000);
TASSIGN(dst, 0x2000);
TPAIRREDUCESUM(dst, src0);
}
汇编示例(ASM)¶
自动模式¶
# 自动模式:由编译器/运行时负责资源放置与调度。
%dst = pto.tpairreducesum %src : !pto.tile<...> -> !pto.tile<...>
手动模式¶
# 手动模式:先显式绑定资源,再发射指令。
# 可选(当该指令包含 tile 操作数时):
# pto.tassign %src, @tile(0x1000)
# pto.tassign %dst, @tile(0x2000)
%dst = pto.tpairreducesum %src : !pto.tile<...> -> !pto.tile<...>
PTO 汇编形式¶
%dst = tpairreducesum %src : !pto.tile<...>
# AS Level 2 (DPS)
pto.tpairreducesum ins(%src : !pto.tile_buf<...>) outs(%dst : !pto.tile_buf<...>)
相关指令¶
- TDeInterleave - 反交织将偶/奇位置拆分;TPAIRREDUCESUM 将相邻对求和。
- TInterleave - 交织将两个源的元素交替组合为统一流。