TPOP

简介

TPipe FIFO中弹出消费者tile,用于Cube-Vector通信。

本指令支持两类数据的弹出,分别为Tile类型的数据和GlobalTensor类型的数据。所以分别设计了基于Tile 重载和 GlobalTensor 重载。

操作语义

对于TileData流程:

  1. TPUSH(Pipe&, TileData&) 将生产者tile存入当前FIFO槽位,并为消费者记录数据就绪同步。(注:Split为模板参数)生产者tile索引在槽位地址计算完成后递增。
  2. TPOP(Pipe&, TileData&, Split) 等待生产者的数据就绪同步,将当前FIFO槽位加载到消费者tile中。消费者tile索引在槽位地址计算完成后递增。
  3. TFREE(Pipe&, Split) 释放FIFO中的槽位空间。Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品平台上此接口为空操作(TPOP 已在内部执行空闲空间通知),Ascend 950PR/Ascend 950DT平台上会释放 TPOP 使用的FIFO槽位空间。

对于GlobalData流程:

  1. TALLOC(Pipe&, GlobalData&)TPipe 中分配一个生产者FIFO槽位,并将其暴露为 GlobalTensor 视图。生产者可通过 TSTORE 等指令向该槽位写入数据。
  2. TPUSH(Pipe&, GlobalData&) 为已经由 TALLOC 分配的槽位记录数据就绪同步,将FIFO槽位提交给消费者。它本身不会存储tile数据。
  3. TPOP(Pipe&, GlobalData&) 等待数据就绪,将 gmTensor 赋值为当前FIFO槽位地址,并递增消费者tile索引。它不会将数据加载到本地tile,也不会释放槽位。消费者可通过 TLOAD 等指令从槽位中读取数据。
  4. TFREE(Pipe&, GlobalData&) 释放由 TPOP(Pipe&, GlobalData&) 返回的FIFO槽位视图,通知生产者该槽位空间已空闲。

C++ Intrinsic

声明位置:include/pto/common/pto_instr.hpp

template <typename Pipe, typename TileCons, TileSplitAxis Split,
          std::enable_if_t<is_tile_data_v<TileCons>, int> = 0, typename... WaitEvents>
PTO_INST RecordEvent TPOP(Pipe &pipe, TileCons &tile, WaitEvents &... events);

template <typename Pipe, typename GlobalData, TileSplitAxis Split,
          std::enable_if_t<is_global_data_v<GlobalData>, int> = 0, typename... WaitEvents>
PTO_INST RecordEvent TPOP(Pipe &pipe, GlobalData &gmTensor, WaitEvents &... events);

Pipe 通常是 include/pto/npu/a2a3/TPush.hppinclude/pto/npu/a5/TPush.hpp 中声明的 TPipe

template <uint8_t FlagID, uint8_t DirType, uint32_t SlotSize, uint32_t SlotNum,
          uint32_t LocalSlotNum = 2, bool IsNoSplit = false, bool EN_UNIT_FLAG = false>
struct TPipe;

约束

  • Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品TileData消费者
    • TileCons::Loc 必须是 TileType::VecTileType::MatTileType::Ctrl
    • Direction::DIR_C2V:vector消费cube生产的数据。
    • Direction::DIR_V2C:cube消费vector生产的数据。
    • Direction::DIR_BOTH:同一个pipe类型同时支持C2V和V2C消费者。
  • 本地消费者缓冲区
    • 对于C2V vector消费者,TPipe 会将tile分配到 C2V_CONSUMER_BUF,并使用本地FIFO轮转。
    • 对于V2C matrix消费者,TPipe 会将tile分配到 V2C_CONSUMER_BUF,并使用本地FIFO轮转。
  • 切分行为
    • TileSplitAxis::TILE_NO_SPLIT:不进行切分,Atlas A2/A3 训练系列产品/Atlas A2/A3 推理系列产品上需要AIV0/AIV1陪跑核间同步操作。
    • TileSplitAxis::TILE_UP_DOWN:消费上下两个行半区。
    • TileSplitAxis::TILE_LEFT_RIGHT:消费左右两个列半区。
  • 同步
    • 每次 TPOP 都会执行数据就绪等待。
    • 空闲空间通知是稀疏的,并由 Pipe::SyncPeriod 控制。
  • GlobalData槽位视图
    • gmTensor 会被赋值为由 pipe.cons.tileIndex 选择的FIFO槽位基地址。
    • 对于C2V分裂模式,会根据 Split 应用向量子块偏移。
    • 从槽位视图完成所有加载后,调用者必须调用 TFREE(Pipe&, GlobalData&)

