☰
NVSwitch 和 UALink 的数据(缓存)一致性
2026/9/28 20:47:57 网站建设 项目流程

1. UALink 多个 gpu 之间的 缓存一致性,是靠软件维护

UALink 1.0 在加速器之间(跨 GPU、跨 System Node)明确采用软件一致性,而非硬件 snoop。

规范原文的核心说法(UALink_200 Rev 1.0 §1.5):

  • UALink不支持在加速器之间传输 snoop 事务来做硬件一致性。理由是 AI/ML 负载通常由大量加速器协同跑同一个 kernel,同步点天然清晰,在 kernel 边界清缓存就够了;为少量场景引入 snoop 消息会显著增加链路/交换机的复杂度,得不偿失。

  • 具体语义是 I/O 一致性模型:从 peer 内存读,会拿到该数据在目标 System Node 内最新的 coherent 副本;写 peer 内存会使目标 System Node 内所有缓存副本失效(部分写会先取回缓存数据合并再写回)。注意"失效范围"止步于 System Node 边界,Node 之间的一致性靠软件保证——即"缓存了 peer 数据的加速器,应当在合适的 kernel 边界清缓存(clean/invalidate cache)"。

  • 加速器 ↔ Host 之间的硬件一致性也不归 UALink 管:System Node 内部(Host CPU + 本节点加速器)若要保持缓存一致,走 PCIe/CXL/CHI C2C 等宿主侧互连实现,UALink 规范不做规定,可由实现者用硬件或软件方式处理。

所以整体图景是:

范围一致性方式
System Node 内(Host ↔ 本节点 GPU)硬件一致(CXL.cache / CHI C2C / PCIe 等宿主侧互连,非 UALink 规定)
UALink fabric 上 GPU ↔ GPU(跨 Node)软件一致性:kernel 边界清 cache,UALink 提供 load/store/atomic 内存语义 + 地址转换支持

这也是 UALink 与 NVLink/NVSwitch、AMD Infinity Fabric 的关键区别——后两者在域内提供硬件缓存一致性(MESI 类协议),代价是 snoop 流量和交换机复杂度;UALink 选择用软件换简单和可扩展(单域最多 1024 加速器)。UML 主席 Kurtis Bowman 的说法是:把硬件一致性塞进互连接口会导致性能下降,软件一致性反而更高效。

另外值得注意的是,UALink 官方路线图已把内存一致性列为未来版本的功能,即 1.0/2.0 目前是软件一致性,后续版本可能引入更强的硬件一致性支持。

2. 反驳:nvlink/nvswitch 是硬件一致性的,但是效率比 UALink 低么?

质疑是对的,拆开说:

1. Bowman 说的是"接口/硅片效率",不是系统性能

他的论点是:把 snoop-based 一致性塞进互连接口(端口逻辑、交换机),会增加硅片面积、功耗和协议复杂度,而对 AI 负载(kernel 边界同步天然清晰)没有回报。这是设计哲学层面的取舍论证,不是实测结论。目前 UALink 1.0 刚有早期硬件落地,根本不存在 NVLink vs UALink 在同负载下的对标数据,"UALink 效率更高"无从谈起——而且恰恰相反,现有证据(NVL72 单柜 130 TB/s、AllReduce 近线性扩展)表明 NVLink 系统在系统级效率上是目前的天花板。

2. 更关键的一点:NVLink 的"硬件一致性"其实用得很少,和 UALink 的模型高度趋同

NVIDIA 官方论坛的多次澄清指出:NVLink 上 GPU↔GPU 的普通显存访问并不传播 MESI 类一致性消息,managed memory 的一致性是靠按需数据迁移实现的(任一时刻只有一个处理器持有数据),GPU 间 P2P 访问的同步照样是程序员/运行时的责任;NCCL 就是"如何在 NVLink 上做显式同步数据传输"的开源示范。 换句话说,NVLink 上占绝对大头的 GPU-GPU 通信流量,走的就是软件同步模型——和 UALink 一样。

