TME 与异步数据搬运
目标架构为 mp_31(__MUSA_ARCH__ == 310)。本章说明 MTCC MP31 operation
的 descriptor、tile、barrier 和流水线协作方式,不提供省略定义的 standalone
异步 kernel。
正确的异步顺序
- producer 获取 empty barrier;
- 为本次 TME load 记录准确的 transaction bytes;
- 发起 tile、block 或 im2col load;
- producer arrival 并保存 phase;
- consumer 等待 full barrier 的 phase 后再读取 shared tile;
- 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_arrive 的 barrier_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 接口。

