跳到主要内容

TME 与异步数据搬运

目标架构为 mp_31__MUSA_ARCH__ == 310)。本章说明 MTCC MP31 operation 的 descriptor、tile、barrier 和流水线协作方式,不提供省略定义的 standalone 异步 kernel。

正确的异步顺序

  1. producer 获取 empty barrier;
  2. 为本次 TME load 记录准确的 transaction bytes;
  3. 发起 tile、block 或 im2col load;
  4. producer arrival 并保存 phase;
  5. consumer 等待 full barrier 的 phase 后再读取 shared tile;
  6. consumer 释放 stage,流水线才可复用它。

transaction bytes 是完成条件,不是性能 hint。过大可能永久等待,过小会使 consumer 提前读取未完成数据。

Barrier builtin 规则

void __musa_async_init_arrival(int32_t barrier_id,
int32_t arrival_count,
int32_t initial_phase);
void __musa_async_add_trans(int32_t barrier_id, int32_t transaction_bytes);
int32_t __musa_async_arrive(int32_t barrier_id);
void __musa_async_wait(int32_t barrier_id, int32_t phase);
void __musa_async_decrease_trans(int32_t barrier_id,
int32_t transaction_bytes);

__musa_async_arrivebarrier_id 必须为 1–63;0 保留。不要让部分线程 跳过同一个 barrier 的 arrival 或 wait;decrease_trans 只能释放此前添加的 字节数。

Tile、block 与 im2col

MP31 覆盖 rank 1–5 tile load/store、block load/store 和 3D–5D im2col load。 descriptor、rank vector、coordinate vector、shared destination 和 barrier 参数 必须使用同一 rank 的 operation;不要手写不同 rank 的整数布局。

prefetch-only builtin 只产生 cache hint,不写 shared memory,也不返回可等待 phase。它不能替换真实 TME load。

Pipeline

每个 stage 配对 full/empty barrier:full 表示 TME 已完成生产,empty 表示所有 consumer 已释放、producer 可以覆盖 stage。producer acquire、load、arrival、 consumer wait、计算和 release 必须处于一致控制流中。

编译与排查

使用 --offload-arch=mp_31 编译。发生错误时依次检查 descriptor rank、tile alignment、transaction bytes、barrier ID、phase 和 stage reuse。若 shape、 alignment 或架构不满足约束,应保留普通 load/store 回退;不要把后续架构 builtin 当作 MP31 接口。