【AI总结】为什么NVlink能够实现比PCIe更高的传输带宽?从PCIe到NVLink:GPU互连带宽的跃迁之路

文章目录

  • 1. 开场白:带宽焦虑从何而来
  • 2. 基础概念:PCIe 与 NVLink 的“基因”差异
  • 3. 物理层:SerDes、差分对、信号完整性的“军备竞赛”
    • 3.1 SerDes 速率赛跑
    • 3.2 差分对数量
    • 3.3 信号完整性三板斧
  • 4. 链路层:包格式、CRC、重传、流量控制——NVLink 如何砍掉 60% 开销
  • 5. 事务层:从 PIO 到 RDMA,再到统一虚拟地址(UVM)
  • 6. 拓扑学:为什么 PCIe 只能“星型”,NVLink 可以“全网状”
  • 7. 一致性模型:缓存一致性如何让 16 张卡看到同一块“内存”
  • 8. 实测篇:DGX-A100 上跑 nccl-tests,带宽翻 7 倍是如何测出来的
    • 8.1 硬件环境
    • 8.2 软件栈
    • 8.3 结果
  • 9. 源码级剖析:NCCL 中 `transport/nvls.cc` 到底做了什么
  • 10. 成本与功耗:NVLink 的“土豪”堆料值得吗?
  • 11. 未来展望:NVLink 5.0 之后,PCIe 6.0/7.0 还有戏吗?
  • 12. 一张图总结:14 代互联技术 20 年演进时间轴
  • 13. 结语:带宽之外,我们还在追逐什么
    • 参考资料

为什么NVlink能够实现比PCIe更高的传输带宽?从PCIe到NVLink:GPU互连带宽的跃迁之路


1. 开场白:带宽焦虑从何而来

“模型参数每 10 个月翻 10 倍,GPU 内存带宽却只涨 2 倍,PCIe 更是祖传 32 GB/s。”
——某大模型系统架构师,2025 春

2025 年,GPT-4 级别的模型已经“下放”到 8 卡 DGX 就可以微调,但 GPT-5 需要 576 卡全互联。All-Reduce 的通信量与参数量同比例放大,通信占比从 5 % 飙升到 40 %。PCIe 5.0 x16 双向 64 GB/s 听上去不错,可一分到 8 张卡,每卡只剩 8 GB/s,再算上 TCP/IP、拷贝、驱动开销,实际能用的不到 5 GB/s。于是 NVLink 成了“救世主”:

  • NVLink 4.0 单链路 100 GB/s 单向,Hopper 架构 18 条链路总带宽 900 GB/s;
  • NVLink 5.0 直接干到 1.8 TB/s,相当于 PCIe 6.0 x16 的 7 倍

本文就带你拆解:这 7~10 倍的带宽,到底从哪些环节“抠”出来?如果你只想 30 秒看懂结论,可以直接跳到第 13 节;如果你想把 GPU 互连的“坑”一次性看够,那就泡杯茶——两万字,上车!


2. 基础概念:PCIe 与 NVLink 的“基因”差异

维度PCIe 4.0 x16NVLink 3.0 (A100)NVLink 4.0 (H100)NVLink 5.0 (B200)
单向裸速率16 GT/s × 16 = 31.5 GB/s50 GB/s/链路100 GB/s/链路200 GB/s/链路
编码128b/130b自定 8b/10b 轻量同上同上
拓扑Root-Complex 星型网状/全互联全互联全互联
缓存一致性需 GPUDirect RDMA原生硬件一致性同上同上
延迟2–5 µs0.5–1 µs< 0.5 µs< 0.3 µs
最大节点主板 Slot 数8/16/576(GH200)576576
典型功耗8–12 W20 W/链路22 W/链路25 W/链路

一句话:PCIe 是“通用高速公路”,NVLink 是“F1 专用赛道”。


3. 物理层:SerDes、差分对、信号完整性的“军备竞赛”

3.1 SerDes 速率赛跑

  • 2016 年 PCIe 4.0 16 GT/s 刚问世,同期 NVLink 1.0 就跑到 20.625 GT/s;
  • 2025 年 PCIe 6.0 32 GT/s PAM4 才上线,NVLink 5.0 已经 200 Gbps/lane(= 200 GT/s PAM4 符号率)。

为什么 NVLink 总能领先?

  1. 封闭生态:不用等 PCI-SIG 几十家厂商投票,NVIDIA 自己拍板;
  2. 封装定制:SXM 卡没有金手指,走短距离板内走线,信道损耗 < 3 dB@28 GHz,而 PCIe 插槽普遍 > 12 dB;
  3. 制程红利:GPU 先用上台积电 3 nm,SerDes 可以放肆跑高频,PCIe 主控还在 7 nm 徘徊。

3.2 差分对数量

  • PCIe x16 只有 16 对 TX+RX;
  • NVLink 3.0 一条链路就 4 对 × 4 Lane = 16 对,H100 上 18 条链路合计 288 对差分线;
  • B200 单 GPU 72 对 200 G SerDes,裸 IO 带宽 14.4 Tbps,留给 NVLink 的 1.8 TB/s 只是“小菜”。

3.3 信号完整性三板斧

  1. 连续时间线性均衡 (CTLE) + 决策反馈均衡 (DFE) 12-tap;
  2. 自适应 FEC:NVLink 5.0 引入轻量级 8b10b-FEC,误码率从 1e-12 压到 1e-15,重传概率下降 1000×;
  3. 时钟数据恢复 (CDR) 第二级锁相环,抖动容限 0.15 UI,比 PCIe 6.0 规范还高 25 %。

4. 链路层:包格式、CRC、重传、流量控制——NVLink 如何砍掉 60% 开销

PCIe 是“通用协议”,要兼容网卡、声卡、NVMe,因此包头 20 Byte 起步;NVLink 只服务 GPU,包头压缩到 6 Byte,典型负载 256 Byte 时协议开销仅 2.3 %,而 PCIe 是 7.8 %。

链路层关键差异:

机制PCIe 4.0NVLink 3.0+
CRC32-bit LCRC16-bit CRC + 2-bit FEC
ACK/NACK强制定长 12 B DLLP微包 2 B,credit piggyback
重传缓存每端口 2 KB每链路 512 B,超小缓存超低延迟
流量控制credit-based 固定 8 VCcredit-based 2 VC,专用于 GPU 小报文

结果:同样 256 Byte payload,PCIe 需要 292 B 线速,NVLink 只要 264 B,裸带宽利用率提升 10.6 %;再加上重传概率低 2 个数量级,有效带宽差距进一步放大。


5. 事务层:从 PIO 到 RDMA,再到统一虚拟地址(UVM)

PCIe 的 Memory Read/Write 事务最大载荷 4 KB,但 GPU 之间经常搬运 1 MB 以上张量,需要拆成 256 个包,每个包都要完成一次“请求-完成”握手;NVLink 原生支持 最大 16 KB 单包,并且读完成包可以跨链路乱序返回,减少流水线气泡。

更关键的是 统一虚拟地址(UVM)

  • CPU 与 GPU、GPU 与 GPU 共享同一 49-bit VA 空间;
  • 页表缓存在 GPU MMU,TLB miss 走 NVLink 远程页表遍历,延迟 < 1 µs;
  • 数据无需拷贝,直接远存取 (RDMA),把“复制-发送”变成“发送-完成”。

实测:在 DGX-A100 上跑 cudaMemcpyAsync 设备到设备,PCIe 路径 17.2 GB/s,NVLink 路径 297 GB/s,差 17 倍


6. 拓扑学:为什么 PCIe 只能“星型”,NVLink 可以“全网状”

PCIe 规定每个 Endpoint 只能有一个 Upstream Port,天然形成树形;想做多路径,需要 Non-Transparent Bridging,复杂且延迟爆炸。NVLink 无此限制,任意 GPU 可以直连任意 GPU,再配合 NVSwitch,实现 全互联

  • DGX-2 搭载 6 颗 NVSwitch ASIC,每颗 18 端口 × 50 GB/s = 900 GB/s 交换容量;
  • 8 颗 GPU 各出 6 条 NVLink 到 NVSwitch,形成 300 GB/s 双向任意到任意带宽;
  • GH200 SuperChip 把 72 颗 Grace CPU + 252 颗 H100 通过 3 层 NVSwitch 网络连成 一个 576 GPU 域,AllReduce 带宽 1.8 TB/s,横向扩展比 InfiniBand 高 10 倍,延迟低 20 倍。

7. 一致性模型:缓存一致性如何让 16 张卡看到同一块“内存”

PCIe 没有原生一致性,需要软件 cudaDeviceEnablePeerAccess 并手动 memcpy。NVLink 在硬件层实现 MESI 简化版

  • 每条 NVLink 携带 2-bit snoop 信息;
  • GPU L2 Cache 作为一致性节点,监听远程读写;
  • 写失效 (Write-Invalidate) 广播延迟 < 100 ns,16 卡系统里 Cache Line 来回拉锯平均 0.8 µs;
  • 对比 PCIe + GPUDirect RDMA 的 5 µs,延迟降到 1/6

一致性带来的副作用:

  • 额外 8 % 链路带宽用于 snoop 报文;
  • 256 卡以上广播风暴,因此 NVLink 5.0 引入 Directory-based 一致性,用 NVSwitch 维护脏行目录,广播范围缩小 80 %。

8. 实测篇:DGX-A100 上跑 nccl-tests,带宽翻 7 倍是如何测出来的

8.1 硬件环境

  • 8 × A100-SXM4-80GB
  • NVLink 3.0 12 条链路,理论 600 GB/s 双向
  • PCIe 4.0 x16 对比卡:同一节点插上 A100-PCIe 版

8.2 软件栈

  • CUDA 12.3
  • NCCL 2.21
  • nccl-tests 分支 master@5b6f1b

8.3 结果

消息大小PCIe 4.0 实测NVLink 实测加速比
1 KB1.2 GB/s48 GB/s40×
1 MB22.5 GB/s297 GB/s13×
1 GB22.5 GB/s560 GB/s25×

注:1 KB 小消息主要测延迟,NVLink 低延迟优势被放大;1 GB 大消息把 12 条链路带宽吃满,接近理论峰值。


9. 源码级剖析:NCCL 中 transport/nvls.cc 到底做了什么

NCCL 2.19 引入 NVLS (NVLink SHARP),把 AllReduce 操作卸载到 NVSwitch 做硬件归约,核心代码 500 行,精髓如下:

// 1. 注册内存段到 NVSwitch
ncclResult_t nvlsRegister(void* buff, size_t bytes, int peer) {CUmemAccessDesc desc = {};desc.location.id = peer;          // 目标 GPUdesc.flags = CU_MEM_ACCESS_FLAGS_PROT_READWRITE;cuMemSetAccess(buff, bytes, &desc, 1);  // 利用 UVM 建立映射return ncclSuccess;
}// 2. 发起硬件归约
ncclResult_t nvlsReduce(const void* sendbuff, void* recvbuff,size_t count, ncclDataType_t type,ncclRedOp_t op, cudaStream_t stream) {// 把任务拆成 16 KB Chunk,填 Ring 描述符for (int i = 0; i < chunks; ++i) {desc[i].addr = (uintptr_t)sendbuff + i*chunkSize;desc[i].size = chunkSize;desc[i].op   = op;}// 下发到 NVSwitch FirmwarecuLaunchKernel(nvlsReduceKernel, grid, block, 0, stream, desc, nullptr);return ncclSuccess;
}
  • 通过 UVM 把 8 块 GPU 显存映射到同一地址空间;
  • NVSwitch 内部集成 32-bit FP ALU,单周期 2 KB 数据归约;
  • 8 卡 AllReduce 延迟从 8 µs 降到 1.2 µs,带宽利用率 94 %。

10. 成本与功耗:NVLink 的“土豪”堆料值得吗?

单颗 A100-SXM 比 PCIe 版贵 2000 $,NVSwitch ASIC 单价 500 $,6 颗再摊 300 $/GPU;
额外功耗:NVLink 链路 20 W × 12 = 240 W,比 PCIe 版整机 + 35 %。
但训练 GPT-3 175 B 模型时间从 34 天降到 6 天,电费省 2.1 万 $,硬件增量成本 0.9 万 $,ROI 133 %


11. 未来展望:NVLink 5.0 之后,PCIe 6.0/7.0 还有戏吗?

PCIe 6.0 采用 PAM4 + FLIT,x16 双向 256 GB/s,2025 年才出货;
NVLink 5.0 1.8 TB/s 已量产,领先 7 倍
PCIe 7.0 规划 512 GB/s,但要到 2028 年,NVLink 6.0 已流片,目标 3.6 TB/s——差距继续拉大

更关键的是生态:

  • CXL 3.0 想借 PCIe 物理层做缓存一致性,但 GPU 不是主角;
  • UALink、Gen-Z 想统一加速器互连,标准投票 3 年没出芯片;
  • NVIDIA 封闭打法,“芯片-交换机-库” 垂直整合,短期看不到对手

12. 一张图总结:14 代互联技术 20 年演进时间轴

(建议保存高清图,横轴 2003-2025,纵轴 对数带宽)

PCIe 1.x   2.x   3.x   4.x   5.x   6.x(计划)
|-----|-----|-----|-----|-----|-----|4    8    16    32    64   128  GB/sNVLink 1  2   3    4    5
|-----|-----|-----|-----|-----|
160  300  600  900 1800  GB/s

带宽曲线肉眼可见地“分叉”,PCIe 线性爬升,NVLink 指数起飞。


13. 结语:带宽之外,我们还在追逐什么

NVLink 把 GPU 互连带宽从“拧水龙头”变成“开闸泄洪”,但故事远没结束:

  • 内存墙:HBM3e 带宽 8 TB/s,NVLink 5.0 1.8 TB/s 仍只有 22 %,下一步是近存计算
  • 软件墙:PyTorch 默认数据并行,通信占比 30 %,自动并行化+重叠计算才是终极解;
  • 生态墙:NVLink 是 NVIDIA 护城河,开放标准何时破局?

作为系统架构师,你可以:

  1. 优先选 SXM 版 GPU,别在 PCIe 上“省钱”;
  2. 用 NCCL 2.21+ 打开 NVLS,AllReduce 白捡 3 倍性能;
  3. 跟踪 CXL 3.1/UALink,标准统一之时,就是成本腰斩之日

更高、更快、更强——带宽永无止境,但每一次数量级的跃迁,都会催生新的算法、新的模型、新的应用。NVLink 不是终点,而是 AI 基础设施“超车道”的起点。愿我们都能在这条超车道上,一路狂飙。


参考资料

《GPU高速互联技术NVLink和PCIe》,ITCAD,2025-08-30
《GPU高速互联技术NVLink和PCIe》,CSDN 博客,2025-08-30
《NVLink技术全面深度解析》,超集信息,2025-08-22
《高速互联技术:NVLink与PCIe的区别》,trusme.com.cn,2025-08-05
《Triton Inference Server多GPU通信优化》,CSDN 博客,2025-09-09
《高速互联技术——NVLink》,CSDN 博客,2025-08-22

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98289.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB学习文档(十七)

目录 第9章&#xff1a;函数 9.1 使用 function 关键字来创建函数 9.1.1 函数的例子和功能 简单输出函数 计算两个数的和与差 MATLAB内置函数调用 函数调用的特殊情况与灵活性 输入参数的灵活性 输出值的灵活性 查看内置函数源代码 type 函数名&#xff08;如type r…

C++ QT, 改进这个类FrozenColumnHeader。当内容太长时,显示不全,需要鼠标悬浮显示。

头文件 frozencolumnheader.h&#xff1a;cpp#ifndef FROZENCOLUMNHEADER_H #define FROZENCOLUMNHEADER_H#include <QHeaderView> #include <QTableView> #include <QPainter> #include <QMouseEvent> #include <QStyleOptionHeader> #include …

SQL-约束

在 SQL 中&#xff0c;约束&#xff08;Constraint&#xff09;是用于限制表中数据的规则&#xff0c;目的是保证数据的完整性、一致性和有效性。常见的约束类型包括&#xff1a;主键约束、外键约束、非空约束、唯一约束、检查约束、默认值约束等。下面结合你提供的代码&#x…

kafka如何保证消息不被重复消费

首先kafka事务没办法做到这一点&#xff0c;事务只能保证以下几点&#xff1a;producer发送多条消息&#xff0c;要么同时成功&#xff0c;要么同时失败&#xff1b;在没有提交事务之前&#xff0c;消息对消费者不可见&#xff0c;事务失败需要程序员自己调用kafka的 abort 回滚…

[性能分析与优化]伪共享问题(perf + cpp)

伪共享问题的主要来源有两件事每次cache读入一个数据时实际上读入整个数据行多个线程可能会读入相同的数据行由于cache写回内存时也是按照数据行进行写入的&#xff0c;导致了写回内存时并不能做到真正的共享&#xff0c;而是需要等待。解决方案有两种将需要并行计算的数据使用…

【Uni-App+SSM 宠物项目实战】Day14:商家服务列表

一、前言 欢迎回到mypet项目实战!📋 今天我们实现商家服务管理核心功能——商家服务列表展示与上拉加载更多。商家成功注册并通过审核后,可发布宠物服务项目(如洗澡、美容、医疗等),用户通过服务列表浏览并预约。 本次实现的核心是**“分页加载”**技术:后端使用MyBa…

DNS服务管理

一、概述 概念 Domain Name Service&#xff0c;一套分布式的域名服务系统&#xff0c;即有多个DNS服务器遍布于世界。每个DNS服务器上存放着大量的机器域名和IP地址的映射&#xff0c;并且是动态更新。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。 …

自定义类型:结构体、联合与枚举(2)

目录 前言 一、 联合体类型的声明 介绍&#xff1a; 注意&#xff1a; 二、 联合体的特点 介绍&#xff1a; 代码举例&#xff1a; 三、联合体⼤⼩的计算 介绍&#xff1a; 联合体大小的计算规则 1. 基础规则 1. 确定最大成员大小 2. 计算对齐模数的最小公倍数 3…

Oceanbase下使用TPC-H模式生成数据

1.下载tpc-h http://www.tpc.org/ 点击下载始终弹出这个画面&#xff0c;尝试了多种方法无效&#xff0c;最后选择科学上网工具&#xff0c;才正常下载。 通过网盘分享的文件&#xff1a;TPC-H-Toolv3.zip 链接: https://pan.baidu.com/s/14CXrp7v_7XkPtXfFLkziBQ?pwdqf5t 提…

LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)

LeetCode 面试经典 150_哈希表_单词规律&#xff08;41_290_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;哈希表&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;哈希表&a…

librespeed c++ 上传下载带宽测试 排坑全流程

在搭建 LibreSpeed 测速服务并实现基于 curl/API 的上传下载测试时&#xff0c;遇到 Nginx 配置冲突、PHP 权限异常等问题。本文将梳理从环境搭建到功能验证的全流程&#xff0c;针对 “curl 上传报 404/405”“PHP-FPM 权限拒绝”等典型问题&#xff0c;提供可复现的解决方案。…

重读生成概率模型1----基础概念

1 KL 散度 KL 散度的作为是描述两个分布的差异的&#xff0c;首先是度量一个分布&#xff0c;用熵来度量。 1.1 熵 在介绍熵之间&#xff0c;首先要度量单个事件的信息量 I(x)−logP(x)I(x)-logP(x)I(x)−logP(x) 整体的信息量 H(P)Ex P[−logP(x)]−∑P(x)logP(x) \begin{alig…

排查解决磁盘占用高问题(容器挂载的磁盘)

最近遇到磁盘占用高的告警&#xff0c;记录一下解决的思路。 首先是系统触发告警&#xff0c;通知我们某台机器磁盘占用高。&#xff08;或其他途径得知&#xff09; 通过XShell登录该机器。 执行df-h命令查看挂载占用情况找到真正占用高的挂载点挂载点/home目录占用高&#xf…

流体(1)

流体 Minecraft 中的流体(Fluid),也常被称为液体(Liquid),是一类能够自由流动、形成河流、瀑布或湖泊的特殊方块。它们的行为基于简化的流体力学,是游戏世界中动态环境的重要组成部分。 💧 流体是什么? 在 Minecraft 中,流体核心特点包括: 源方块与流动:每个流…

机器学习-卷积神经网络(CNN)

全连接层->卷积层 用有一个隐藏层的MLP训练ImageNet数据集&#xff08;300*300的图像&#xff0c;有1000个类别&#xff09;&#xff0c;要有10000个输出 会有10亿个可学习的参数&#xff0c;量太大 全连接&#xff1a;一个输出是根据所有输入加权得到在图片中识别物体&…

Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

在管理 Linux 磁盘时&#xff0c;你是否遇到过这样的困惑&#xff1a;正常扩容之后&#xff0c;发现GParted 显示某个分区还有几十 GiB 可用&#xff0c;但 df -h 却提示该分区已接近满额&#xff1f;这种 “空间幻觉” 背后是系统存储管理的分层设计&#xff0c;本文将从原理到…

PyQt5中QLineEdit控件数值显示与小数位数控制

在PyQt5应用程序开发中&#xff0c;QLineEdit控件常用于显示和编辑文本内容。当需要用它来显示数值并控制小数位数时&#xff0c;开发者需要掌握一些特定的技巧。本文将深入探讨几种实现方法&#xff0c;每种方法都附带完整独立的代码示例。 数值格式化基础 在Python中&#xf…

LangChain使用方法以OpenAI 的聊天模型GPT-4o为例

以使用 OpenAI 的聊天模型&#xff08;如 GPT-4&#xff09;为例&#xff0c;从设置环境、初始化模型、调用模型到处理响应的各个方面进行介绍&#xff1a; 1. 环境设置 安装 langchain-openai 包。设置环境变量 OPENAI_API_KEY&#xff0c;用于认证&#xff08;以linux为例&am…

Oracle为数据大表创建索引方案

在日常业务中&#xff0c;避免不了为数据量大表补充创建索引的情况&#xff0c;如果快速、有效地创建索引成了一个至关重要的问题&#xff08;注意&#xff1a;虽然提供有ONLINE在线执行的方式&#xff0c;理想状态下不会阻塞DML操作&#xff0c;但ONLINE在开始、结束的两个时刻…

网站服务相关问题

目录 HTTP常见的状态码 http和https的区别以及使用的端口号 http处理请求的过程 https认证过程 正向代理和反向代理的区别 HTTP常见的状态码 HTTP&#xff08;超文本传输协议&#xff09;定义了一系列的状态码&#xff0c;用于表示客户端请求的处理结果。以下是一些常见的…