示例

C2V Vector Pop

#include <pto/pto-inst.hpp>

using namespace pto;

template <typename T>
AICORE void example_c2v(__gm__ void *fifoMem)
{
    constexpr uint32_t M = 128;
    constexpr uint32_t N = 128;
    constexpr uint32_t FlagID = 0;
    constexpr uint32_t FifoDepth = 2;
    constexpr uint32_t LocalBase = 0x0;

    using Pipe = TPipe<FlagID, Direction::DIR_C2V, M * N * sizeof(T), FifoDepth>;
    using VecTile = Tile<TileType::Vec, T, M / 2, N, BLayout::RowMajor, M / 2, N>;

    Pipe pipe(fifoMem, LocalBase, 0x0); // C2V 模式:第二参数为 C2V 消费者缓冲基址,第三参数为 V2C 消费者缓冲基址(此处为 0)
    VecTile tile;

    TPOP<Pipe, VecTile, TileSplitAxis::TILE_UP_DOWN>(pipe, tile);
}

V2C Matrix Pop

#include <pto/pto-inst.hpp>

using namespace pto;

template <typename T>
AICORE void example_v2c(__gm__ void *fifoMem)
{
    constexpr uint32_t M = 128;
    constexpr uint32_t N = 128;
    constexpr uint32_t FlagID = 0;
    constexpr uint32_t FifoDepth = 2;
    constexpr uint32_t LocalBase = 0x0;

    using Pipe = TPipe<FlagID, Direction::DIR_V2C, M * N * sizeof(T), FifoDepth>;
    using MatTile = Tile<TileType::Mat, T, M, N, BLayout::ColMajor, M, N, SLayout::RowMajor, 512>;

    Pipe pipe(fifoMem, 0x0, LocalBase);
    MatTile tile;

    TPOP<Pipe, MatTile, TileSplitAxis::TILE_NO_SPLIT>(pipe, tile);
}

GlobalData槽位弹出

#include <pto/pto-inst.hpp>

using namespace pto;

template <typename T>
AICORE void example_globaldata(__gm__ void *fifoMem)
{
    constexpr uint32_t M = 128;
    constexpr uint32_t N = 128;
    constexpr uint32_t FlagID = 0;
    constexpr uint32_t FifoDepth = 2;

    using Pipe = TPipe<FlagID, Direction::DIR_C2V, M * N * sizeof(T), FifoDepth>;
    using SlotGlobal = GlobalTensor<T, Shape<1, 1, 1, M / 2, N>, Stride<1, 1, 1, N, 1>>;
    using VecTile = Tile<TileType::Vec, T, M / 2, N, BLayout::RowMajor, M / 2, N>;

    Pipe pipe(fifoMem, 0x0, 0x0);
    SlotGlobal slot;
    VecTile tile;
    TASSIGN(tile, 0x0);

    TPOP<Pipe, SlotGlobal, TileSplitAxis::TILE_UP_DOWN>(pipe, slot);
    TLOAD(tile, slot);
    TFREE<Pipe, SlotGlobal, TileSplitAxis::TILE_UP_DOWN>(pipe, slot);
}

ASM形式示例

当前公开的汇编参考尚未为 TPOP 定义稳定的PTO-AS写法。手写CV FIFO程序时请使用C++ intrinsic形式。