Sangeeta Chowdhary, Ryan Swann, Sean Siddens, Muhammad Osama, Stephen Neuendorffer, Alexandru Dutu, Karthik Sangaiah, Sandeepa Bhuyan, Samuel Bayliss, Ganesh Dasika (AMD Research) | 2026-04 | https://arxiv.org/abs/2604.15379 Category: framework (primary) | Secondary tags: kernel, megakernel, persistent-kernel, chiplet, amd-mi350, cdna-isa, l2-locality, scheduler, runtime, llm-decode Read: 2026-04-21
Fleet 在 CUDA/HIP 的 wavefront → workgroup → grid 三层执行抽象之上补上了第四层 Chiplet-task(对应 AMD MI300/350 的 XCD 边界 + 4 MB 私有 L2),并以持久化 megakernel + 每 XCD 软件调度器 + 两级事件同步 + M-major 协作式 tile 遍历,把 8 颗 XCD 上本来互相踩踏的 L2 cache 变成协作复用的 L2,在 Qwen3-8B decode 上把 bs=1–16 比 vLLM 快 1.3–1.5×、bs=32 L2 hit rate 从 39% 提到 51%、HBM 读带宽降低 37%。
现代 chiplet GPU(AMD MI300X/MI350 八颗 XCD 各自 4 MB 私有 L2;NV Blackwell 双 die)物理上把 L2 切碎了,CUDA/HIP 却还把 L2 当整块设备级资源暴露——结果 LLM decode 时 8 颗 XCD 各自独立把同一份权重从 HBM 拉进自己的 L2,把 40 MB L2 当成 4 MB 用。Fleet 做了三件事:(1) 在任务抽象里新增 Chiplet-task 绑定 "一颗 XCD + 其 L2 working set";(2) 以 Mirage MPK 为基础实现持久化 megakernel,每颗 XCD 留一个 workgroup 做软件调度器,剩下 31 个做 worker,消除 250 次/token 的 kernel launch;(3) 用 M-major windowed 遍历 + cache-streaming 修饰符 让同 XCD 内多个 worker 共享同一个权重列,配合两级事件计数把 248 次 cross-chiplet fence 砍成 8 次。端到端数字:Qwen3-8B bs=1 decode 6.73 ms/token (vLLM 10.51 ms),bs=32 L2 hit 38.9% → 51.0%、HBM 读降 18%,bs=64 HBM 读降 37%。
Q1 (痛点):现代 chiplet GPU 的 L2 cache 物理分区 + 非相干(MI350 8 × 4 MB),但 CUDA/HIP 编程模型仍把 L2 当作设备级共享资源——LLM decode 时每个 XCD 独立从 HBM 拉同一份权重到各自 L2,L2 带宽被浪费;叠加每 token 250 次 kernel launch,小 batch 下调度开销主导延迟。
Q2 (方法):提出四级任务抽象(wavefront / CU / Chiplet / device),新增的 Chiplet-task 把"一颗 XCD + 其 4 MB L2"作为显式作用域;以 Mirage MPK 为基础搭建持久化 megakernel + 每 XCD 软件调度器 + 两级事件同步(intra-XCD 无 fence / 仅"最后一人"出 fence)+ M-major 协作式 tile 遍历 + CDNA 三档 cache modifier(cache-streaming 权重 / NT bypass 激活 / volatile 调度通信)。区别前作:HazyResearch MegaKernel / FlashFormer / Mirage MPK 都假设 L2 是 monolithic;HipKittens 做了 XCD-aware 但只优化单 kernel。
Q3 (结果):MI350 + Qwen3-8B dense bf16:bs=1 decode 6.73 ms/token(vLLM 10.51 ms,1.56× 加速),bs=1–16 普遍 1.3–1.5× 快于 vLLM;bs=32 L2 hit rate 38.9% → 51.0%,HBM 读流量 3,906 GB → 3,190 GB (−18%);bs=64 L2 hit 61.4%,HBM 读 6,203 GB → 3,925 GB (−37%)。Ablation 证明:小 batch 的加速来自 Chiplet-task 调度(543 任务 vs 1,407)降低 dispatch overhead;大 batch 的加速来自 M-major 协作式 L2 复用;bs ≥ 64 Fleet 进入 compute-bound 后反而慢于 hipBLASLt(未实现 K-split)。
动机:LLM decode 是 memory-bound(Qwen3-8B 每层权重 368 MB,激活仅 1 MB)且 kernel-launch-bound(36 层 × 近 7 op = 250 次 launch/token)。monolithic GPU 时代解决方案是 persistent megakernel(HazyResearch、Mirage),但 2024–2026 的 MI300X / MI350 / Blackwell 都走了 chiplet 设计——AMD 8 颗 XCD 各有 4 MB 私有 L2,跨 XCD 不相干;NV Blackwell 2 die 各有 L2 分区(逻辑上相干但物理 NUMA)。CUDA/HIP 语法里没有 chiplet 这一层概念,标准 GEMM dispatch 把 workgroup 均匀撒到 8 颗 XCD,每颗 XCD 独立把完整权重拉进自己 4 MB L2 → L2 被 reload 8 次,HBM 带宽被浪费。
方法:Fleet = 任务模型 + 运行时 + 代码生成三件套。(1)任务模型:四级任务 wavefront-task / CU-task / Chiplet-task / device-task,其中 Chiplet-task 是全新的一层,把"一颗 XCD 上所有 31 个 worker + 4 MB L2"当成原子单位。GEMM 按输出列 N-split 给 8 个 Chiplet-task,每个 XCD 的 31 个 worker 按 M-major windowed traversal 协作把 R=min(31, m_tiles) 个 M-tile 打包处理同一个权重列,从 HBM 只读一次权重就可以喂多个 M-tile → L2 hit 率解析式 (R-1)/R。(2)运行时:基于 Mirage MPK 改造,launch 一个 megakernel 占满所有 256 CU,每颗 XCD 1 个 workgroup 做 scheduler、31 个做 worker,scheduler 通过 HW_ID 寄存器发现自己在哪颗 XCD。两级事件同步:intra-XCD worker 对 L[xcd][e] 做 device-scope atomic(无 fence,因为 L2 内相干),只有 last-worker-per-XCD 出一次 buffer_wbl2 + GPU-scope atomic 更新 HBM 全局 G[e] → 248 次 fence 降到 8 次/事件(W=31 倍 reduction)。三档 cache modifier:权重用 sc1=1 nt=1(cache-streaming,短暂驻留)、激活 NT=1(bypass L2,不驱逐权重)、调度通信 volatile。(3)代码生成:在 Mirage 编译器里为 Chiplet-task 补上新的节点描述符,为每个 XCD 生成 base_ptr + k × (N/8) × K × sizeof(bf16) 的 pointer。
结果:AMD MI350X + Qwen3-8B dense bf16,与 vLLM v0.17.2 eager + Mirage MPK (chiplet-unaware) 对比。Fleet 在 bs=1 decode 6.73–6.82 ms/token(vLLM 10.51 ms, 1.56×;Mirage 7.83 ms, 1.16×);bs=32 L2 hit 从 Mirage 的 38.9% 升至 51.0%、HBM 读减 18%;bs=64 L2 hit 61.4%、HBM 读减 37%。核心 ablation:M-split 变体(有 Chiplet-task 但 XCD 间不共享权重)在 bs=1–16 与 M-tile 打平(证明此区间加速来自 dispatch 减少),bs ≥ 32 差距打开(证明 L2 协作式复用独立于 dispatch)。bs ≥ 64 Fleet 被 vLLM 反超,因为 Fleet 的 GEMM 没实现 wave-level K-split,compute-bound 时 hipBLASLt 占优。
buffer_wbl2 会把 Infinity Fabric 打爆;Fleet 把 fence 次数压到每事件 8 次(仅 last-worker-per-XCD),31× 减少是 persistent megakernel 在 MI350 成立的前置条件。m_tiles ≥ 2(即 B ≥ 2 × T_M);当 batch 小于 T_M 时协作失效,只剩 dispatch-overhead 这一个加速源。
What it shows: MI350 的物理封装——8 颗 XCD 各自 32 CU + 私有 4 MB L2,经 Infinity Fabric Crossbar 连到共享的 256 MB Infinity Cache (LLC),再连到 8 组 HBM3。
Why it matters: 论文所有论证的起点。CUDA/HIP 把 L2 视为单块设备级缓存,但物理上 MI350 的 L2 是 8 个不相干的 4 MB 分区——这是 chiplet-unaware scheduling 产生 L2 miss storm 的根本原因。
Detailed description: 顶部 8 个方框代表 8 个 XCD(仅画 XCD 0/1/6/7),每个方框里有 32 个 CU 小方格 + 一个 4 MB L2 绿色标签。所有 XCD 通过中间灰色 "Infinity Fabric Crossbar" 连接到下方的 256 MB Infinity Cache (LLC) 黄色条,LLC 再往下连到 8 个 HBM stack。跨 XCD 的数据访问必须穿过 Crossbar → LLC → HBM,延迟显著高于 L2-local。
| Compute | Memory | CUDA/HIP | Fleet |
|---|---|---|---|
| SIMD | Register file | Wavefront | Wavefront-task |
| CU/SM | LDS | Workgroup | CU-task |
| Chiplet | L2 cache | — | Chiplet-task |
| Device | HBM | Device | Device-task |
Takeaway: 一张表把论文的全部新意说清楚——CUDA/HIP 在 chiplet 这一层是空白的,Fleet 用 Chiplet-task 填进去。
| Metric | Linear | Attention |
|---|---|---|
| % of decode time | 95% | 5% |
| Weight working set / layer | 368 MB | — |
| Weight per XCD (uniform) | 46 MB | — |
| XCD L2 cache capacity | 4 MB | 4 MB |
| L2 hit rate (bs=1, no coop.) | 16.4% | — |
| Cycles per task | ~104K | ~3.8K |
Takeaway: Linear/GEMM 占 95% 时间;每 XCD 分到 46 MB 权重而 L2 只有 4 MB(11.5× overshoot),没有协作时 L2 hit 仅 16.4%——Fleet 的所有优化都围绕这 95% 的时间展开。
| BS | Mirage L2% | Fleet M-tile L2% | Fleet M-split L2% | Mirage HBM Rd | Fleet M-tile HBM Rd | Fleet M-split HBM Rd |
|---|---|---|---|---|---|---|
| 1 | 16.4% | 16.9% | 17.0% | 1.00× | 0.98× | 0.99× |
| 8 | 20.0% | 20.8% | 20.8% | 1.00× | 1.00× | 1.01× |
| 16 | 22.2% | 23.7% | 23.5% | 1.00× | 0.97× | 0.98× |
| 32 | 38.9% | 51.0% | 39.5% | 1.00× | 0.82× | 1.10× |
| 64 | 39.0% | 61.4% | 47.4% | 1.00× | 0.63× | 1.20× |
Takeaway: bs=32/64 M-tile 与 M-split 的分叉是全篇最关键的单点证据——证明 L2 协作式复用(而非仅 Chiplet-task 调度)才是大 batch 下的加速源。bs=64 HBM 读从 1.00× 降到 0.63×(−37%)。
Fleet 运行时 = 1 次 kernel launch → 8 颗 XCD × (1 scheduler + 31 worker) 持续运行直到整个 decode sequence 结束。
| Stage | Input → Output | 位置 | 延迟 | 数据尺寸 |
|---|---|---|---|---|
| kernel launch (一次性) | host → GPU | PCIe | ~10 μs | 一次 |
| scheduler 读 task descriptor | HBM → L2 | 每 XCD L2 local | ~ns | 一条 descriptor |
| scheduler 分派 Chiplet-task | L2 → per-worker queue | L2 | ~ns | pointer + tile_idx |
| worker 执行 GEMM tile | HBM → L2 → registers → MFMA | 每 XCD L2 + CU | ~1–3 μs | T_M×K×2 B 权重 |
| worker → L[xcd][e] atomic | L2 | L2 local | ~ns | 1 int |
| last-worker → G[e] atomic | L2 → HBM (buffer_wbl2) | Infinity Fabric | ~100s ns | 1 int × 8 writers |
| scheduler poll G[e] | HBM non-temporal | Fabric | ~100s ns | 1 int × 8 readers |
控制面 vs 数据面:scheduler 是控制面(只做 pointer 运算、计数器读写),全都在 L2 local 或 HBM non-temporal;worker 是数据面(MFMA + HBM weight fetch)。分离得很干净,没有共享的同步热点。
state:task descriptor 表在 HBM 中只读(launch 前填好);per-worker queue 和 event counters 是运行时可变 state。
失败恢复:论文不处理(单 GPU 推理、persistent kernel 作用域 = 一次 generate 调用);如果 worker hang 或 XCD power event 导致 kernel abort,整个 generate 失败,由上层 serving framework 重试。
2025 下半年起 LLM 推理优化的"低垂果实"——continuous batching / paged attention / 算子融合 / FlashAttn-3——基本采完,研究重心转向两个方向:(a) 跨 op 持久化内核(HazyResearch MegaKernel 2025-05、FlashFormer 2025-05、Mirage MPK 2025 CoRR)和 (b) chiplet-aware 细粒度调度(HipKittens 2025-11、Fleet 2026-04)。Fleet 是这两股流合一的产物,也是第一次把 AMD CDNA3/4 的 XCD 抽象塞进 persistent kernel 编程模型。时间上这也是在 MI300X 规模化出货(2024 中)+ MI350/MI355 即将发布的关键 1–2 年窗口出现。
| 方案 | 思路 | 为何不被 Fleet 采用 / 为何失败 |
|---|---|---|
| 标准 kernel-per-op(vLLM 默认) | 让 hipBLASLt / Tensile 自己解决 L2 locality | launch 开销 每 token 250 次 launch;kernel 边界强制 flush L2(保 device-sync 语义)→ 跨 op 复用不可能 |
| CUDA/HIP graph capture | 录制 kernel 序列消除 launch overhead | 每个 batch size 要独立 graph;仍是 kernel 粒度,跨 kernel L2 不复用;mismatch fallback 成本巨大(vLLM 用的就是这条) |
| Thread block swizzling + CUTLASS persistent GEMM | 单 kernel 内通过 block index 重排提升 L2 hit | 只优化单 kernel;跨 op 无能;且假设统一 L2 |
| Thread block cluster (NV Hopper/Blackwell) | GPC-scope 内 block 协作,DSMEM shared | GPC ≠ chiplet 边界,GPC 更细(不对应 L2);AMD 无等价硬件 |
| HipKittens XCD-grouping | kernel launch 时把 block 绑到 XCD | 仍是 per-kernel 优化,不能把 decode 整条路径编织到一个 megakernel 里 |
| K-split on multi-XCD | 跨 XCD partition K 维度 | 要跨 XCD reduction → 每个 partial sum 都经 Infinity Fabric 做 atomic → 小 batch 下延迟主导 |
| 硬件做 XCD-aware dispatch | 让 hw scheduler 自动感知 | 硬件已有但受 grid launch 粒度限制,无法跨 kernel 维持 affinity |
buffer_wbl2 全局回写 + 跨 Fabric probe,比 L2-local 慢 10–100×。grid 分派策略是 round-robin 跨 XCD;要 override 必须拿到 HW_ID 再重新排队 → 这正是 Fleet 做的。m_tiles ≥ 2(即 B ≥ 32 配 T_M=16)时 M-tile 才有 L2 复用优势。这个门槛卡在 serving 典型的 bs=8–32 临界点,不稳健。若某 agent serving 负载 bs 稳定 ≤ 16,Fleet 只能吃 dispatch overhead 这一部分(1.15× 左右),拿不到大加速。_ro/_cg/_cs load modifier 和 cluster-scope barrier,无法复现同样的 3 档策略。论文 §8 声称 "could implement with platform-specific runtime backend",但未量化 NV 端性能。两级事件同步 × intra-XCD L2-local counter。这是 "persistent megakernel in chiplet GPU" 能成立的唯一支点:
flat_atomic_add with sc0|sc1 才能跨 XCD 可见——这三条里任何一条在硬件层面弱化,整个方案崩盘。为什么这是"低层工程洞察"而非"高层思想":高层思想(两级 counter)是标准 hierarchical reduction 的模板,任何 parallel computing 教科书都讲;真正难的是找到 CDNA3/4 ISA 里哪组 scope 位组合能让 intra-XCD 的 atomic 既有原子性又免 fence——论文把这条实现到 buffer_wbl2 vs flat_atomic_add sc0 sc1 的精确边界。
_cs/_cg/_ca 修饰符,无 XCD-scope 概念;但 2026 年 NV/AMD chiplet GPU 各占约一半 AI 算力(MI300X + MI350 + B200),若 Fleet 不做 NV 后端,生态影响面被限制在 AMD 阵营。风险等级:medium-beta(AMD 阵营持续扩张,bet 安全)。eager/CUDAGraph。Fleet 通过 Mirage 生效意味着短期只能作为 AMD research 实验室工具链。风险等级:medium。| 符号 | 含义 | 单位 |
|---|---|---|
| $B$ | batch size (M 维度总长度) | tokens |
| $W$ | workers per XCD | workers(MI350: 31) |
| $X$ | chiplet 数 | chiplets(MI350: 8) |
| $C$ | L2 capacity / chiplet | bytes(MI350: 4 MB) |
| $T_M$ | GEMM output tile height along M | elements (16) |
| $T_N$ | GEMM output tile width along N | elements (64 或 256) |
| $m\_tiles$ | $\lceil B / T_M \rceil$ | — |
| $R$ | $\min(W, m\_tiles)$(共享同一权重列的 worker 数) | workers |
| $N$ | 全 GEMM 输出列数 | elements |
| $N/8$ | 每 XCD 分到的输出列 | elements |
| AI | arithmetic intensity = FLOP / HBM byte | FLOP/byte |
$$\text{L2 Hit}_{\text{weight}} = \frac{R-1}{R} = 1 - \frac{1}{\min(W, m\_tiles)}$$
形式推导:M-major 遍历下,worker $i$ 在 $n=n_k$ 列先处理 M-tile $i$,再处理 M-tile $i+W$...;当 $m\_tiles \geq W$ 时,一个权重列被 $W$ 个 worker 近乎同时消费,第 1 个 worker 从 HBM 加载权重进 L2,后续 $W-1$ 个 worker 全部 L2 命中 → hit rate = $(W-1)/W$。当 $m\_tiles < W$ 时,只有 $m\_tiles$ 个 M-tile 需要处理,余下 $W - m\_tiles$ 个 worker 去做别的列,仍有 $m\_tiles$ 个 worker 共享一列权重 → hit rate = $(m\_tiles-1)/m\_tiles$。合起来就是 $R = \min(W, m\_tiles)$。
为什么这个形式而不是别的:
单调性:对 $B$ 单调非减(因为 $m\_tiles$ 非减),对 $W$ 也单调非减。当 $B \to \infty$,$R \to W$,上限 hit rate = $(W-1)/W = 30/31 \approx 96.8\%$。实测 bs=64 只到 61.4%,说明实际执行中有大量其他因素蚕食了预测极限——这就是 attack surface。
Standard scheduling 下 AI = B(batch size in FLOP/byte,因为每 weight byte 被 B 个 activation 复用)。Fleet 的 L2 reuse 等效于把 HBM 字节数降到 $(1 - \text{hit}) \times $ 原值:
$$\text{AI}_{\text{eff}} = \frac{B}{1 - \text{L2 hit rate}}$$
物理含义:HBM 作为主存来看,有效 $B$ 字节被"压缩"成 $B \cdot (1-\text{hit})$ 字节。
形式推导:AI 定义是 FLOPs / 外部 memory bytes;L2 hit 不产生 HBM 请求,只有 L2 miss 的部分贡献到分母。
为什么这个形式:把 roofline 图里的点水平右移 $\tfrac{1}{1-\text{hit}}$ 倍——这是 roofline 分析的标准用法。
与 ridge point 交互:MI350 MFMA ridge $\approx 245$ FLOP/byte。bs=32 原 $\text{AI}=32$,Fleet 51% hit → $\text{AI}_{\text{eff}} = 32/0.49 \approx 65$,仍在 bandwidth-bound 区($65 < 245$),但离 ridge 缩短 33%。
用 MI350 参数 $W=31, T_M=16$ 代入:
| B | $m\_tiles$ | $R = \min(31, m)$ | Eq.(1) 预测 | 实测 (Table 4, Fleet M-tile) | 残差 | 评价 |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 0% | 16.9% | +16.9% | 来自 fused SiLU 共享 activation,论文自陈为基线偏移 |
| 16 | 1 | 1 | 0% | 23.7% | +23.7% | 同上,fused SiLU 受益越大 |
| 32 | 2 | 2 | 50% | 51.0% | +1.0% | ★ 模型精准命中 ±1 pp |
| 64 | 4 | 4 | 75% | 61.4% | −13.6% | streaming 修饰符提前驱逐权重,预测偏高 |
第一个结论:在 bs=32 这个关键点上,模型误差只有 1 pp,这是 作者证明 是"load-bearing" 的直接证据——case study 的 51% 数字 真的是 从 Eq.(1) 一阶解出来的,而不是 sweep 出来再回头套模型。
第二个结论:bs=1/16 处的 16.9%/23.7% 完全不是 Eq.(1) 的预测;论文坦白是 fused SiLU 带来的"基线偏移"。这部分应该加一个独立项:$\text{hit}_{\text{baseline}} = f(\text{fusion})$,而 Eq.(1) 只描述 M-major 协作这一块增量。论文没显式拆开,是 作者证明 的一个表达瑕疵。
第三个结论:bs=64 的 −13.6% 残差直接暴露了 作者证明 的 attack surface(下文)。
可以。单看 Eq.(1):bs=32 + MI350 配置,模型预测 L2 hit 率 50%,相对 chiplet-unaware 的理论 0%(因为每 XCD 独立读权重,无论何时都是 miss)提升 50 pp → 按 AI_eff = B/(1−hit) 推算,effective AI 从 32 提升到 64,HBM 流量降低 50% → decode 延迟中 memory-bound 部分降低 50%。考虑 linear 占 95%,整体预估降低 47.5% → 从 Mirage 15.62 ms 应降至 8.2 ms。实测 12.35 ms,说明"到 50%"这个假设在 streaming 修饰符下兑现了 ~50%,predicted-over-actual ratio ≈ 63%,在一阶量级对齐。
两级事件同步 + CDNA 三档 cache modifier 的组合。看懂是一回事,复现是另一回事:必须在 GPU assembly / ISA 级别理解 AMD buffer_wbl2 / flat_atomic_add sc0 sc1 / sc1=1 nt=1 load 修饰符的相对语义,并把它们编织进 Mirage 的 IR 生成路径。对复现者要求:有 AMD 内部硬件文档 + 熟悉 Mirage 编译器 + 能做 HW_ID 寄存器级调度——三个条件合起来基本只有 AMD Research 团队具备。
| Step | Premise | Conclusion | Evidence |
|---|---|---|---|
| 1 | Modern chiplet GPUs (MI300/MI350/Blackwell) 用私有 L2 分区 | CUDA/HIP 的 3 层抽象 (wavefront/workgroup/grid) 对应不上 L2 层的边界;编程模型留下 "Chiplet scope" 空白 | §1 Intro, §2 Table 1, Figure 1 |
| 2 | LLM decode 95% 时间在 linear GEMM,368 MB 权重 vs 4 MB L2 per XCD 11.5× overshoot | chiplet-unaware dispatch 让 8 颗 XCD 各自独立拉完整权重 → L2 bandwidth 被浪费,decode 卡在 HBM | §2.1, §2.2, Table 2 (95% + 16.4% L2 hit) |
| 3 | CUDA/HIP graph capture 把 launch overhead 减少但不消除、且每 batch 要独立 graph、跨 kernel 不复用 L2 | 必须换到 persistent megakernel 才能同时解 launch + 跨 op L2 复用 | §2.3, §7 Related Work |
| 4 | monolithic 时代 persistent kernel (HazyResearch/FlashFormer/Mirage) 可行;chiplet 时代 naïve 实现会被 248× fence 打爆 | 必须引入两级事件同步 + Chiplet-task 抽象 + M-major 协作 tiling | §5.1, §5.2, Figure 4/5 |
| 5 | Eq.(1) L2 hit = (R−1)/R 预测 bs=32 达 50%;实测 51%(误差 1 pp) | Chiplet-task 方案在 load-bearing 的 bs 区间兑现预测 → 1.56× decode 加速 | Table 4, §6.4, Figure 6 |
Load-bearing: step 2(痛点定义)、step 4(方法必要性)、step 5(SJM + 实证)。
Decorative: step 3(文献综述性质,去掉不影响主 claim)。
作者预先应对的反对意见:§7 Related Work 里把 HazyResearch/FlashFormer/Mirage/HipKittens/TB cluster 一一对齐,预先回应 "这不就是又一个 megakernel 吗?" 的反问——答案是 "他们假设 L2 是 monolithic"。
| Innovation | Mechanism | Benefit | Cost/Tradeoff | |
|---|---|---|---|---|
| Chiplet-task abstraction | 把 "一个 XCD + 其 L2" 作为新的任务层级,GEMM 按输出列分成 8 个 Chiplet-task | 任务数 1,407 → 543 (2.6×);intra-chiplet L2 coherence 免 fence | 只绑 AMD XCD 粒度;MoE 不适用 | |
| M-major windowed traversal | worker 先沿 M(batch)方向遍历再进下一个 N 列,让 $R=\min(W, m\_tiles)$ 个 worker 共享同一权重列 | L2 hit 38.9% → 51.0% (bs=32);HBM 读 −18% | 要求 $B \geq 2 T_M$(bs ≥ 32),小 batch 无增益 | |
| Three-tier cache modifier | 权重 sc1=1 nt=1 streaming / 激活 NT=1 bypass / 调度 volatile | 激活不驱逐权重;权重生命周期对齐共享窗口 | 仅 CDNA3/4 有 per-instruction scope 位;NV 不可复现 | |
| Hierarchical 2-level sync | intra-XCD worker 只做 L2-local atomic,仅 last-worker 出 buffer_wbl2 + flat_atomic_add sc0 | sc1 | 每事件 fence 从 248 降到 8(31×) | 需 HW_ID 发现自身 XCD、需正确识别 "last worker" |
| Per-XCD scheduler + HW_ID-based dispatch | 每颗 XCD 1 个 workgroup 做 scheduler,通过读 HW_ID 寄存器发现自己在哪颗 XCD | workers 自主调度,launch 成本摊到整个 generate 周期 | 3.1% CU 被 scheduler 占用 |
| 场景 | Workload | SLO | Fleet 相对 vLLM 优势 | 瓶颈 |
|---|---|---|---|---|
| Interactive chatbot decode | bs=1–4, seq 长短混合 | TPOT < 10 ms | 1.3–1.5× TPOT | kernel launch + L2 miss |
| Agent tool-call decode | bs=1–8, 多轮短 gen | TPOT < 10 ms | 1.3–1.5× TPOT | kernel launch + L2 miss |
| Voice agent / real-time | bs=1, 每 token 预算极紧 | TPOT < 5 ms | 1.5×(最大收益区间) | 与 chatbot 同 |
| Batch summarization | bs=32–64, 长 context | 总吞吐 | bs=32: 1.27×;bs=64 持平 / 略慢 | MFMA compute |
| MoE decode | 每 token route 不同 expert | — | 不适用(binding 3) | expert 不共享 |
primary bottleneck:在 Fleet 目标区间(bs ≤ 16)是 scheduling-bound + memory-bound 各占一半;bs=32 变成 memory-bound 主导;bs ≥ 64 切换到 compute-bound(Fleet 失效的转折点)。
| Metric | Definition | Unit |
|---|---|---|
| TPOT | Decode-only time per output token, 64-input-1024-output | ms/token |
| L2 Hit Rate | rocprofiler 测 L2 访问命中率 | % |
| HBM Rd/Wr | 测到的 HBM 读/写字节数 | GB/token sequence |
| Effective AI | B / (1 − L2 hit rate) | FLOP/byte |

