CUDA 平台 (The CUDA Platform)
CUDA 平台由眾多軟硬體與技術組成,用以在 heterogeneous systems(異質系統)上進行運算。本筆記聚焦平台核心概念:GPU 能力標記(Compute Capability)、軟體堆疊(Driver / Toolkit / runtime)、虛擬 ISA(PTX)、二進位封裝(cubin / fatbin),以及相容性與 JIT 編譯機制。這些概念與程式語言無關,適用於所有使用 CUDA 平台的軟體。
重點總覽
| 項目 | 重點 |
|---|---|
| Compute Capability (CC) | 每個 NVIDIA GPU 都有的 X.Y 版本號,標示支援功能與硬體參數;直接對應 SM 版本(CC 12.0 → sm_120),用於標記 binary |
| NVIDIA Driver | GPU 的「作業系統」;所有 GPU 用途(含顯示、Vulkan、Direct3D)都需要;CUDA 平台的基礎;版本如 r580 |
| CUDA Toolkit | 與 driver 分離的獨立產品;含 libraries、headers、tools;CUDA runtime 是其中一個特殊 library,提供 API 與語言擴充 |
| Runtime API vs Driver API | runtime API 建構於較低階的 driver API 之上;本指南聚焦 runtime API;可單用 driver API 或兩者互通 |
| PTX | Parallel Thread Execution 虛擬 ISA;GPU 的高階組合語言;對實體 ISA 的抽象層;版本對應 CC(如 compute_80) |
| cubin | 高階語言 → PTX → 實體 GPU 二進位;對應特定 SM 版本(如 sm_120) |
| fatbin | 容器;可容納多個 target 的 cubin 與 PTX;執行時挑選最適 binary |
| Binary Compatibility | 同 major 內 minor >= 目標可載入;跨 major 不相容 |
| PTX Compatibility | 儲存的 PTX 可 JIT 到相同或更高 CC,達成 forward compatibility |
| JIT Compilation | 執行期由 driver 把 PTX 編成 binary;自動快取於 compute cache;NVRTC 可在執行期把 CUDA C++ 編成 PTX |
Compute Capability 與 SM 版本
每個 NVIDIA GPU 都有一個 Compute Capability (CC) 編號,用以標示該 GPU 支援哪些功能、並指定部分硬體參數。CC 採 major.minor 格式 X.Y,CC 直接對應 SM (Streaming Multiprocessor) 版本。
- 格式
X.Y:例如 CC 12.0 → major12、minor0。 - CC 直接對應 SM 版本:CC 12.0 的 SM 版本即為
sm_120。 - SM 版本用來標記 binary(即 binary 的編譯目標)。
- CC 同時決定該 GPU 支援的功能集與硬體參數。
看到 sm_86、sm_120 這類寫法,等同於「為 CC 8.6 / 12.0 建置」。這是開發者向 nvcc 指定建置 target 時所用的簡寫。
NVIDIA Driver 與 CUDA Toolkit
NVIDIA Driver 可視為「GPU 的作業系統」,是必須安裝在 host OS 上的軟體元件,所有 GPU 用途都需要它,且是整個 CUDA 平台的基礎。CUDA Toolkit 則是與 driver 分離的另一個產品。
- NVIDIA Driver
- 所有 GPU 用途都需要,包含 display 與 graphical 功能。
- 除 CUDA 外,也提供其他使用 GPU 的方式,如 Vulkan、Direct3D。
- 版本號形如
r580。
- CUDA Toolkit
- 一組 libraries、headers、tools,用於撰寫、建置、分析 GPU 運算軟體。
- 與 NVIDIA Driver 是分開的獨立軟體產品。
- CUDA runtime
- Toolkit 提供的 library 中的一個特殊案例。
- 同時提供 API 與語言擴充 (language extensions),處理常見任務:配置記憶體、在 GPU 之間或 GPU 與 CPU 之間複製資料、啟動 kernel。
- 其 API 部分稱為 CUDA runtime API。
host OS
└── NVIDIA Driver (r580) ← GPU 的作業系統,所有 GPU 用途的基礎
├── CUDA driver API (低階)
├── Vulkan
└── Direct3D
CUDA Toolkit (獨立產品)
└── libraries / headers / tools
└── CUDA runtime ← 特殊 library:API + 語言擴充
└── CUDA runtime API (建構於 driver API 之上)
Driver 與 Toolkit 是兩個分開的產品,各自有版本號。Driver 版本(如 r580)與 CUDA Toolkit 版本不同;不同 GPU、Driver、Toolkit 間的相容性詳見 CUDA Compatibility 文件。
Runtime API vs Driver API
CUDA runtime API 是建構於較低階的 CUDA driver API 之上,而 driver API 由 NVIDIA Driver 直接對外提供。本指南聚焦 runtime API。
| 項目 | CUDA Runtime API | CUDA Driver API |
|---|---|---|
| 層級 | 較高階 | 較低階 |
| 實作關係 | 建構於 driver API 之上 | 由 NVIDIA Driver 直接暴露 |
| 本指南重點 | 是(聚焦對象) | 否 |
| 功能涵蓋 | 常見任務 | 同樣功能可全用 driver API 達成;部分功能僅 driver API 提供 |
- 兩者可互通 (interoperably):應用程式可單用其一,或兩者並用。
- 部分功能僅 driver API 提供。
一般應用開發優先選用 runtime API(較簡潔)。只有在需要 driver API 獨有功能、或要對 context / module 載入做細緻控制時,才需要動用 driver API。
PTX(Parallel Thread Execution)
PTX 是 CUDA 平台中一層「基礎但有時不可見」的 virtual ISA(虛擬指令集架構),是 NVIDIA GPU 的高階組合語言,提供對實體 GPU 硬體 physical ISA 的抽象層。
- 應用可直接以 PTX 撰寫,但通常會增加不必要的複雜度與開發難度。
- DSL(domain-specific languages)與高階語言編譯器可產生 PTX 作為中介表示 (IR, intermediate representation),再交由 NVIDIA 的 offline 或 JIT 工具產生可執行 GPU binary。
- 此機制讓 CUDA 平台不限於 NVCC 等 NVIDIA 工具支援的語言來程式設計。
- PTX 規格版本化,與 SM 版本一樣對應到 CC;支援 CC 8.0 全部功能的 PTX 稱為
compute_80。
注意命名差異:compute_XY 指 PTX(虛擬 ISA、對應 CC);sm_XY 指 cubin(實體 binary、對應 SM 版本)。
Cubins 與 Fatbins
CUDA 應用與函式庫通常以 C++ 等高階語言撰寫,編譯流程為:高階語言 → PTX → 實體 GPU binary(cubin)。使用 GPU 運算的執行檔同時含 CPU 與 GPU 程式碼,GPU 程式碼存放於 fatbin 容器中。
- cubin
- 針對特定 SM 版本的特定 binary 格式,如
sm_120。 - 即「為某個 CC 編譯的實體 GPU 二進位」。
- 針對特定 SM 版本的特定 binary 格式,如
- fatbin
- 一個容器 (container)。
- 可容納多個不同 target(不同 SM 版本)的 cubin。
- 也可容納一個或多個 PTX 版本的 GPU 程式碼。
- 應用執行時,GPU 程式碼被載入特定 GPU,並從 fatbin 中挑選最適合該 GPU 的 binary 使用。
編譯流程:
C++ (高階語言)
│ nvcc 前端
▼
PTX (compute_80, 虛擬 ISA / IR)
│ ptxas / JIT
▼
cubin (sm_120, 實體 GPU 二進位)
執行檔 / 函式庫 binary 佈局:
┌─────────────────────────────────────┐
│ CPU binary code │
├─────────────────────────────────────┤
│ fatbin (GPU code 容器) │
│ ├── cubin sm_86 │
│ ├── cubin sm_90 │
│ ├── cubin sm_120 │
│ └── PTX compute_80 → 可 JIT │
└─────────────────────────────────────┘
執行時:依 GPU 挑選最適 binary
Binary Compatibility
NVIDIA GPU 在特定情況下保證 binary compatibility。規則建立在 CC 的 major / minor 上。
- 同一 major 版本內:minor CC 大於或等於目標 cubin 版本的 GPU,可載入並執行該 cubin。
- 跨 major 版本不相容。
| cubin 編譯目標 | 可載入執行 | 不可載入 | 原因 |
|---|---|---|---|
CC 8.6 (sm_86) |
CC 8.6、CC 8.9 | CC 8.0 | 8.0 的 minor 0 < 6 |
CC 8.6 (sm_86) |
— | CC 9.0 | 跨 major(8 → 9)不相容 |
Binary compatibility 僅對 NVIDIA 工具(如 nvcc)產生的 binary 保證。手動編輯或自行生成 GPU binary不受支援;只要 binary 被以任何方式修改,相容性承諾即失效。
PTX Compatibility
GPU 程式碼可以 binary(cubin)或 PTX 形式儲存於執行檔中。儲存的 PTX 提供forward compatibility(向前相容,對未來 GPU)。
- 儲存的 PTX 可在執行期 JIT 編譯到等於或更高 CC 的目標。
- 例:含
compute_80的 PTX,可在執行期 JIT 到更新的 SM 版本(如sm_120)。 - 好處:無需重建應用或函式庫即可在未來 GPU 上執行。
PTX 只能 JIT 到相同或更高的 CC,不能向下降到更低 CC。因此若只內嵌 compute_80 的 PTX,便無法在 CC 7.x 等更舊裝置上執行。
Just-in-Time Compilation(JIT)
應用在執行期載入的 PTX,由 device driver 編成 binary,稱為 just-in-time (JIT) compilation。
- 代價:增加應用載入時間。
- 好處:
- 可受惠於每個新 device driver 帶來的編譯器改進。
- 可在應用編譯當時尚不存在的裝置上執行。
- 快取機制:driver JIT 後會自動把產生的 binary 快取於 compute cache,避免重複編譯;當 device driver 升級時自動失效,使應用能享有新 JIT 編譯器的改進。
- NVRTC:作為 nvcc 的替代,NVRTC 是 CUDA C++ 的執行期編譯函式庫,可在執行期把 CUDA C++ 編成 PTX。
[應用啟動] → 載入 fatbin 中的 PTX
│
▼
device driver 進行 JIT 編譯 ──→ compute cache (快取 binary)
│ │
▼ driver 升級時失效
產生實體 binary → 在 GPU 上執行
NVRTC:執行期 CUDA C++ ──→ PTX
JIT 的觸發時機自早期 CUDA 起已放寬,可更彈性地控制哪些 kernel、何時要 JIT(見 Lazy Loading 與相關 CUDA 環境變數)。
考試/測驗重點
| 情境/關鍵字 | 答案 |
|---|---|
| CC 格式 | X.Y(major.minor),如 CC 12.0 |
| CC 12.0 對應的 SM 版本 | sm_120(CC 直接對應 SM 版本) |
compute_80 指什麼 |
PTX 版本(虛擬 ISA,對應 CC 8.0) |
sm_86 指什麼 |
cubin(實體 binary,對應 CC 8.6) |
| 「GPU 的作業系統」 | NVIDIA Driver(版本如 r580) |
| Driver 與 Toolkit 關係 | 兩個分開的產品 |
| CUDA runtime 是什麼 | Toolkit 提供的特殊 library,含 API + 語言擴充 |
| runtime API 建構於誰之上 | 較低階的 driver API |
| 哪個 API 有獨有功能 | driver API(部分功能僅它提供) |
| cubin sm_86 可在哪些 GPU 跑 | CC 8.6、8.9(同 major、minor >= 目標) |
| cubin sm_86 不可在哪 | CC 8.0(minor 較低)、CC 9.0(跨 major) |
| 跨 major CC | 不相容 |
| PTX 可 JIT 到的目標 | 相同或更高 CC(forward compatibility) |
| 誰執行 JIT | device driver(執行期把 PTX → binary) |
| JIT 快取叫什麼 | compute cache;driver 升級時失效 |
| JIT 缺點 | 增加應用載入時間 |
| 執行期把 CUDA C++ 編成 PTX 的工具 | NVRTC |
| nvcc 全名 | NVIDIA CUDA Compiler(offline 編譯) |
| binary compatibility 對誰保證 | 僅 NVIDIA 工具(如 nvcc)產生、未經修改的 binary |