精準掌握 GPU 硬體屬性是編寫可移植、高效能 CUDA 應用的前提。本文系統介紹 Runtime API 查詢、命令列工具 nvidia-smi 監控、多 GPU 自動選擇策略、環境變數隔離裝置等實戰技巧。
cudaGetDevicePropertiescudaDeviceProp prop; CHECK(cudaGetDeviceProperties(&prop, dev)); // 關鍵屬性 prop.name; // 裝置名稱 prop.major, prop.minor; // Compute Capability prop.totalGlobalMem; // 顯存大小 (bytes) prop.multiProcessorCount; // SM 數量 prop.maxThreadsPerBlock; // 1024 (CC 2.0+) prop.maxThreadsPerMultiProcessor; // 2048 (CC 3.5+) prop.warpSize; // 32 prop.regsPerBlock; // 65536 (CC 3.0+) prop.sharedMemPerBlock; // 48KB (可配置) prop.clockRate; // GPU 核心頻率 (kHz) prop.memoryClockRate; // 記憶體頻率 (kHz) prop.memoryBusWidth; // 384-bit 等
Device 0: "Tesla M2070" CUDA Capability: 2.0 Global Memory: 5.25 GB GPU Clock: 1147 MHz Memory Clock: 1566 MHz Memory Bus: 384-bit L2 Cache: 768 KB Max Threads/Block: 1024 Max Threads/SM: 1536 Warp Size: 32 Registers/Block: 32768 Shared Mem/Block: 48 KB Grid Dim: 65535 x 65535 x 65535
int selectBestDevice() {
int count; CHECK(cudaGetDeviceCount(&count));
if (count == 0) return -1;
int best = 0, maxSM = 0;
for (int i = 0; i < count; ++i) {
cudaDeviceProp p; CHECK(cudaGetDeviceProperties(&p, i));
if (p.multiProcessorCount > maxSM) {
maxSM = p.multiProcessorCount;
best = i;
}
}
CHECK(cudaSetDevice(best));
return best;
}
策略:SM 數量最多者並行能力最強。亦可綜合考量顯存、頻率、架構代數。
nvidia-smi -L # 列舉所有 GPU nvidia-smi -q -i 0 # GPU 0 完整屬性 nvidia-smi -q -i 0 -d MEMORY # 僅顯示記憶體用量 nvidia-smi -q -i 0 -d UTILIZATION # 計算/記憶體利用率 nvidia-smi -q -i 0 -d TEMPERATURE,POWER # 溫度/功耗 nvidia-smi dmon -i 0 -s pucm -d 1 # 即時監控 (每秒)
FB Memory Usage:Total/Used/Free 顯存。Utilization:Gpu/Compute/Memory/Encoder/Decoder 利用率。Clocks:Graphics/SM/Memory/Video 當前頻率。Processes:佔用 GPU 的進程 PID/類型/記憶體。# 僅讓應用看見 GPU 2 CUDA_VISIBLE_DEVICES=2 ./myApp # 讓應用看見 GPU 2,3,應用內 device ID 為 0,1 CUDA_VISIBLE_DEVICES=2,3 ./myApp # 完全禁用 GPU(純 CPU 跑測試) CUDA_VISIBLE_DEVICES="" ./myApp
原理:Runtime 初始化時解析此變數,建立邏輯→物理 ID 映射。容器化部署 (Docker --gpus) 同理。
selectBestDevice() 或讀取環境變數 CUDA_VISIBLE_DEVICES。CUDA_MPS_PIPE_DIRECTORY 隔離上下文。nvidia-smi 定時巡檢,異常告警(溫度>85℃、顯存殘留、ECC 錯誤)。「知己知彼」:Runtime API 提供程式化查詢,nvidia-smi 提供運維級監控,環境變數提供部署級隔離。三者結合,讓 CUDA 應用從開發、調試到生產部署全生命週期都能精準適配硬體資源。