08 内存模型 · 同步原语 · 固件 ABI 洞察
- 章节编号:08
- 所属层:I 软硬接口层(红线:与 07 章 ISA 一同随 RTL 冻结)
- 关联 ADR:ADR-022(内存一致性模型)、ADR-023(同步原语)、ADR-024(固件/控制核职责与寄存器 ABI)
- 上游依赖:03(SRAM/统一内存)、04(NoC 一致性/统一内存)、07(ISA/编程模型)
学习目标
-
前置知识:读过 03 章(SRAM/统一内存)与 04 章(NoC 一致性),知道「软件管理 scratchpad」与「硬件缓存一致」是两种不同的内存范式;读过 07 章 ISA/编程模型,知道我们的控制核是一颗 RISC-V;对「弱内存序(weak memory ordering)」「内存屏障(memory barrier)」有直觉即可,无需读过任何形式化内存模型论文。
-
学完产出:① 能说清「弱内存模型(weak memory model)为什么需要编译器显式插入屏障」——理解在弱序下两条无依赖的访存可以被硬件任意重排,而正确性依赖显式栅栏(fence)来建立可见性顺序;② 能用「set flag / wait flag」这一对显式同步原语,把 Cube(矩阵)/ Vector(向量)/ MTE(搬运)三单元编排成一条重叠流水,并说清「过同步(over-sync)」与「欠同步(under-sync)」各自的后果;③ 能论证「寄存器 ABI(Application Binary Interface,应用二进制接口)稳定性为何直接关系固件 OTA(Over-The-Air,空中升级)兼容」——理解一旦寄存器偏移/位域随版本漂移,旧驱动配新固件就会静默写错寄存器;④ 能读懂 07/08 两章为何一同随 RTL 冻结,理解「软硬接口红线」的工程含义。
-
阅读姿势:盯住一条主线——「NPU 把『保证并发正确』的责任从硬件搬到了软件」。GPU/CPU 用昂贵的缓存一致协议让程序员几乎不必操心内存序;而我们这类 DSA(Domain-Specific Architecture,领域专用架构)为了能效与确定性,选择弱序 + 软件管理 scratchpad,把「什么时候该插屏障、什么时候该 set/wait flag」全部交给编译器与固件。本章讲的一切——内存一致性、同步原语、固件 ABI——都是在回答:当硬件不再替你兜底,软件这一侧的契约该如何定义并长期稳定。
1. 范围与目标
本章定义"数据在多计算单元间如何保证正确与高效":内存一致性模型、同步原语(屏障/栅栏/DMA 完成/计数器)、固件与控制核职责、寄存器 ABI 稳定性。它决定编译器能否生成正确高效的并发代码,以及软硬件长期可维护性。
核心问题
- 内存一致性:软件管理 scratchpad(弱序 + 显式同步) 还是硬件缓存一致?边界如何划?
- 同步原语:用什么机制(队列 + 事件、wait-count、DMA 完成中断、屏障)?
- 固件/控制核职责边界?如何兼顾灵活与稳定?
- 寄存器 ABI 如何保持稳定(支撑 07 章"编译兼容"与驱动长期维护)?
2. 需求洞察(承接 03/04/07 章)
- 能效 + 确定性:软件管理 scratchpad + 显式 DMA(03 章)→ 内存模型应是弱序 + 编译器插入显式同步,而非昂贵的全局缓存一致;关键控制路径时序可预测(13 章)。
- 多引擎并发:Cube/向量/DMA 多流水并发(达芬奇式)→ 需轻量队列 + 事件同步重叠计算与搬运。
- 统一内存边界:NPU 内部 scratchpad 软件管理,但 NPU↔CPU 统一内存需缓存一致(04 章 ADR-017)——两种语义在边界清晰划分。
- MLIR 可表达:同步/DMA/屏障须能映射为 MLIR 算子,供编译自动生成(16 章)。
- 长期可维护:寄存器 ABI 稳定 → 驱动/固件解耦演进(09 章)。
2.1 具身场景的实时约束如何压到内存序这一层
内存模型看似是「底层细节」,但具身负载对它有直接的硬约束。参考 M 层 21 章的靶标:π0 类流匹配 VLA 的 chunk 延迟目标是 ≤100ms,GR00T 在 Thor 上做到 92ms(10.9Hz),靠的正是 VLM backbone、DiT 去噪、数据搬运三者在时间轴上完全重叠。这种重叠只有在「弱序 + 显式同步」下才可能榨到极致:
- 重叠的前提是允许重排:若采用强序(每条访存都等前一条全局可见),搬运与计算就无法并发,chunk 延迟会退化到「各阶段串行相加」。弱序放开了重排,才有重叠的空间。
- 重叠的正确性靠显式同步兜底:允许重排的代价,是必须在真正有数据依赖处显式插屏障或 set/wait flag。编译器少插一处 → 数据竞争(欠同步);多插一处 → 流水气泡(过同步)。这条「精确同步」的钢丝,直接决定了能否吃到那个 10.9Hz。
- 确定性是伺服环的红线:13 章的 1kHz 伺服环要求 WCET(Worst-Case Execution Time,最坏执行时间)可预测,而缓存一致协议的「隐式后台流量」是确定性的天敌——这也是我们不在 NPU 内部走硬件缓存一致的深层原因。
3. 技术现状与趋势(点名 + 来源)
3.1 软件管理 scratchpad + 解耦访问/执行(能效与确定性根本)
- TPU:软件管理 Unified Buffer/VMEM/CMEM scratchpad + 可编程 DMA + 解耦访问/执行(地址发出即可完成,重叠 DMA 与计算);确定性强。
- 华为达芬奇:L0A/L0B(输入)+ L0C(累加)缓冲 + MTE(Memory Transfer Engine) 搬运 + cube/vector/MTE 队列 + 事件同步,Cube 与 Vector 可并发。
- 判断:NPU 内部采用软件管理多级 scratchpad + 显式 DMA + 解耦访问/执行(能效 + 确定性),由编译器编排。
3.2 内存一致性:弱序 + 作用域(scoped)+ 显式同步
- GPU(PTX):relaxed + scoped 模型(thread/block/device/system 作用域);block 作用域栅栏比 device 快达 21× → 作用域是性能杠杆。
- AMDGPU:availability/visibility + 缓存策略位(GLC/SLC/DLC)+ wait-count 寄存器精控缓存/等待。
- MLIR:
gpudialect 的barrier= 栅栏 + 线程同步;支持地址空间感知的 fence(只 flush 相关内存区);MMRA(内存模型放松注解) 在 lowering 中保留目标约束(避免保守地对所有地址空间加栅栏)。趋势:解耦"同步(thread sync)"与"栅栏(memory fence)"。 - 判断:采用弱序 + 作用域 + 编译器插入显式同步;NPU 本地 scratchpad 非缓存一致(靠显式 DMA/同步),仅在 NPU↔CPU 统一内存边界做缓存一致;同步/栅栏解耦、地址空间感知,便于 MLIR 高效 lowering。