CUDA 13.3 修掉巢狀分歧編譯錯誤
CUDA Toolkit 13.3 修掉一個從 12.8 就存在的編譯器錯誤。這個 bug 會在巢狀分歧的 GPU kernel 裡弄壞暫存器值,結果可能是算錯,不是當掉。

CUDA Toolkit 13.3 修掉一個從 12.8 就存在的編譯器錯誤,這個 bug 會在巢狀分歧的 GPU kernel 裡弄壞暫存器值。
說真的,這種 bug 很煩。程式不一定當掉,但答案可能錯。對做 GPU 軟體的人來說,這比 crash 更難抓。
NVIDIA 的 CUDA Toolkit 13.3 release notes 直接點出這個修正。它不是那種看起來很炫的版本號更新,但它碰到的是正確性問題。
這次更新還整理了工具鏈版本、驅動需求,還補了 Windows 的 ETW 支援。講白了,13.3 比較像維護版,但裡面有一個你真的該在意的修補。
| 項目 | 數值 |
|---|---|
| 釋出版本 | CUDA Toolkit 13.3 |
| 錯誤首次出現 | CUDA 12.8 |
| CUDA 13.x 最低驅動 | 580 或更新 |
| Windows 驅動綁定 | 從 CUDA 13.1 起移除 |
| Windows 新診斷 | ETW 支援 CUDA driver activity |
這個修正為什麼很重要
訂閱 AI 趨勢週報
每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。
不會寄垃圾信,隨時可取消。
這次修掉的是 compiler 插入的 thread reconvergence。NVIDIA 說,問題只會出現在兩層以上的 nested divergence。還要剛好碰到 compiler 省掉 convergence instructions。

你可能會想,這聽起來很少見。可是在 GPU 世界,這種分支其實很常見。像 ray tracing、稀疏運算、非規則資料處理,還有很多控制流很重的 kernel,都會走到這種路。
最麻煩的是,這類錯誤不一定報錯。它可能只是留下舊的 register 值,或把值弄壞。結果就是算出錯答案,而且很難重現。
- 問題從 CUDA 12.8 就存在。
- 只影響巢狀 thread divergence 的 kernel。
- 可能產生錯誤輸出,不一定會 crash。
- 是否出錯,和 compiler 怎麼處理 convergence 有關。
13.3 還改了哪些地方
CUDA 13.3 也反映了 NVIDIA 近年的工具鏈切分方式。現在很多元件都有自己的版本號,不再是整包一起走。這對維護者來說很實際,但也更容易看花眼。
像 CUDA Toolkit 裡的 NVCC、NVRTC、CUPTI 和 runtime,都有各自版本。這代表你在 pin build、比對 profiling 結果、或排查環境不一致時,得看更細。
官方列出的數字也很明確。CUDA Runtime 是 13.3.29,NVCC 是 13.3.33,CUPTI 是 13.3.35,文件則是 13.3.40。這些版本號看起來瑣碎,但實務上很有用。
- CUDA Runtime:13.3.29
- NVCC:13.3.33
- CUPTI:13.3.35
- CUDA Documentation:13.3.40
另外,CUDA 13.x 的最低驅動需求是 580 或更新。NVIDIA 也重申相容規則,意思是新驅動通常能跑舊工具鏈建出的程式。
“CUDA is a parallel computing platform and programming model developed by NVIDIA for general computing on GPUs.”
NVIDIA CUDA documentation
Windows 驅動政策更麻煩了
CUDA 以前會順手包一份 display driver。對開發環境來說很方便,但官方早就不建議把它當 production 用,尤其是 Tesla GPU 場景。

從 CUDA 13.1 開始,Windows 版更直接。工具包不再綁 driver。你要自己去 NVIDIA driver downloads 下載安裝。Linux 則還能透過避免 driver meta packages 來跳過這一步。
這種改動很容易害到自動化。CI image、工作站腳本、實驗室機器,如果還假設安裝 toolkit 就會帶 driver,13.3 就會讓你踩雷。官方也把人導去 CUDA Compatibility Guide for Drivers 看細節。
- Windows 不再內建 display driver。
- Linux 仍可透過安裝選項避開 driver。
- Production 環境更需要自己管版本。
- 自動化腳本要重新檢查假設。
ETW 支援對 Windows 團隊有用
CUDA 13.3 新增了 Event Tracing for Windows,簡稱 ETW,支援 CUDA driver activity reporting。ETW 是 Windows 內建的追蹤系統,很多系統管理和效能分析都會用。
這個功能聽起來不花俏,但很實用。你可以更容易看 driver 在做什麼,也比較好追 launch latency、卡頓、或系統層級的互動問題。
如果你在企業 Windows 環境做 GPU 軟體,這種低開銷的可觀測性很重要。很多時候,瓶頸不是 kernel 本身,而是整個 stack 的互動。
- ETW 提供低開銷追蹤。
- 更容易看 driver activity。
- 適合 debug 和效能分析。
- 對 Windows 企業環境特別有用。
跟 13.x 其他版本比起來怎樣
跟整個 13.x 系列比,13.3 很像整理版。它沒有那種大張旗鼓的新模型或新 API,但它把工具鏈、驅動規則、診斷能力都再收斂一次。
如果你看 cuBLAS、cuFFT、cuSPARSE 這些庫,就會知道 CUDA 生態一直是大拼盤。工具、庫、runtime、profiling,每個東西都可能單獨變動。
所以版本比較不能只看「13.3 比 13.2 新」。你要看的是,這次有沒有碰到你的 kernel 型態、你的部署流程、還有你的驅動假設。
- CUDA 13.x 需要 580 以上驅動。
- CUDA 13.1 起,Windows 不再綁 driver。
- 13.3 更新了 compiler、runtime、profiling、文件。
- 修正的 bug 起源於 12.8。
如果你的 kernel 分支很多,13.3 值得先測。最好拿同一份工作負載跑 baseline,比對輸出,再看有沒有深層 divergence 的路徑。
我覺得這次最該記住的,不是版本號,而是 compiler 真的會影響 GPU 程式正確性。這種問題平常看不出來,一旦進 production,就很難看。
先把它當成正確性修補
如果你的 GPU 程式有大量分支,13.3 不該只當一般升版。先驗證輸出,再驗證效能,最後才談部署。
我會建議先做三件事。第一,跑舊資料和新資料。第二,盯住 nested divergence 的 kernel。第三,確認 Windows 與 Linux 的 driver 安裝流程都還對。
講白了,這版不是來秀功能的。它是來修一個會讓你算錯的編譯器問題。對做 production 的團隊,這種更新比表面上的大版本更值得看。
你如果已經在用 12.8 或 13.x,現在就該安排一次回歸測試。別等到客戶回報答案怪怪的,才回頭翻 release notes。