NVLink 真正的硬件一致性主要体现在NVLink-C2C(Grace CPU ↔ GPU 片间共享统一一致地址空间)以及 NVL72 把一致域扩到整柜 72 GPU——而这个域到机柜边界为止,跨柜立刻跌回 50 GB/s 级 IB/Ethernet,靠 NCCL 显式同步。 所以 NVIDIA 自己的多机扩展故事,本质也是"域内硬件一致、域间软件一致"——只是它的域是 72 GPU,UALink 的域概念是 1024 加速器的 Pod。

3. 所以公平的结论是

NVLink/NVSwitchUALink
GPU↔GPU 主流量软件同步(NCCL),一致域内靠地址映射软件同步(kernel 边界清 cache)
硬件一致性范围NVLink-C2C(CPU↔GPU)、NVL72 整柜域System Node 内(CXL/CHI C2C,非 UALink 规定)
"效率"之争的实质已验证的系统级效率标杆Bowman 主张的是端口硅片/功耗/协议复杂度更省、扩展域更大(1024),属于理论取舍,未经实测

Bowman 那句话准确的读法是:“为 AI 负载把硬件一致性做进交换 fabric 是得不偿失的复杂度”,而不是"NVLink 效率低"。真正的取舍在于:UALink 用软件一致性换来更大的一致寻址域(Pod 级 1024 加速器统一 load/store 寻址,无需像 NCCL 那样显式搬数)和更简单的交换机;代价是把同步责任推给编程模型。谁更优要看负载——对 kernel 边界清晰的训练/推理,两者实际行为差别不大;对细粒度共享、生产者-消费者异步并发这类场景,硬件一致的域内编程会轻松得多。

3. NVL72 整柜域 如何实现所谓 硬件一致性

关键先强调一点:NVL72 的"硬件一致性"不是像 CPU MESI 那样在 72 个 GPU 之间广播 snoop。它是"以每个 GPU 的 L2 为一致性锚点 + 地址路由 fabric"的架构,机制可以拆成四层:

1. 全柜统一物理地址空间(一致性成立的前提)

Fabric Manager 把 72 个 GPU 的 HBM 和 36 个 Grace CPU 的 LPDDR 配置成一个统一的 fabric 地址空间(Blackwell 的 NVLink 地址空间达 4 PB),每个物理地址在全局唯一映射到某个"home 节点"(owner GPU 的 HBM)。 这就是"memory fabric"的含义——交换的不是消息,而是带全局物理地址的内存事务。

2. 一致性锚点:home GPU 的 L2,而不是广播 snoop

GPU 的 L2 cache 是物理地址寻址的,且每个物理地址只有一个 home。任何 GPU(包括跨 NVSwitch 的远端 GPU)对 peer HBM 发 load/store/atomic,NVSwitch 按地址路由到 home GPU,home GPU 的 L2 控制器作为该地址的唯一串行化点(serialization point)处理所有请求——远端读命中 home 的 L2 或透传到 HBM,远端写由 home L2 更新/失效。因为所有对同一地址的访问都汇聚到同一个 L2,天然保证一致,fabric 上根本不需要传播 MESI 状态。学术界的归纳是:NVLink 提供的是"NVL 域内跨 GPU L2 的硬件一致性",NVL72 是当前硬件一致性的规模上限。

代价:远端 HBM 访问延迟约 5–10 μs(本地 HBM <100 ns),但带宽保持 1.8 TB/s 级。

3. NVSwitch 的 fabric 内加速(分担 home 节点的活)

  • 按地址路由的 non-blocking crossbar:每 GPU 18 条 NVLink 分到 9 个 NVSwitch tray,任意 GPU 对之间全带宽直达;
  • multicast:一次写由交换机在 fabric 内复制到多个目的 GPU(对 TP/AllReduce 的梯度广播是关键优化),在 Hopper/Blackwell 上需配合 UVM 暴露给软件;
  • in-switch 计算:SHARP 归约、Blackwell 起的 FP8/FP16 reduction 直接在交换机内做,减少 all-reduce 的数据搬动;
  • fabric 内同步:NVLink barrier 等多播同步原语,配合 atomic 完成跨 GPU 的硬件级同步。

软件侧通过 PTX 的 multimem 地址把 multicast 区域映射成特殊地址,GPU kernel 直接对"多内存地址"发操作,看起来像普通内存操作,实际由交换机完成分发/归约。

4. CPU 侧一致性:NVLink-C2C 走 AMBA CHI

每个 compute tray 内 Grace CPU ↔ 2 个 Blackwell GPU 用 NVLink-C2C(900 GB/s),这条链路承载的是 ARM 的AMBA CHI 一致性协议,所以 CPU 能以硬件一致的方式直接读写 GPU HBM、GPU 也能读 LPDDR,无需页迁移。 跨 tray 的 CPU-GPU 一致性则延伸过 NVSwitch fabric,由同一套"统一地址 + home L2"机制支撑。

总结成一句话:NVL72 的硬件一致性 =全局统一地址空间(谁拥有哪个地址由 fabric 静态配置)+home GPU L2 作为每个地址的唯一串行化点(替代 snoop 广播)+NVSwitch 的 multicast/原子/归约 offload+C2C 上的 CHI 处理 CPU 侧。它本质是 NUMA 化的共享内存机器,一致性边界由"地址的 home 归属"硬件保证,所以 72 GPU 对软件呈现为一个 load/store 一致的域;而这个域跨出机柜(IB/Ethernet)后,机制无法跟随,立刻退回软件同步。

4. home GPU 的 L2 控制器作为该地址的唯一串行化点的实现

NVSwitch 按地址路由到 home GPU,home GPU 的 L2 控制器作为该地址的唯一串行化点(serialization point)处理所有请求,NV 是如何做到的呢?

这套机制 NVIDIA 并没有公开完整协议细节,但把公开资料(Hot Chips 演讲稿、NVIDIA 白皮书、Stanford 的实测逆向)拼起来,链条是这样的:

第 0 步:先由软件把"地图"画好(Fabric Manager)

一致性不是交换机上跑出来的动态协议,而是开机时静态配置出来的。Fabric Manager 在 fabric 初始化阶段完成三件事:给 72 个 GPU 的 HBM(和 36 个 Grace 的 LPDDR)在统一 NVLink 地址空间里分配地址段、确定每个地址段的 home GPU;把路由表写进每个 NVSwitch;把多播组、SHARP 组、隔离分区(partitioning)配置好。 Hot Chips 的 NVSwitch 框图里专门有 Security Processor 保护这些芯片配置不被篡改。之后 fabric 上的所有事务都是"带物理地址的内存请求",连接在运行期由硬件维持,不需要像 NVLink Network(跨节点 OSFP 电缆那种)那样靠运行时 API 建连。

第 1 步:发起方 GPU——地址译码决定走本地还是走 fabric

SM 发出 load/store 后,请求沿 GPU 内存流水线(crossbar)走到地址译码逻辑。每个 GPU 内存控制器里有一张 fabric 地址解码表(由 Fabric Manager 写入):落在本 GPU HBM 地址段的 → 交给本地 L2 slice 哈希定位(物理地址哈希到 64/96 个 L2 slice 之一);落在 peer 段的 → 直接转到 NVLink 出站端口。关键细节:远端地址的请求不会在本 GPU 的 L1/L2 里分配缓存行——Stanford 对数据路径的实测确认 peer data never cached in the local L2,每次远端访问都完整走源 L2(仅作传输管道)→ NVLink → 目的 GPU。 NVLink 端口把请求封装成内存语义事务包(地址 + 命令类型 + 长度),用 credit 流控发到 SerDes。

第 2 步:NVSwitch——按地址查表的单跳 cut-through 交换

GB200 NVL72 里是 18 颗 NVSwitch 4.0 芯片(9 个 tray × 2),每颗 72 个 200 GB/s 端口、14.4 TB/s;每个 GPU 的 18 条 NVLink 恰好一条接到一颗 switch——所以是单跳、无阻塞拓扑:任意 GPU 对之间只过一颗交换机。 交换芯片内部就是一张地址路由表 + cut-through crossbar:收到包后查"地址段 → 出端口",直通转发。同一地址段永远路由到同一个 home GPU 的端口——路由表本身就把"同一地址的请求汇聚到同一节点"这件事硬件化了,这是"唯一串行化点"能在物理上成立的前提。

交换机上还有三块为一致性/集合通信服务的硅:

  • multicast 复制引擎:一次写入由交换机在 fabric 内复制到组内所有 GPU(“NVSwitch-internal duplication of data”),不用源 GPU 发 N 份;
  • SHARP 归约 ALU:ALU 与 Hopper 运算单元对齐,支持 add/min/max/logical,格式覆盖 FP16/32/64、BF16、整型,最多 128 个 SHARP 组并行——AllReduce 时各 GPU 只发 1/N 部分和,交换机归约后回发结果,省一半 fabric 流量;
  • 遥测/分区和安全处理器(前面已述)。

第 3 步:home GPU——把 fabric 请求"混进"本地内存流水线

这是最核心也最不为人知的一步:从 NVLink 端口进来的远端请求,并不走一条特殊路径,而是被注入 home GPU 与 SM 请求相同的内存流水线入口,然后和本地请求一样做地址哈希、定位到唯一那个 L2 slice。L2 slice 控制器是物理地址的 owner:它有 per-line 的状态和仲裁逻辑,无论请求来自本 GPU 的 SM 还是 71 个远端 GPU 中的任何一个,对同一 cache line 的请求都排队由它顺序处理——hit 则回数据,miss 则发 HBM 读,write 则更新行并置脏,atomic 由 L2 内的原子单元就地执行。 返回数据封装成响应包,沿原路(交换机的路由表同样对响应生效)回到请求方。

为什么这样就够了——因为没有第二份副本

传统 MESI 需要 snoop,是因为同一数据可能同时存在于多个 cache 里。这里三个设计把"多副本"从源头消灭了:①远端请求在请求方不分配缓存行(第 1 步);②每个物理地址有唯一 home,所有请求物理上汇聚到同一 L2 slice(第 2、3 步);③对共享数据的"一对多"流量由交换机多播而非各点缓存(SHARP 更进一步,连多份数据都不传)。协议上因此只需要 request/response 两种包,没有 Probe/Invalidate 广播。Hot Chips 材料里 NVLink 域的地址空间就是"1 (shared)"模式,请求直接用 GPU 物理地址寻址。

两个必要的澄清

  • 这套"硬件一致性"的边界是L2:远端一致性由 home L2 保证,但 GPU 自己的 L1 对全局内存本来就不是一致的(CUDA 内存模型如此),kernel 内跨 SM 同步仍要靠 fence/atomic——这一点在 NVL72 里没有变。
  • CPU 侧是另一条路径:Grace 的 NVLink-C2C 承载 AMBA CHI,Grace 内部的一致性引擎(目录在 CPU 侧)负责让 CPU cache 和 GPU HBM 互相一致;跨 tray 的 CPU→远端 GPU 访问则仍走第 2、3 步的 fabric 机制。

总结:NVIDIA 的做法不是发明了一种新一致性协议,而是修改了系统的三个"交通规则"——请求方不许缓存远端数据、交换机按静态表把地址钉死在 home GPU、home GPU 用本来就有的 L2 slice 仲裁器顺带把远端请求排队。一致性是这三个硬件约束的副产品,协议反而比 MESI 更简单。这也是为什么它端到端可控但离不开 NVIDIA 全家桶:解码表、路由表、L2 行为、交换机语义必须同一家设计,换任何一环"天然一致"就漏了。

5. UALink 缓存一致性的实现及其与nvlink性能的对比

先纠正一下前提,因为其中有一半对、一半需要精确化——这个区别正是答案的关键。

前提修正

  1. NVLink 侧:准确说不是"这部分显存被取消了 L1",而是对远端地址的访问不在请求方 GPU 的 L1/L2 分配缓存行——数据路径上本 GPU 自己的显存照常过 L1/L2,但 peer 显存进来的数据物理上不会被缓存(Stanford 实测确认 peer data never cached in local L2)。所以确实:请求方无副本,主机内 GPU 之间的 L1 一致性问题不存在。

  2. UALink 侧:"必须在主机内维护 L1 硬件一致性"这个推断其实过头了。UALink 规范承诺的是目标 System Node 内的 I/O 一致性(读拿到节点内最新副本、写使节点内缓存副本失效),它并没有要求主机内各 GPU 的 L1 互相 snoop。请求方 GPU 如果缓存了 peer 数据,软件在 kernel 边界清——这正是我们第一轮说的软件一致性。

那么在 UALink 类主机里,"目标节点内一致"具体怎么做到?

靠拼三种已有机制,而不是发明新协议:

  • home GPU 的 L2 做串行化点(与 NVL72 相同的一招):fabric 写入请求到达目标 GPU 后,注入它的内存流水线,由该地址哈希到的 L2 slice 失效/更新缓存行。L2 天然一致;GPU 的 L1 对全局内存本来就不跨 SM 一致(CUDA 内存模型如此),跨 kernel 的 L1 陈旧由 GPU 自身的 fence/启动边界语义处理,不需要 UALink 操心。
  • host CPU 的 cache 走标准 DMA 一致性:入向写以 PCIe/CXL 事务进入主机一致性域,由 PCIe/CXL 的 snoop 机制(或 C2C 上的 CHI)失效 CPU 侧缓存副本。这是主机 fabric 的既有能力,UALink 只是借用。
  • 设备 cache 参与 host snoop(可选、实现相关):规范把 System Node 内一致性列为实现者的事(CXL/PCIe/CHI C2C,硬件或软件皆可)。APU 形态(如 MI300A 那种 CPU+GPU 单封装、片上一致互连)可以做到全硬件;纯 PCIe 插卡形态的 GPU 做不到,就退回软件边界。

所以两家的 home 侧机制殊途同归,真正的分野只在请求方:NVLink 禁止缓存远端行(协议最简、每次访问全付 fabric 延迟),UALink 允许缓存(换重复访问的本地命中,代价是 kernel 边界 flush)。

性能与计算能力对比

先给结论:一致性模型的选择本身对 FLOPS 没有任何影响,它影响的是通信效率和编程负担;而今天的实测差距主要来自别处。

维度GB200/GB300 NVL72(NVLink 5)Helios(MI455X,UALink/UALoE)
单 GPU scale-up 带宽1.8 TB/s 双向AMD 宣称 3.6 TB/s(对标 Vera Rubin 的 NVLink 6 水平)
机柜聚合带宽~130 TB/s宣称 260 TB/s
一致性开销硬件(零软件负担),但重复远端读浪费 fabric 带宽软件 flush,允许本地缓存复用
网内计算SHARP 归约、multicast、NVLS,硅片成熟UALink 1.0 无;In-Network Compute 是后续版本加入的
交换芯片自研 NVSwitch(私有)博通 Tomahawk 6 外采(开放、便宜,但属过渡性 UALoE)
出货状态2026 年 7 月起量产交付H2 2026 起小批量爬坡,量产生要 2027

具体影响分负载看:

  • 训练(以 AllReduce/AllToAll 为主):同步点本来就落在 kernel 边界,UALink 的软件 flush 摊进去几乎零额外成本。此时一致性模型打平,差距在别处:NVLink 的 SHARP 网内归约能省一半集合通信流量,multicast 直接硬件复制——这是 NVIDIA 多年迭代的硅片红利;UALink 1.0 没有这些 offload,Helios 初期要用交换机做透明转发,集合通信得走 GPU 软件路径。这就是为什么分析师的评价是:Helios 纸面规格漂亮,但"尚未证明其开放 fabric 在关键负载上能匹配 NVLink",要等拓扑、跳数、bisection、collective offload 数据披露。

  • 推理/细粒度共享(EP 热专家、KV 跨 GPU 复用):这是 UALink"允许缓存 peer 数据"理论上占优的场景——重复读共享数据可命中本地 L2,省 fabric 流量。但这只是理论选项,实际上今天的推理栈也是显式拷贝/RDMA 服务这类访问,且这方面的胜负手同样被网内计算和软件栈成熟度盖过。

  • 延迟:UALink 规范目标是 cable <4m、Req-to-Resp RTT <1μs(与 NVLink 同量级);但 Helios 首代用的是 UALinkover Ethernet(UALoE)过渡方案,以太网 PHY 的延迟和确定性有固有代价,Tom’s Hardware 直接以"以太网的缺点可能拖累性能"为题报道。

  • 厂商宣称 vs 实测:AMD 宣称 Helios 对 Vera Rubin NVL72 有 15% 更多 FP4 算力、50% 更多 HBM 容量、30% 更高 tokens/$——但均为 AMD 自家建模数字,双方口径还故意不对齐(dense vs sparse)。截至 2026 年 8 月,Rubin NVL72 已量产发货而 Helios 仍是参考设计状态,第三方同负载 benchmark 预计 2027 年才出现。

总结:在 home 侧,UALink 类主机靠"home GPU 的 L2 串行化 + PCIe/CXL 对 CPU cache 的标准 snoop + 可选的 C2C 硬件一致"拼出目标节点内一致性,与 NVLink 机制同源;分歧仅在请求方缓存策略,而这个分歧对当前负载(训练)的性能影响远小于网内计算 offload 和软件栈成熟度——目前这两项都是 NVIDIA 的存量优势,UALink 阵营的胜负手在开放供应链和 1024 加速器的扩展域,需要用 2027 年的实测来证明。

6. fabric 内同步

NVLink barrier 等多播同步原语,配合 atomic 完成跨 GPU 的硬件级同步。

这块是 Blackwell 代际里最被低估的改动之一。先给全景,再拆机制。

为什么需要 fabric 内同步

NVL72 出现之前,跨 GPU 同步的标准做法只有一个:回软件。数据靠 NVLink/RDMA 传完,然后每个 GPU 的 kernel 结束 → CUDA event 流同步 → host 端 barrier → 再发下一个 kernel。一次跨 GPU 握手走下来是~10μs 级的延迟,而且 CPU 全程参与调度。

但 NVL72 的卖点是"72 卡一个一致性域、kernel 内直接访问 peer 显存"。如果你好不容易做到了 kernel 内 load/store 直达对端 HBM,结果每次同步还要退出 kernel 让 CPU 仲裁——fabric 的低延迟优势就被同步开销吃掉了。所以 Blackwell 把同步本身也下沉到了 fabric 里,目标是把跨 GPU 的握手压到~1μs 以内,并且不占 CPU。

三层机制,从轻到重

第一层:multicast 写 + 本地轮询(纯数据面技巧,Hopper 就有)

这是 NCCL NVLS(NVLink SHARP)路径的基础。机制是利用 multicast 地址的一个不对称特性:

  • 写 multimem 地址:交换机把这次写复制到组内所有GPU 的物理显存——一次写,N 份落地;
  • 读 multimem 地址:读的是本 GPU 自己的那一份(读不聚合)。

于是软件 barrier 可以这样做:组内每个 GPU 往同一个 multicast 地址写一个"我已到达"标志 → 交换机复制到所有人 → 每个 GPU 轮询自己本地的那份副本(本地 HBM 读,亚微秒)直到凑齐 N 个到达位 → 放行。

巧妙的点在于:轮询不发生在远端显存上,而是发生在"被 multicast 复制过来的本地副本"上,把跨 fabric 的反复轮询变成了本地读。NCCL 里 NVLS 的 barrier 和 AllReduce 同步段就是这么实现的。

第二层:sys-scope atomic(NVSwitch 内的原子单元)

CUDA 内存模型的 scope 体系里,.sys层级的原子操作(atom.add.sys、red.release.sys等)语义上要对"整个系统"可见——在 NVL72 里就是整个 rack 的 fabric。Blackwell 的 NVSwitch 里有专门的原子执行单元,sys-scope atomic 不会在 home GPU 的 L2 里做读-改-写,而是在交换机上就地执行:请求上到 switch,ALU 改完计数器直接返回,少一次到对端 HBM 的往返。

这层解决的是"跨 GPU 的信号量/计数器"问题:生产者 GPU 发完数据后执行一条red.release.sys(release 语义保证数据写在 flag 之前完成并全局可见),消费者 GPU 对同一地址ld.acquire.sys或 atomic 读,拿到最新值就知道数据到了。atomic 的落地位置(switch 而非远端 L2)把一次跨 GPU 信号从"两次 NVLink 往返 + L2 访问"压成"一次到 switch 的往返"。

DeepEP、NVSHMEM 这类 kernel 内通信栈的 dispatch/combine 同步,本质上就是大量复用这一层:buffer 指针交换走 atomic,数据面走普通 store/load,配fence.sys保证顺序。

第三层:NVLink barrier(Blackwell 新增的硬件 barrier 原语)

前两层都是"用内存语义拼出来的同步",Blackwell 则把 barrier 做成了 fabric 的一等公民指令:

  • 每个 GPU 执行 barrier arrive 指令,产生一个 arrive 消息(带 barrier ID)发给所连的 NVSwitch;
  • switch 内的 barrier 状态机跟踪该 barrier 的到达计数,凑齐组成员数后,向组内所有 GPU 广播 release;
  • 等待侧的 warp 挂起在 barrier wait 上,收到 release 后由硬件唤醒,继续执行。

对比第一层的软件 multicast barrier:软件方案要"写标志 → 复制 → 本地轮询 N 次",是多个内存事务的序列;硬件 barrier 是交换机里一个计数器 + 一次组播,延迟和 fabric 往返同量级,而且不占显存带宽、不需要本地轮询循环。DeepGEMM 的 SM100 kernel 和 NCCL 的新传输层都在用这一层做 grid 级/跨 GPU 的 barrier。

配置方式与 multicast/SHARP 组同构:Fabric Manager 初始化时定义 barrier 组(哪些 GPU 参加、组内计数),运行期 kernel 内直接按 ID 使用。

三层如何配合:一个典型的跨 GPU 生产者-消费者

以 MoE 的 EP dispatch 为例,一次完整的跨 GPU 握手是这样的:

  1. 生产者 GPU 的 TMA/SM 把 token 数据store 到消费者 GPU 的显存(远端写,经 NVSwitch 路由,home L2 落地);
  2. 数据写完后,生产者对消费者显存里的计数器发一条red.release.sys——release 语义保证第 1 步的所有写在此 atomic 之前全局可见;atomic 在 switch 内执行,计数器 +1;
  3. 消费者的 SM 轮询自己显存里的计数器(本地读),或直接被 NVLink barrier 的 release 唤醒;
  4. 凑齐后消费者开始读数据——读的时候对源数据地址用ld.acquire.sys或直接普通读(因为一致性由 home L2 保证)。

如果是 AllReduce 这类集合操作,还要叠加 SHARP:各 GPU 把部分和作为multicast atomic add发出,switch 内的 SHARP ALU 做归约,结果 multicast 回所有成员——数据只上 fabric 一次(NVLS 把 AllReduce 流量减半的关键)。

效果:同步从"边界事件"变成"流水线节拍"

这套机制的实际意义可以用一个数字概括:软件路径的跨 GPU 同步(kernel 退出 + host barrier + kernel 重入)是10μs 级;三层 fabric 内同步把单次握手压到1μs 上下,于是"跨 GPU 依赖"第一次可以作为流水线内部节拍来使用,而不是只能放在 kernel 边界——

  • EP/TP 的通信-计算重叠不再靠多 stream 冒险,producer 发完 64KB tile 就 arrive barrier,consumer 的下一个 warp 已经在等,细到 tile 粒度的流水;
  • Prefill/Decode 分离(PD 分离):prefill 节点把 KV 块写完 + release,decode 节点 acquire 后直接读,免去了 host 端的事件链;
  • X-Stage 这类 DiT 工作负载里测到:用远端 store + fabric barrier 替代本地 stage,单步延迟的通信占比能压到可忽略。

一个值得注意的演进方向

本节起初引用的这句其实还停在 Blackwell 的描述。Rubin(NVLink 6)在这个方向上又进了一步:counted writes——接收侧维护一个"写入字节计数器",发送侧发完数据后不再需要 memory barrier + atomic flag 两步,接收侧看到计数达标即知数据完整,把"同步"从独立的消息进一步折叠进数据流本身。NVIDIA 披露这一点时的定位很直白:Blackwell 上跨 GPU 传输需要 store + fence + atomic 三步协调,Rubin 将其收敛为接收侧一次计数器更新。

这说明 fabric 内同步不是一次性的 feature,而是 NVIDIA 明确在逐代削减的 tax——每一代都在问:"跨 GPU 确认一次数据就绪,最少需要几个消息?"从软件 barrier 的十几个消息,到 multicast flag 的几个,到 NVLink barrier 的两个(arrive/release),再到 counted writes 的数据面捎带——这条收敛曲线本身就是 rack-scale 架构竞争的主线之一。

7. nvlink 协议简单么

User: 听上去,nvswitch 背后的协议并不复杂?
Kimi: 对一半。简单的是一致性协议的状态空间,难的全在别处。这其实是理解 NVL72 设计哲学最好的一扇窗:

确实简单的部分

对比 CXL.cache(要定义 agent 间几十种消息、行状态机、deadlock 规避,几千页规格),NVLink fabric 的语义薄得像一张餐巾纸:读、写、原子,request/response,按地址查表路由。没有 snoop、没有目录、没有 MESI。这份"简单"不是没能力做复杂,而是主动用架构约束把复杂性消灭了——禁止请求方缓存远端行,等于把一致性问题的定义本身删掉了。

但复杂性守恒,只是搬了家

1. 物理层:这可能是全球最难做的数字芯片之一。每颗 NVSwitch 是 72 端口 × 200 Gb/s = 14.4 TB/s 的 cut-through crossbar。 224G PAM4 SerDes 在背板上的信号完整性、72 路同时满速仲裁不阻塞、cut-through 延迟——这颗芯片的面积、功耗、封装难度不亚于 GPU 本身。协议简单≠硅片简单。

2. 排序:multicast 和点对点混在一起时的正确性。fabric 里同时存在三类流量:点对点读写、multicast 复制、barrier 释放。硬性规则是:barrier 的 release 绝不能越过之前的数据写到达。这要求交换机在支持 fan-out(一份数据复制 N 份、各走不同出端口)的同时维持 per-address 的顺序保证,又不能让所有流量被 fan-out 堵住(head-of-line blocking)——虚通道分配、多播排序树,每个都是交换机里的实打实的硬件逻辑。

3. 无损与错误处理。整个 fabric 是无损的(credit 流控),但 flit 可能在 9 个 tray 的路径上任一段出错。CRC 检出后要做端到端重传,而重传必须不破坏排序语义——“简单协议"配上"必须绝对可靠”,组合起来就不简单了。还要加 ECC、链路降级、RAS 遥测。

4. 网内计算的正确性是被低估的硬骨头。SHARP 在交换机里做浮点归约,浮点加法不可结合——(a+b)+c ≠ a+(b+c)。要保证 72 卡 allreduce 的结果 bit 级确定、且与 software reduce 语义对齐,交换机内归约的顺序必须是固定的、可复现的,这在并行 fan-in 流上很伤脑筋。同理,交换机上执行的原子操作要和 home L2 对同一地址的串行化关系自洽。

5. 系统管理层的"软件复杂度"。Fabric Manager 要在开机时给 72 GPU × 多实例计算切片分配地址段、生成路由表、配好多播组/SHARP 组/barrier 组、做分区隔离(把 72 口切成多个独立 NVLink 网络)和安全策略(NVSwitch 里那颗安全处理器就是干这个的)。 GPU 故障时的 fabric 重映射、固件升级、机密计算模式下的隔离——这些没有一项"简单",只是它们不算"协议"。

"简单"的另一份代价

协议简单还依赖一个前提:GPU 的内存流水线把入向 fabric 请求当成一等公民处理(注入本地 L2 仲裁),且 Fabric Manager、NVSwitch、GPU、驱动全部同一家设计。这个简单是"端到端私有"才能维持的简单——把其中任何一环换成第三方,"简单协议"立刻漏出无数个未定义行为。

侧面证据

如果这套东西真的简单,UALink 阵营不会到今天还在用"交换机做透明转发 + GPU 软件做集合通信"的过渡方案——带多播复制、网内归约、fabric barrier 的原生 UALink 交换芯片(Astera Labs 等)要到 2026 年底以后才出现。NVIDIA 自己从第一颗 NVSwitch(2018 年 DGX-2)到 NVL72 的单跳 72 口 fabric,也迭代了三代芯片、用了七年。

一句话总结:NVLink fabric 是"簿记极简、物理极难"——它把 MESI 那种状态机复杂度换成了 14 TB/s 无损有序交换机的工程复杂度。前者难在正确性证明,后者难在硅片和系统工程;而对一家同时握着 GPU、交换芯片、封装和软件的垂直整合公司来说,后者恰好是它最擅长、别人最没法跟的战场。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询