# 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可利用此資訊構造拓撲感知的通信計畫)