首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CUDA Device 管理全攻略:Runtime API 查詢、nvidia-smi 監控、多 GPU 選擇與環境變數控制

     編輯:關於C語言

前言

精準掌握 GPU 硬體屬性是編寫可移植、高效能 CUDA 應用的前提。本文系統介紹 Runtime API 查詢、命令列工具 nvidia-smi 監控、多 GPU 自動選擇策略、環境變數隔離裝置等實戰技巧。

Runtime API:cudaGetDeviceProperties

cudaDeviceProp 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 等

完整查詢範例輸出 (Tesla M2070, CC 2.0)

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

多 GPU 自動選擇最佳計算裝置

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:生產級監控利器

常用指令

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) 同理。

裝置初始化最佳實踐

  1. 啟動時調用 selectBestDevice() 或讀取環境變數 CUDA_VISIBLE_DEVICES。
  2. 查詢屬性決定 Kernel 配置(Block 大小、共享記憶體用量、暫存器上限)。
  3. 多進程服務 (MPS) 場景下,配合 CUDA_MPS_PIPE_DIRECTORY 隔離上下文。
  4. 生產環境部署 nvidia-smi 定時巡檢,異常告警(溫度>85℃、顯存殘留、ECC 錯誤)。

總結

「知己知彼」:Runtime API 提供程式化查詢,nvidia-smi 提供運維級監控,環境變數提供部署級隔離。三者結合,讓 CUDA 應用從開發、調試到生產部署全生命週期都能精準適配硬體資源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved