前言
CUDA的編譯環境橫跨CPU和GPU,其中包括還包括GPU的特別優化,必須要先了解編譯的架構,再去建置環境才會比較有Sense。
架構
CPU 部分由系統主機編譯器處理:
- 主機端的代碼由系統主機編譯器(如
cl.exe
或gcc
)編譯成目標文件,生成供 CPU 執行的部分。
GPU 部分編譯:
- PTX(中間代碼):
- CUDA 核心代碼(例如
__global__
和__device__
函數)由 PTX 編譯器編譯為 PTX。 - PTX 是與硬件無關的中間代碼,可在多個 GPU 架構上移植。
- CUDA 核心代碼(例如
- SASS(硬件機器碼):
- 如果指定了目標架構(如
sm_80
),PTX 會進一步由 CUBIN 編譯器轉換為 SASS(Streaming Assembly)。 - SASS 是針對特定 GPU 硬件生成的最佳代碼,包含硬件指令、寄存器分配、指令調度等底層優化。
- 如果指定了目標架構(如
通過鏈接器整合為完整的可執行文件:
nvcc
調用系統鏈接器(如ld
或link.exe
),將主機代碼與設備代碼整合,生成最終的可執行文件。- 鏈接器會嵌入 GPU 的 PTX 或 SASS 代碼,確保運行時能夠正確加載並執行
環境建置
CPU編譯環境建置:
下載cl.exe,可參考後方連結([Windows] C/C++編譯環境建置)
GPU編譯環境建置:
- 下載 NVIDIA CUDA 工具包:
- 到 NVIDIA CUDA 官方下載頁面 下載適合你的操作系統版本的 CUDA Toolkit。
- 安裝時選擇 Custom Installation,只保留需要的核心組件(例如:Driver、Toolkit、nvcc 編譯器)。
- 驗證 CUDA 安裝:
- 打開終端或命令提示字元,執行 nvcc –version
- 確認輸出包含 CUDA 版本資訊。
環境檢測
CPU 編譯器(cl.exe)測試:
GPU 編譯器(nvcc)測試:
編譯與執行
代碼
CUDA程式編譯
執行結果
Trouble shooting
[Trouble Shooting] 請以 Unicode 格式儲存檔案以防止資料遺失