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) 版本

Tip

看到 sm_86sm_120 這類寫法,等同於「為 CC 8.6 / 12.0 建置」。這是開發者向 nvcc 指定建置 target 時所用的簡寫。

NVIDIA Driver 與 CUDA Toolkit

NVIDIA Driver 可視為「GPU 的作業系統」,是必須安裝在 host OS 上的軟體元件,所有 GPU 用途都需要它,且是整個 CUDA 平台的基礎。CUDA Toolkit 則是與 driver 分離的另一個產品。

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 之上)
Important

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 提供
Tip

一般應用開發優先選用 runtime API(較簡潔)。只有在需要 driver API 獨有功能、或要對 context / module 載入做細緻控制時,才需要動用 driver API。

PTX(Parallel Thread Execution)

PTX 是 CUDA 平台中一層「基礎但有時不可見」的 virtual ISA(虛擬指令集架構),是 NVIDIA GPU 的高階組合語言,提供對實體 GPU 硬體 physical ISA抽象層

Important

注意命名差異:compute_XYPTX(虛擬 ISA、對應 CC);sm_XYcubin(實體 binary、對應 SM 版本)。

Cubins 與 Fatbins

CUDA 應用與函式庫通常以 C++ 等高階語言撰寫,編譯流程為:高階語言 → PTX → 實體 GPU binary(cubin)。使用 GPU 運算的執行檔同時含 CPU 與 GPU 程式碼,GPU 程式碼存放於 fatbin 容器中。

編譯流程:
  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 上。

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)不相容
Warning

Binary compatibility 僅對 NVIDIA 工具(如 nvcc)產生的 binary 保證。手動編輯或自行生成 GPU binary不受支援;只要 binary 被以任何方式修改,相容性承諾即失效

PTX Compatibility

GPU 程式碼可以 binary(cubin)或 PTX 形式儲存於執行檔中。儲存的 PTX 提供forward compatibility(向前相容,對未來 GPU)。

Warning

PTX 只能 JIT 到相同或更高的 CC,不能向下降到更低 CC。因此若只內嵌 compute_80 的 PTX,便無法在 CC 7.x 等更舊裝置上執行。

Just-in-Time Compilation(JIT)

應用在執行期載入的 PTX,由 device driver 編成 binary,稱為 just-in-time (JIT) compilation

[應用啟動] → 載入 fatbin 中的 PTX
                   │
                   ▼
        device driver 進行 JIT 編譯  ──→ compute cache (快取 binary)
                   │                              │
                   ▼                       driver 升級時失效
              產生實體 binary → 在 GPU 上執行

NVRTC:執行期  CUDA C++  ──→  PTX
Tip

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