What it shows: 4 条曲线对比 TPOT:vLLM (蓝)、Mirage MPK (灰)、Fleet M-tile (红实线)、Fleet M-split (橙)。
Why it matters: 论文的"头号实验图"。在 bs ≤ 16 Fleet 两个变体与 vLLM 拉开差距(约 1.5× 快);bs=32 M-tile 开始领先 M-split 和 Mirage;bs=64 M-tile 仍领先 Mirage 1.30× 但被 vLLM(compute-bound 区借助 hipBLASLt K-split)反超。
Detailed description: 横轴 log2 batch size 1–64,纵轴 ms/token 0–30。vLLM 曲线在 bs=1–16 横在 10–12 ms;Mirage 从 7.8 涨到 10.8;Fleet M-tile/M-split 从 6.7 涨到 ~9(bs=16)。bs=32 处 4 条线分叉:vLLM ~12,Mirage 15.6,M-split 13.4,M-tile 12.4。bs=64 vLLM 保持 ~12,Mirage 24.1,M-split 23.4,M-tile 18.6。
| Optimization | Metric | Baseline (Mirage) | Fleet M-tile | Improvement | Conditions |
|---|---|---|---|---|---|
| Chiplet-task dispatch | TPOT @ bs=1 | 7.83 ms | 6.82 ms | 1.16× | MI350, Qwen3-8B |
| Chiplet-task + M-major | TPOT @ bs=32 | 15.62 ms | 12.35 ms | 1.27× | |
| Chiplet-task + M-major | TPOT @ bs=64 | 24.10 ms | 18.61 ms | 1.30× | |
| (vs external vLLM) | TPOT @ bs=1 | 10.51 ms (vLLM) | 6.73 ms (M-split) | 1.56× | |
| M-major L2 reuse | L2 hit @ bs=32 | 38.9% | 51.0% | +12.1 pp | |
| M-major L2 reuse | HBM read @ bs=64 | 6,203 GB | 3,925 GB | −37% | |
| Fused SiLU alone | L2 hit @ bs=1 | 9.4% | 17.4% | +8 pp | Fleet config |
vLLM: launch-bound (250×) + memory-bound → Mirage MPK: memory-bound (16% L2 hit) → Fleet M-split: memory-bound (same hit, less dispatch) → Fleet M-tile: memory-bound (51% hit @ bs=32) → @ bs=64: compute-bound (MFMA pipeline) → Fleet 失效, vLLM 反超
决定性 shift 有三个:
--enforce-eager 禁用 CUDA Graph(否则对 Fleet 不公);Mirage 是 Fleet 作者移植到 AMD 的内部 baseline,区别只在是否 chiplet-aware——最干净的内部 ablation。{{drawio:2604.15379_arch.drawio#page=4&height=720}}

What it shows: log-log roofline 图,x 轴 operational intensity (FLOP/byte)、y 轴 attainable performance (TFLOPS)。HBM 5.3 TB/s 斜线 + MFMA 1299 TFLOPS ridge @ AI=245。每个 bs 对应两组点:实心蓝 = Standard 理论、实心红 = Fleet 理论、空心蓝 = Mirage 实测、空心红 = Fleet 实测。
Why it matters: 直观解释 Fleet 的核心收益——把 memory-bound 的点沿 bandwidth 斜线水平右移;bs=32 的 Fleet 红三角从 AI=32 向右推到 AI≈65,离 ridge 缩短一半距离。
Detailed description: 从 bs=1 的 6 TFLOPS (AI≈1) 到 bs=32 的 120 TFLOPS (AI≈65) 呈对角线分布;Fleet 实测点都在 Mirage 实测点的右侧且更高。
T_M、T_N、cache modifier 组合——多数硬编码到 Mirage 生成的 library 代码里。| Layer | Impact |
|---|---|
| Algorithm | 无直接影响(推理运行时优化) |
| Kernel | 定义了新的 tile 遍历模板(M-major windowed),推动 kernel DSL 支持 per-instruction cache modifier |
| LLM | 验证于 dense transformer;MoE / long-context 未验证 |
| Agent | agent serving 多是 bs=1–8 短 gen,完美落在 Fleet 最优区间 |
| Ops | 仍是单 GPU;未讨论 autoscaling / 监控 |
| Feature | Fleet | vLLM | SGLang | HazyResearch MegaKernel | FlashFormer | Mirage MPK | HipKittens |
|---|---|---|---|---|---|---|---|
| Persistent megakernel | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ (per-kernel) |
| Chiplet-aware L2 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | 部分 (XCD grouping) |
| Continuous batching | 上层 | ✓ | ✓ | 上层 | 上层 | 上层 | — |
| Paged attention | 上层 | ✓ | ✓ | 上层 | 上层 | 上层 | — |
| AMD target | ✓ (MI350) | ✓ | ✓ | ✗ (H100) | ✗ (H100) | ✗ (A100/H100) | ✓ (MI350) |
| NV target | 可移植 (未实现) | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| Open source | 未披露 | ✓ | ✓ | blog post | ✓ | ✓ | ✓ |
Shallow-cloned 到 knowledge-meta/cache/repos/mirage-project-mirage,版本 2026-04 HEAD。
走查 include/mirage/persistent_kernel/persistent_kernel.cuh (1,496 行) +
runtime_header.h (335 行) + python/mirage/mpk/persistent_kernel.py (2,225 行)。
ls include/mirage/persistent_kernel/tasks/
# ampere blackwell common cute deprecated hopper speculative_decoding
grep -rn "XCD\|chiplet\|MI300\|MI350\|CDNA\|gfx9\|HIP_" include/mirage/persistent_kernel/
# (no matches)
含义:Fleet 论文里 "Mirage MPK ported to AMD MI350X, serving as internal baseline"
一句话轻描淡写 —— 实际上 upstream Mirage 只有 Ampere/Hopper/Blackwell 后端,
没有任何 AMD path。Fleet 团队除了论文主贡献(Chiplet-task 抽象),**还隐式完成了
一次完整的 Mirage HIP/CDNA 后端移植**,这部分工作量在论文中完全未量化。对读者
的启示:Fleet 的工程投入 ≠ 论文 §3–§5 描述的内容,真实投入远大于此。
// persistent_kernel.cuh L454-L525 核心分派逻辑
int const num_schedulers =
config.num_local_schedulers + config.num_remote_schedulers;
int const num_schedulers_per_sm = std::min((int)blockDim.x / 32, 4);
int const sched_id = blockIdx.x * num_schedulers_per_sm + warp_id + offset;
threadIdx.x % 32 == 0,每 SM 最多 4 个 scheduler warp)
// event 分派:Mirage 用 random scheduler id
int sched_id = get_rand_sched_id(event_index, worker_id,
config.num_workers,
config.num_local_schedulers);
get_rand_sched_id 替换成 get_xcd_local_sched_id(HW_ID)
// runtime_header.h
EventCounter *all_event_counters;
int *all_event_num_triggers; // 每 event 的触发阈值
// persistent_kernel.cuh: 典型 trigger 逻辑
atom_cas_release_gpu_u64(&config.sched_queue_last_ready_event_id[sched_id],
last_event_pos, last_event_pos + 1);
num_triggers 阈值 + "最后一人触发"模式device-scope atomic 换成 L2-local atomic(intra-XCD 免 fence),inner counter 维持 device-scopeMirage 的 atom_cas_release_gpu_u64(NV release 语义)改写为 AMD 等价语义
等价性验证:Mirage NV 端 atom_cas_release_gpu_u64 = atomicCAS_block + membar.sys;
Fleet AMD 端需要 s_waitcnt lgkmcnt(0) + buffer_wbl2 + flat_atomic_add sc0|sc1。
粒度不同但语义对齐。
// persistent_kernel.cuh prepare_kernel
for (int i = blockIdx.x * blockDim.x + threadIdx.x;
i < 2 * config.num_workers; i += ...)
config.worker_queue_last_ready_task_id[i] = 0;
// ^^^^^ 2 × num_workers = local + remote queue pair per worker
| 维度 | Upstream Mirage | Fleet (paper) | Fleet 工程投入 | |
|---|---|---|---|---|
| 后端 | ampere / hopper / blackwell | + AMD CDNA (MI350) | 完整新后端移植(论文未量化) | |
| Scheduler 粒度 | warp-level (4/SM) | workgroup-level (1/XCD) | 架构微调 | |
| Event routing | get_rand_sched_id | get_xcd_local_sched_id(HW_ID) | 1 函数改写 | |
| Event atomic | atom_cas_release_gpu_u64 (NV release) | `buffer_wbl2 + flat_atomic_add sc0\ | sc1` (AMD) | ISA 层等价重写 |
| Task 抽象 | wavefront / CU / device (3 层) | + Chiplet (新增 1 层) | 任务模型扩展 | |
| Per-worker queue | local + remote pair | 完全复用 | 0 | |
| Task graph 生成 | Mirage muGraph 超优化 | Fleet 手写 input task graph | 退步(作者承认 §5.3 future work) |
(R-1)/R 的实际实现在 HIP kernel 中如何保证 worker 按 M-major 顺序执行,无法从 upstream 代码推断(Mirage upstream 的 traversal pattern 是通过 task graph 编码,不走 kernel-level loop)。buffer_wbl2 和 sc0|sc1 atomic 语义只能依赖 AMD ISA 手册(AMD ISA reference)交叉验证。结论:Fleet 的实际工程体量比论文暗示的大得多(完整 AMD 后端移植被省略没提),
paper 的 "extends Mirage with chiplet-aware concepts" 不能字面理解 —— 正确理解是
"把 Mirage 的 device-scope 假设在 AMD 8-die 架构上彻底解构重写"。这是代码
cross-reference 最有价值的输出:paper 的轻描淡写 vs 代码揭示的真实工程量。
本节由 2026-04 NeuralTalk Fleet 解读(微信公众号)触发。对比该独立 解读与本笔记,surface 了若干原始笔记没覆盖的批判视角。这些视角已经 沉淀为 的新规则(根本性 vs 缓解性 / Trade-off 轴 / 对立观点 / 软件→硬件反推 / 范式演进 / multi-tenancy)。按 Skill- Modification Protocol 回溯补入本笔记。
Fleet 对"内存墙"的根本性突破仅存在于批处理场景 (bs ≥ 32)。
| 场景 | 加速来源 | 是否根本性 |
|---|---|---|
| bs = 1 (agent / chatbot 延迟敏感) | dispatch 压缩 (543 vs 1407 task) | ❌ 非根本性。L2 hit 16.9% ≈ Mirage 的 16.4%,权重复用完全未发生。Fleet 在此 regime 下只是"launch overhead eliminator",和 CUDA Graph + hipBLASLt 的组合效果差距有限 |
| bs = 8-16 | dispatch 压缩 | ❌ 非根本性。同上。M-tile 和 M-split 变体打平(Table 4 L2 hit 20–24% 几乎一致)印证没有 L2 复用发生 |
| bs = 32 (m_tiles=2, R=2) | dispatch 压缩 + L2 协作 (预测 50% / 实测 51%) | ✅ 根本性。L2 复用是 Fleet 独门贡献 |
| bs = 64 (m_tiles=4, R=4) | L2 协作 (预测 75% / 实测 61.4%) | ✅ 根本性但 compute-bound 区让位 hipBLASLt |
前提 (condition): Fleet 的"根本性"L2 突破要求 m_tiles ≥ 2 ⇔ B ≥ 2 · T_M = 32(T_M=16)。
前提失效时的效果归零:bs < 32 时 Eq.(1) 的 R=1 → 预测 0% L2 reuse,完全不产生权重复用加速;仅剩 dispatch 开销压缩(约 1.15× vs Mirage)。
论证的结构性结论:Fleet 对 "内存墙"的根本性解决仅在 batched serving。对 chatbot / agent / voice agent 这类 bs=1 延迟敏感场景,"内存墙"本身需要硬件层面变革(跨 chiplet L2 共享、一致性协议改写),软件方案的天花板已经被 Fleet 打到了。外部 review 的原话值得引用:"真正根本性的解决方案可能需要硬件层面的变革"。
bs=64 Fleet 被 vLLM 反超不是 "K-split 未实现" 那么简单 —— 论文把它归因为"实现未完善"是一种规避真相的叙事。真相是存在一根结构性 trade-off 轴:
$$\text{Trade-off 轴:}\quad \underbrace{\text{跨算子持久化复用}}_{\text{Fleet 方向}} \ \longleftrightarrow\ \underbrace{\text{单 kernel 极致调优}}_{\text{hipBLASLt 方向}}$$
两个方向在 compute-bound vs memory-bound 谱上天然互斥,不是"Fleet 补上 K-split 就能两全"。
未探索的 Hybrid 方向(Fleet 论文完全没讨论):
Adaptive Fusion Granularity Switch — persistent megakernel 内部携带一个轻量级性能预测器,每次迭代开始时根据 (batch_size, sequence_length, hit_rate_last_step) 决定:
- 当 B · T_M ≥ L2_capacity_threshold (≈ bs ≥ 32 on MI350) → 走 Fleet megakernel 路径
- 否则 → 切换到 hipBLASLt K-split GEMM + 独立 kernel
具体实现:megakernel 留出一个 "bypass task" 类型,任务描述符里指向 hipBLASLt 的 handle;scheduler 看到 bypass 类型就把对应 GEMM 委托出去。代价是每次切换约 1 次 kernel launch,但在 bs ≥ 64 能吃到 hipBLASLt 的 compute-bound 极值。
这条 hybrid 方向是一个完整的独立研究问题,值得放进 Open Questions。
原本 §3e 的 Binding 3 写的是 "MoE 不适用(最严重)",因为"每 token 路由不同 expert,M-major 协作假设破坏"。但对立观点审视发现:
| 我们原本视角 | 对立视角 (NeuralTalk review) |
|---|---|
| 视角起点:Fleet 现行设计的 M-major 协作 | 视角起点:重新设计 Fleet 给 MoE 用 |
| 结论:MoE binding 3 最严重 | 结论:MoE 天然契合 Fleet |
| 理由:token 之间不共享 expert 权重 → 协作失效 | 理由:不同 expert 驻留不同 XCD 的 L2,gating network 做 expert→XCD affinity routing,expert 权重从此 XCD-local,比 dense 的 N-split 更自然 |
重要观察:MI350 有 8 颗 XCD —— 这个数字恰好对应典型 MoE 的 num_routed_experts(Mixtral 8×7B 精确对齐;DeepSeek-V2 的 64 routed + 2 shared 可以做 8 个 XCD 各 8 expert;Qwen3-Next 80B-MoE 的 128 routed 可 16 expert / XCD)。Expert ↔ XCD 映射是 MoE 专属的 chiplet-affinity opportunity,Fleet 的 Chiplet-task 抽象原则上可以直接表达(需要把 Chiplet-task 类型扩展出 Expert-Chiplet-task 变体)。
结论:我们原本的 Binding 3 critique 在 Fleet 的 M-major 现行设计下成立,但作为研究方向是误导性的。正确表述应该是:
Binding 3(精修版): Fleet 的 M-major GEMM 协作设计不直接适用 MoE,但 MoE 的 expert 稀疏激活与 chiplet 私有 L2 天然亲和——将 Chiplet-task 从"XCD-local weight partition"语义扩展到"XCD-local expert affinity"是论文未探索但价值很高的方向。chain step 3 的 premise 需从 "dense-only" 放宽到 "partition 可沿 expert 或 token 维度"。
Fleet 的纯软件方案给以下未来硬件特性提供了存在性证明 + 量化依据:
| 未来硬件特性 | Fleet 证明其价值的数据 | 硬件支持后软件开销预计降低 |
|---|---|---|
| 硬件管理的 XCD-local 任务队列 | Fleet 用 8 workgroup(3.1% CU)做 scheduler,workers rarely stall waiting for task assignment (§5.1) | scheduler CU 开销从 3.1% → 0%;MI400 类 16 XCD 架构尤其显著(当前 6.25% → 0%) |
| 跨 chiplet 轻量级 fence (SC + atomic 的单周期版本) | Fleet 两级计数把每事件 fence 从 248 降到 8,量化了 fabric fence 的代价主导 | 每事件 fence 继续降到 0(硬件直通 counter),持久化 megakernel scheduling throughput 再涨 20-30% |
| 可编程 cache scope 分区 (per-stream LRU class) | Fleet 用 3 档 cache modifier 隔离 weight/activation/sched 流量 | 动态 partition 无需 paper §4 描述的静态 modifier hint;能适应 MoE expert 切换的突发访问 |
| HW-accelerated HW_ID routing | Fleet scheduler 通过 HW_ID 寄存器读 + software routing 决策 | 硬件实现 scheduler-local queue 会让"每 XCD 一个 scheduler"变成免费 |
推论:AMD MI400 / MI500 代际的 CDNA 5/6 架构应当考虑将上述 4 项从 ISA 扩展到 microarchitecture;这是 Fleet 论文给 AMD 架构路线图贡献的隐式 design wishlist。NVIDIA Blackwell Ultra / Rubin 代也可借鉴——Blackwell 的 thread-block cluster 已经向 "硬件 chiplet 感知同步原语" 迈了一步但粒度不对 L2 层级,Fleet 的证明给 Rubin 代做到 "chiplet-scope cluster" 提供了量化论据。
Fleet 的真实贡献不只是 "1.5× vLLM decode 加速",而是把一个"隐式硬件约束 → 显式软件资源"的抽象模板补完了:
| Paper | 隐式硬件约束 | 变成显式软件资源 |
|---|---|---|
| vLLM PagedAttention (2023) | KV cache 必须连续分配 | page 显式资源(paged memory manager) |
| FlashAttention (2022) | HBM 访问是瓶颈 | tile in SRAM 显式资源(IO-aware scheduling) |
| Fleet (2026) | L2 物理分区(chiplet) | Chiplet-task 显式资源 |
| (hypothetical next) | MALL Infinity Cache 分层 | LLC-task ? |
| (hypothetical next) | 跨 GPU NVLink bandwidth | Island-task ? |
这是一条可以推广的范式演进主线:每当硬件引入一种新的隐式拓扑约束,软件抽象就需要把它变成显式一等公民。Fleet 在这条主线上的贡献不是最大的(PagedAttn / FlashAttn 更有影响力),但是这条主线被外推到芯粒层级的第一个严肃实现。下一篇类似工作很可能处理 Infinity Cache 或跨 GPU L2 —— 这是值得关注的方向。
Fleet 论文完全未讨论云多租户场景。但持久化 megakernel + 分区 L2 引入了至少 3 类侧信道攻击面:
Fleet 当前适用范围(基于安全视角):
结论:Fleet 走向生产需要一整块 multi-tenancy security 补课。这是论文的"盲区 limitation",论文未列、我们原笔记也没列。
一句话总结:Fleet 是"给 persistent megakernel 补上 chiplet 这一层的 OS kernel"——把 CUDA 的 hw dispatcher 换成软件 per-XCD scheduler,把 L2 分区从编程模型 bug 变成显式资源。
技术细节彩蛋: