---
# System prepended metadata

title: 2025 7月2日 日常報告 主題 ：NVLink、NVSwitch

---

# 2025 7月2日 日常報告 主題 ：NVLink、NVSwitch
## Ref
[深入PCI与PCIe之一：硬件篇](https://zhuanlan.zhihu.com/p/26172972)

[PCI/PCIe(1): 基礎篇](https://hackmd.io/@RinHizakura/rklZtud9T)

[NV A100 Tensor Core GPU Architecture](https://images.nvidia.com/aem-dam/en-zz/Solutions/data-center/nvidia-ampere-architecture-whitepaper.pdf#:~:text=Ampere%20architecture,GPU%20communication%20bandwidth%2C%20and%20improved)

[P100](https://zhuanlan.zhihu.com/p/635788964)
## NVLink 點對點高速連接與協定原理
NVLink是一種高帶寬的近距離序列介面，用於GPU之間（或GPU與CPU之間）進行資料和控制訊息傳輸。與傳統的PCIe集中式匯流排不同，NVLink採用**多條差分對線**組成點對點（Point-to-Point）的**網狀拓撲連接**，沒有中央交換樞紐。每對NVLink裝置之間建立直接高速連結，可視為在電路板上多對銅線承載的專屬通信通道，由強健的軟體協定控制資料傳送
![v2-352487d20e575deeca69f0b16b81f3e6_1440w](https://hackmd.io/_uploads/H15vDSWBeg.jpg)

### 簡易版的的網狀拓撲（Mesh Topology） 
```t

  [GPU0]───┬────[GPU1]
     │     │
     │     │
  [GPU3]───┴────[GPU2]

```

在 DGX 系統裡，會加入一顆叫做 NVSwitch 的晶片，用來讓：

所有 GPU 都能彼此直接連通
就像一個 高速交換器，把每張 GPU 都用 NVLink 連到交換器上

```
      ┌─────────────┐
      │   NVSwitch  │
      └─────┬───────┘
            │
    ┌───────┼───────┐
 [GPU0] [GPU1]...[GPU7]

```
### 原理
>在運作原理上，NVLink類似一條高速記憶體共享匯流排：它允許處理器之間以幾乎共用記憶體的方式交換資料，並透過循環冗餘校驗（CRC）和封包重傳機制確保資料可靠傳輸

* CRC（Cyclic Redundancy Check）：
    是一種檢查資料有沒有出錯的數學方法
每一包資料在送出前都會加上一組「CRC 校驗碼」
接收端收到資料後會重新計算一次 CRC
如果不一致 → 表示資料有損壞

* 封包重傳（Retransmission）：
如果 CRC 檢查不過，NVLink 會自動要求重傳那一包資料
這樣就確保：即使在高速運作下，資料也能保證正確送達

> 其實很像是網路協議中的checksum機制，但運作方式不同

| 項目   | CRC               | TCP checksum                    |
| ---- | ----------------- | ------------------------------- |
| 運算方式 | 多項式除法（XOR 位元運算）   | 加總（16-bit one's complement sum） |
| 偵測能力 | 強（可發現連續錯誤）        | 弱（易漏抓某些錯誤）                      |
| 用途   | 高速實體層 / 封包校驗      | 傳輸層 / 基本資料校驗                    |
| 常見應用 | Ethernet、PCIe、USB | TCP、UDP                         |

> 問題又來了，記憶體共用不會導致記憶體污染？

NVLink 本身「不處理記憶體一致性」問題，它只是傳輸通道。真正控制一致性的是上層架構與軟體 API。


### 差分對線
差分對線 = 兩條訊號線，一正一負，同步傳送資料

不像早期的電路只用一條訊號線 + 接地線（single-ended），差分傳輸會用 一對信號線（+ 和 -） 傳送相同但反向的訊號。
#### 🔒 優點一：抗干擾能力強（Noise Immunity）
外部電磁干擾（EMI）會同時影響 D+ 和 D−
但接收端只看「兩者的差值」，共通干擾會被自動消除
👉 所以適合高速傳輸（GHz 級別）

#### ⚡ 優點二：訊號完整性高（Signal Integrity）
差分線對的阻抗匹配 + 緊密佈線，減少反射和串音
可以傳很快、很遠的數據

#### IN NVLINK
每個 NVLink Link = 多個 Sub-Link
每個 Sub-Link = 多個 差分對（differential pairs）
每個差分對傳一組資料位（bit）串流


#### 由來
PCI 發展後期，資料傳輸量增大，因此產生PCI-X和AGP

PCI-X -> 提高頻率
AGP -> 在同頻率下想辦法塞更多資料(一個clock下傳更多)
![截圖 2025-06-30 晚上7.26.48](https://hackmd.io/_uploads/HyDsVlgrxe.png)
但由於是並行傳輸，干擾的問題增加 -> 因此採用差分傳輸來穩定訊號 
不過現在的SATA/SAS/PCIe基本改用串行而非並行
#### 並行 串行
| 傳輸方式           | 說明                   |
| -------------- | -------------------- |
| 並行傳輸（Parallel） | 多條資料線同時傳送多個 bit      |
| 串行傳輸（Serial）   | 一條資料線一次傳送一個 bit，依序送出 |

兩者差異

| 項目       | 並行傳輸                 | 串行傳輸        |
| -------- | -------------------- | ----------- |
| 傳輸線數     | 多條（8、16、32條）         | 少條（常為1\~4條） |
| 硬體成本     | 高（需多線、多插針）           | 低           |
| 同步難度     | 高（需同時到達，會有「偏移/時序問題」） | 易同步         |
| 抗干擾能力    | 差（線多易串音）             | 好（差分對+編碼）   |
| 傳輸距離     | 短（訊號衰減大）             | 遠（可數公尺以上）   |
| 傳輸速度（現代） | 比串行慢（受限於同步難度）        | 非常快（GHz級）   |

速度上很不直覺，因為
```
並行傳輸：
需要 8 條資料線
一個時鐘周期內傳送 8 bit

串行傳輸：
只用 1 條資料線
每個時鐘傳 1 bit，要 8 個時鐘周期
```
不過要把實際狀況考慮進去
```
並行傳輸像「8 條腳踏車道」：
同時 8 輛車出發 → 傳 8 個資料
但：
每輛車要同時抵達目的地（要同步）
每條車道長短不能差（要等長）
車多時會互相干擾（串音）

串行傳輸像「1 條磁浮列車高速軌道」：
一次一個車廂，但車廂速度極快，毫無干擾
抵達速度遠超腳踏車 → 雖然一次只傳 1 bit，但一秒內可以送數十億 bit（GHz 等級）
👉 所以「並行頻率受限、同步困難」，而「串行可拉到超高頻率，單線也能贏」
```
這就回到了一開始的問題，當吞吐量增高，並行會有干擾的問題導致頻率上不去，而這使得雖然一次可以送多，但容易錯誤且缺漏，且要求同步到達的前提過高
故改為串行，雖然一次少量，但穩固且抗干擾，頻率自然能拉高，使得吞吐量上升

且 CDR、SerDes(資料bit串化)+encode、差分使得串行變得可靠
#### CDR 
CDR = Clock Data Recovery
意思是：「在資料線上，沒有獨立的時脈線，但接收端仍然能從資料中恢復出正確的時脈」，用來判斷資料 bit 的切換時機。

>這是由於各個硬體之間的clock不一定相同，所以資料傳輸過程中，接收方會不知道怎麼處理這些bits
如果很難想像，你可以試著用DFF的角度思考，如果今天有10hz與20hz的DFF分別放在接收與發送端，10hz那邊一定會漏資料，對吧

而因為在串行中
✅ 只有一條資料線（或差分對）
🚫 沒有獨立的時脈線（不像並行總線會配一條 Clock 線）
所以我們要設計能讓接收端知道發送端的clock的協議
>「從資料流的節奏，估出原本的時脈，自己重建出來」

這就是encode的用處，你增加了一個bits，作用是用來跟對方說我的頻率是多少，用來識別資料流

* 專業一點來說
    - 資料編碼：
串行資料通常會使用編碼技術（例如 8b/10b、64b/66b、128b/130b）來保證資料中有足夠「變化」（例如不能一直是 0 或 1）
     -   相位比較器（Phase Detector）：
比對資料變化發生的時間和本地時脈，調整對齊 (調整成local端的clock)
    -    鎖相迴路（PLL / CDR Circuit）：
使用電子電路「拉近」接收端的內部時脈與資料變化的相位，最後達到同步(增加或減少local的頻率，達到同步)
```

發送端資料（Serial bit stream）：
---|‾‾‾|___|‾‾‾|___|‾‾‾|___|  ← 每個 | 是資料變化點

接收端：
    ↑       ↑       ↑       ↑
    CDR 偵測變化點，調整內部 clock，相位漸漸對齊

------------------------------------------------

發送端資料（Serial bit stream）：
---|‾‾‾|___|‾‾‾|___|‾‾‾|___|  ← 每個 | 是資料變化點

接收端：
    ↑       ↑       ↑       ↑
    CDR 偵測變化點，調整內部 clock，相位漸漸對齊
```

## NVHS - NVLink中的物理層
| 特性           | 解釋                               |
| ------------ | -------------------------------- |
| 串列傳輸（Serial） | 使用高速差分對線，一對一對跑 bit stream        |
| 高頻寬          | NVHS 支援每條 link 高達 50+ GB/s（單向）   |
| 低延遲          | 比 PCIe 還低，支援高效率 GPU-GPU 傳輸       |
| 差分對傳輸        | 使用 Differential Pairs，抗干擾、訊號穩定   |
| 自訂時脈/協定      | 不像 PCIe 要遵守標準，NVHS 完全為 NVLink 優化 |
| 支援 CDR       | 從資料流中恢復時脈，確保同步                   |
### 架構
```t
[NVLink Protocol Layer]
         ↓
[NVHS PHY Layer: SerDes + CDR + EQ]
         ↓
[高速差分對線路]
         ↓
[另一張 GPU 上的 NVHS 接收端]
```
> * NVIDIA Hopper Architecture Whitepaper
說明了 NVLink 4.0 使用的 NVHS 技術（PHY 層）
PDF 下載（頁 41~42）：
🔗 https://resources.nvidia.com/en-us/architecture/hopper-whitepaper

> * NVIDIA Grace Hopper Superchip Whitepaper
說明 NVLink/NVHS 如何應用於 CPU-GPU 間
🔗 https://www.nvidia.com/en-us/data-center/grace-hopper-superchip/



## Topology 拓撲結構
在Topology中，常見的動作有幾個
* Broadcast：A 發資料給所有 GPU
* All-Reduce：所有 GPU 彼此交換資料並彙總

### 第一代的DGX-1 (8張GPU
連結方式 ：Hybrid Cube-Mesh 混合立方體

#### 具體結構：
每張 GPU 最多有 6 條 NVLink
每張 GPU 連接 4 張 GPU（不是全部 7 張）
構成一個類似 3D 立方體的網路
部分連線用了雙 NVLink → 提升頻寬

不考慮全連接(Fully Connected)
太貴：一張 GPU 要有 7 條 NVLink → 超過硬體極限
超出硬體極限

環狀(Ring)，使得最大步數 = 3
#### 問題
然而，由於8卡網絡中並非每對GPU都有直接鏈路連接，在全對全（All-to-All）通信中某些GPU對仍需經過中介轉 hop 或回落到較慢的PCIe通道，導致瓶頸
(這很像NOC中以processor當作router的solution)

## NVSwitch : 為了解決中介的Switch
>Switch = 同個net中的轉送
Router = 不同net的傳送
![截圖 2025-07-01 晚上8.05.24](https://hackmd.io/_uploads/HJbU1L-Heg.png)

![截圖 2025-07-01 晚上7.39.49](https://hackmd.io/_uploads/ByyScB-Bxx.png)
![截圖 2025-07-01 晚上7.40.48](https://hackmd.io/_uploads/HynB9H-Hll.png)
![截圖 2025-07-01 晚上7.58.21](https://hackmd.io/_uploads/H1tO6H-rge.png)
![截圖 2025-07-01 晚上7.59.02](https://hackmd.io/_uploads/ry2o6Hbrxe.png)

> Ref : [NVDIA NVSWITCH](https://images.nvidia.com/content/pdf/nvswitch-technical-overview.pdf?utm_source=chatgpt.com)
> Ref : [NVSWITCH BLOCK](https://www.fibermall.com/blog/analysis-nv-switch.htm?srsltid=AfmBOopfIcm4C-Cnk_U7EVM2tUaA7J7-uKUEz5WzVaiQUySdRXI69-VK&utm_source=chatgpt.com)

 NVSwitch可以理解為一顆內建NVLink埠的高效能交換器ASIC晶片。第一代NVSwitch晶片內部實作了一個18×18全連接交叉交換架構，提供18個NVLink埠，每埠全雙工速度50 GB/s（雙向總和）
 
簡單來說
* 18×18 完全連接交叉交換器（crossbar）： 
交換器內部每個埠能與其他 17 個埠進行直接連接，屬於 非阻塞（non-blocking） 結構 

* 每埠全雙工 50 GB/s： 
包含上行 25 GB/s + 下行 25 GB/s，總計 50 GB/s → 全交換總頻寬達 900 GB/s  

* 應用於 DGX 系列： 
DGX‑2 系統中以多顆 NVSwitch 串接 16 張 V100 GPU； 每張 GPU 有 6 個 NVLink 埠，可透過 NVSwitch 形成高頻寬的 GPU 互連網絡 

### 非阻塞式交換矩陣：
任意埠對任意埠都可在全速進行資料轉發，不會因其他連線的存在而損失頻寬
>非阻塞式交換矩陣是指：
在任何輸入端與輸出端連線的組合中，都可以同時全速傳輸資料，互不干擾。
->所有輸入埠與所有輸出埠之間都有一條獨立的交換路徑

但這就跟網路運作的方式一樣，一定會有同時多個unit要傳送到同一個終點的情況，只是因為中間的通道互相獨立，因此不需要用到網路實作上用於路徑分配的演算法

這種情況下，處理方式差異不大，buffer、queue、priority、round-robin(排隊)、QoS(權重分配)

> 這樣每條通信通道不會被分割？ 就算是通過switch ，我不是還是得要分出多條線路接入switch？

先上規格
| GPU 型號   | 支援的 NVLink 埠數 | 每埠頻寬（雙向）                   |
| -------- | ------------- | -------------------------- |
| **H100** | 18 埠          | 50 GB/s（單向） / 100 GB/s（雙向） |
| **V100** | 6 埠           | 25 GB/s（單向） / 50 GB/s（雙向）  |

可以確定的是，物理上的port數限制還是存在的

### 點對點
每張 H100 有 18 個 NVLink 埠
直連 8 張 GPU，形成點對點拓撲
**每張 GPU 要接其他 7 張 → 每張要用掉 7 條線**

所以
H100 雖然總頻寬有 900 GB/s，但它得分給這 7 條鏈路 → 每條只有大約 128 GB/s


>「因為這次只傳一張 GPU，所以我可以用全部 900 GB/s」

這樣不行，因為 900 GB/s 是總埠數頻寬，而每條是 point-to-point，不能動態合併

簡而言之，每個port的頻寬是固定的，你想要增加吞吐量，那你就只能從物理層面下手，而非動態分配各個port的流量 
-> 你想要更多，那就多接幾條線

> 那為什麼不動態分配port的頻寬呢？

不像網路 switch 或 PCIe fabric 可以動態選路，這是硬體層面，不是軟體

一開始佈線就綁死了該線路的位置與方向，所以物理特性就決定了頻寬的上限


> 為什麼不用大頻寬再動態分配

* 原因1：SerDes 串列技術本身的物理限制
    *    NVLink 使用的是高速差分對訊號（SerDes）
每一對差分線配有專屬的發射端 & 接收端，時脈同步是獨立校準的
    *    若你想合併成一個「超寬通道」，你就得設計：
        1. 一個 多位元同時傳送的大型串列引擎
        2. 一組更高頻、更大擴展範圍的 SerDes
這在高速下（>50GHz）幾乎不可行：

    >同步難度極高
容易產生 時脈偏移（skew）
無法像你說的「水龍頭」一樣精確控制出水大小


## 實際案例
| 技術                     | 說明                                               |
| ---------------------- | ------------------------------------------------ |
| **Thunderbolt 3/4**    | 多條 PCIe + DisplayPort 信號在單條 Type-C 線路中「多工傳輸」     |
| **PCIe Gen5/6**        | 支援 link width 調整（x1, x4, x8, x16），但仍是靠多條 lane 串接 |
| **InfiniBand HDR/NDR** | 用多個 100Gbps lane 聚合成單一連接                         |


## 各代架構比較

> [Picture ref](https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/?utm_source=chatgpt.com)

> [Content ref](https://blog.csdn.net/asialee_bird/article/details/145998718)

P100
![v2-847d92db0a0bf42b37c1fd7bf109f5c6_1440w](https://hackmd.io/_uploads/H14oIr-rle.jpg)

GA100
![gaEfOQD6l3q8p4TzybT7gMVZc8YQkni-0-9ClI9Ei4epE4aHSLjg9-3ON8bkRFZxvm1G-nOCZ9CPy_zqw-EmBWje-sOiSem0oFWA4J7HnhdVdF5RUbrLB7n5-XGKDGznfh6R3xna](https://hackmd.io/_uploads/BknaISZHee.png)


> [ref SM pascal](https://blog.csdn.net/asialee_bird/article/details/145998718)

![v2-ef0c719d48878b1a2c17d13566750289_1440w](https://hackmd.io/_uploads/r1S4HSWHge.jpg)

> [ref SM ampere](https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/?utm_source=chatgpt.com)
![raD52-V3yZtQ3WzOE0Cvzvt8icgGHKXPpN2PS_5MMyZLJrVxgMtLN4r2S2kp5jYI9zrA2e0Y8vAfpZia669pbIog2U9ZKdJmQ8oSBjof6gc4IrhmorT2Rr-YopMlOf1aoU3tbn5Q](https://hackmd.io/_uploads/BJp5BHbHxg.png)

| 架構名稱       | 推出時間 | 製程技術           | 代表 GPU               | 新功能特色                                      |
| ---------- | ---- | -------------- | -------------------- | ------------------------------------------ |
| **Pascal** | 2016 | 16nm FinFET    | GTX 1080, Tesla P100 | 高效能/瓦數比、首次支援 NVLink、FP16 支援                |
| **Volta**  | 2017 | 12nm FFN       | Tesla V100           | 首次加入 Tensor Core、針對 AI 加速設計 (tensor for matrix calculate)               |
| **Ampere** | 2020 | 7nm + 8nm 混合製程 | RTX 30 系列、A100、H100  | 第二代 Tensor Core、第一代 RT Core、超大頻寬、改進多運算資源排程 |
> GPU = 多個 CUDA Core（通用計算單元） + Tensor Core（專用矩陣運算單元） + 其他硬體模塊。

```
GPU（整張顯示卡）
├── SM0（Streaming Multiprocessor）
│   ├── 64 個 CUDA Cores（做算術）
│   ├── 4 個 Tensor Cores（做 AI 加速）
│   ├── 32 KB Shared Memory（多線程共用）
│   ├── Register File（暫存器）
│   └── Scheduler + Warp Dispatcher
├── SM1
├── ...
└── SM N

```
一張 NVIDIA GPU 裡面有很多個 SM，
每個 SM 裡面有很多 CUDA 核心（ALU）可以同時處理數據，
所以 GPU 才能「大量平行計算」。    

### DPX 是什麼？

DPX 是 Hopper 架構中新增的 Dynamic Programming eXtensions 指令集。
✅ 定義
DPX 指令 = 專門為 動態規劃演算法（Dynamic Programming） 設計的加速器指令
加速像是：
DNA 比對（如 Smith-Waterman 演算法）
路徑搜尋（如最短路徑、序列比對）
多階段決策問題

## Driver & Software Layer
### NCCL與集體通信優化 
#### NCCL（NVIDIA Collective Communication Library）
是針對多GPU通信優化的函式庫，專門充分利用NVLink/NVSwitch拓撲進行集體運算。NCCL會自動探知系統中GPU互聯拓撲，為例如DGX-1的8卡混合立方網配置最佳的通信路徑

它實作了高效的環形（ring）和樹形（tree）算法來執行 All-Reduce、Broadcast、All-Gather 等集體操作，並隱式地將GPU編號排列成最佳環路順序，確保充分利用NVLink帶寬

NCCL通過拓撲感知及最佳路由，在軟體層將NVLink網路的潛力發揮到極致，使多GPU協同的通信開銷顯著降低。

#### Fabric Manager 可以在大型拓撲（例如包含多顆NVSwitch的集群）下管理交換路由，確保資料封包沿最佳路徑傳送，同時實現對不同使用者/任務的隔離（例如在複雜環境中限制某些GPU之間不可互訪）

### 驅動與路由管理 
NVIDIA驅動程式內建了對NVLink與NVSwitch的支援。驅動在啟動時會枚舉系統中的NVLink連接情況，將直連的GPU標記為P2P可直訪（P2P Accessible）。應用層可以透過CUDA API查詢哪些GPU對之間有NVLink相連，從而決定資料放置和傳輸策略（例如MPI或NCCL可利用此資訊構造拓撲感知的通信計畫）