TRESHAPE¶
指令示意图¶
简介¶
将Tile重新解释为另一种Tile类型/形状,同时保留底层字节。
数学语义¶
除非另有说明,语义定义在有效区域上,目标相关行为标记为实现定义。
汇编语法¶
%dst = treshape %src : !pto.tile<...>
AS Level 1(SSA)¶
%dst = pto.treshape %src : !pto.tile<...> -> !pto.tile<...>
AS Level 2(DPS)¶
pto.treshape 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 TileDataOut, typename TileDataIn, typename... WaitEvents>
PTO_INST RecordEvent TRESHAPE(TileDataOut &dst, TileDataIn &src, WaitEvents &... events);
约束¶
由 TRESHAPE_IMPL 强制执行:
- Tile类型必须匹配:
TileDataIn::Loc == TileDataOut::Loc。 - 总字节大小必须匹配:
sizeof(InElem) * InNumel == sizeof(OutElem) * OutNumel。 - 不允许boxed/non-boxed转换:
- 不能在
SLayout::NoneBox与boxed布局之间进行reshape。
- 不能在
备注¶
- CPU模拟:实现为按字节拷贝到
dst。 - Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品:实现为别名(
TASSIGN_IMPL(dst, src.data())),因此dst和src引用同一底层存储。
示例¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example() {
using Src = Tile<TileType::Vec, float, 16, 16>;
using Dst = Tile<TileType::Vec, float, 8, 32>;
static_assert(Src::Numel == Dst::Numel);
Src src;
Dst dst;
TRESHAPE(dst, src);
}
汇编示例(ASM)¶
自动模式¶
# 自动模式:由编译器/运行时负责资源放置与调度。
%dst = pto.treshape %src : !pto.tile<...> -> !pto.tile<...>
手动模式¶
# 手动模式:先显式绑定资源,再发射指令。
# 可选(当该指令包含 tile 操作数时):
# pto.tassign %arg0, @tile(0x1000)
# pto.tassign %arg1, @tile(0x2000)
%dst = pto.treshape %src : !pto.tile<...> -> !pto.tile<...>
PTO汇编形式¶
%dst = pto.treshape %src : !pto.tile<...> -> !pto.tile<...>
# AS Level 2 (DPS)
pto.treshape ins(%src : !pto.tile_buf<...>) outs(%dst : !pto.tile_buf<...>)