windows下用nvml读gpu利用率需安装驱动并手动获取nvidia-ml.h和nvidia-ml.lib,链接并加载nvidia-ml.dll;util.gpu为0–100整数百分比,但仅为瞬时采样值,且多gpu需避免硬编码索引,务必检查初始化返回值并调用nvmlshutdown。

Windows下用NVML读GPU利用率,得先装驱动和头文件
NVIDIA官方只提供动态库nvidia-ml.dll,不自带头文件。你直接#include nvidia-ml.h和libnvidia-ml.so(Linux)或nvidia-ml.lib(Windows)拷出来。
常见错误现象:LNK2019: unresolved external symbol nvmlInit_v2,本质是没链接nvidia-ml.lib,或者运行时找不到nvidia-ml.dll(它通常在C:\Windows\System32,但旧驱动可能没放进去)。
- 确保显卡驱动版本 ≥ 450.80.02(NVML v11起才稳定支持利用率查询)
- Windows上用
LoadLibrary(L"nvidia-ml.dll")手动加载比静态链接更容错,避免启动失败 - 初始化后务必检查
nvmlInit_v2()返回值,不是NVML_SUCCESS就别往下走
nvmlDeviceGetUtilizationRates返回的数值不是百分比?
它返回的是nvmlUtilization_t结构体,其中gpu字段是0–100的整数,单位就是%——但注意:这是瞬时采样值,不是平均值,且采样间隔由驱动控制(通常约1秒),不能靠反复调用来“平滑”。
容易踩的坑:
立即学习“C++免费学习笔记(深入)”;
- 把
util->memory误当GPU使用率(它是显存带宽利用率,和计算单元负载无关) - 在多GPU机器上调
nvmlDeviceGetHandleByIndex(0)硬编码索引,结果读到的是集成显卡或被禁用的卡 - 忘记调用
nvmlShutdown(),导致后续进程初始化失败(NVML不允许多次init)
示例关键片段:
nvmlReturn_t ret = nvmlDeviceGetUtilizationRates(device, &util);
if (ret == NVML_SUCCESS) {
printf("GPU utilization: %u%%\n", util.gpu); // 注意:util.gpu是uint32_t,直接%d可能出错
}ADL SDK基本没法可靠读GPU利用率
AMD的ADL(AMD Display Library)早已停止维护,新版Radeon驱动(Adrenalin 22.5.1+)默认不安装ADL组件。即使你找到ADLManager_Init,调用ADL_Overdrive5_CurrentActivity_Get也大概率返回ADL_ERR。
使用场景限制极死:
- 仅支持GCN架构(RX 400/500系列及更早),RDNA/RDNA2(RX 6000)和RDNA3(RX 7000)完全不支持
- 必须以管理员权限运行,否则
ADL_Overdrive_Caps都拿不到 - Windows 11 22H2+系统上,ADL初始化常卡在
ADL_Adapter_Active_Get,无错误也无返回
参数差异上,ADL返回的是ADLPMActivity结构体,其中iGPUCoreClock和iGPUTemperature还能用,但iUsage字段在新卡上恒为-1。
跨平台方案别硬刚SDK,优先查/proc或WMI
Linux上最稳的方式其实是读/proc/driver/nvidia/gpus/0000:01:00.0/information和/proc/driver/nvidia/statistics(需root),或者用nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits管道解析——虽然慢一点,但不依赖SDK版本,也不怕NVML初始化失败。
Windows上可绕过NVML,改用WMI查询:Win32_PerfFormattedData_Counters_GPUInformation类(Win10 2004+),但要注意:
- 该WMI类只在NVIDIA驱动启用“GPU Performance Counters”时才生效(注册表键
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nvlddmkm\Parameters\EnablePerfCounter设为1) - 返回值是
GPUUtilization属性,类型为uint32,但单位是“千分比”(即567 = 56.7%),不是NVML那种整数百分比
性能影响方面:NVML调用本身开销很小(微秒级),但频繁调用(如每10ms一次)会触发驱动内部锁竞争,反而拖慢GPU任务;WMI或nvidia-smi则每次都要启新进程,100ms内调太密会导致延迟堆积。
真实复杂点在于:GPU利用率本身没有单一权威定义。NVML的gpu字段是SM(流式多处理器)活跃周期占比,而游戏引擎或CUDA profiler看到的“占用率”可能是指令吞吐、寄存器压力或内存带宽饱和度——它们数值经常对不上。别把它当CPU usage那样理解。










