TSYNC¶
指令示意图¶
简介¶
同步 PTO 执行(等待事件或插入每操作流水线屏障)。
TSYNC(events...)等待一组显式事件令牌。TSYNC<Op>()为单个向量操作类插入流水线屏障。
include/pto/common/pto_instr.hpp 中的许多内建函数在发射指令前会在内部调用 TSYNC(events...)。
数学语义¶
不适用。
汇编语法¶
PTO-AS 形式:参见 PTO-AS 规范。
Event operand form:
tsync %e0, %e1 : !pto.event<...>, !pto.event<...>
Single-op barrier form:
tsync.op #pto.op<TADD>
AS Level 1(SSA)¶
// Level 1 (SSA) does not support explicit synchronization primitives.
AS Level 2(DPS)¶
pto.record_event[src_op, dst_op, eventID]
// 支持的op:TLOAD, TSTORE_ACC,TSTORE_VEC,TMOV_M2L,TMOV_M2S,TMOV_M2B,TMOV_M2V,TMOV_V2M,TMATMUL,TVEC
pto.wait_event[src_op, dst_op, eventID]
// 支持的op:TLOAD, TSTORE_ACC,TSTORE_VEC,TMOV_M2L,TMOV_M2S,TMOV_M2B,TMOV_M2V,TMOV_V2M,TMATMUL,TVEC
pto.barrier(op)
// 支持的op:TVEC,TMATMUL
C++ 内建接口¶
声明于 include/pto/common/pto_instr.hpp:
template <Op OpCode>
PTO_INST void TSYNC();
template <typename... WaitEvents>
PTO_INST void TSYNC(WaitEvents &... events);
约束¶
- 实现检查(
TSYNC<Op>()):TSYNC_IMPL<Op>()仅支持向量流水线操作(include/pto/common/event.hpp中通过static_assert(pipe == PIPE_V)强制执行)。
TSYNC(events...)语义:TSYNC(events...)调用WaitAllEvents(events...),后者对每个事件令牌调用events.Wait()。
示例¶
自动(Auto)¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example_auto(__gm__ float* in) {
using TileT = Tile<TileType::Vec, float, 16, 16>;
using GShape = Shape<1, 1, 1, 16, 16>;
using GStride = BaseShape2D<float, 16, 16, Layout::ND>;
using GT = GlobalTensor<float, GShape, GStride, Layout::ND>;
GT gin(in);
TileT t;
Event<Op::TLOAD, Op::TADD> e;
e = TLOAD(t, gin);
TSYNC(e);
}
手动(Manual)¶
#include <pto/pto-inst.hpp>
using namespace pto;
void example_manual() {
using TileT = Tile<TileType::Vec, float, 16, 16>;
TileT a, b, c;
Event<Op::TADD, Op::TSTORE_VEC> e;
e = TADD(c, a, b);
TSYNC<Op::TADD>();
TSYNC(e);
}
汇编示例(ASM)¶
自动模式¶
# 自动模式:由编译器/运行时负责资源放置与调度。
%result = pto.tsync ...
手动模式¶
# 手动模式:先显式绑定资源,再发射指令。
# 可选(当该指令包含 tile 操作数时):
# pto.tassign %arg0, @tile(0x1000)
# pto.tassign %arg1, @tile(0x2000)
%result = pto.tsync ...
PTO 汇编形式¶
tsync %e0, %e1 : !pto.event<...>, !pto.event<...>
# AS Level 2 (DPS)
pto.record_event[src_op, dst_op, eventID]