windows下用nvml获取nvidia gpu显存占用最可靠,需驱动≥410.48、管理员权限、调用nvmlinit_v2→gethandle→getmemoryinfo→shutdown,used单位为字节;linux可读/sys/class/drm/card*/device/mem_info_used_bytes或fallback至nvidia-smi命令解析。

Windows下用NVML获取NVIDIA GPU显存占用
直接调用NVIDIA官方的NVML(NVIDIA Management Library)是最可靠的方式,前提是你的GPU是NVIDIA且驱动已安装完整。它不依赖CUDA运行时,也不要求程序本身用CUDA写,纯C接口,C++可直接链接使用。
常见错误现象:NVML_ERROR_LIBRARY_NOT_FOUND 或 NVML_ERROR_UNINITIALIZED,基本都是没把 nvidia-ml-py.dll(Windows)或 libnvidia-ml.so(Linux)放到PATH或运行目录,或者驱动版本太旧(需≥410.48)。
- 下载CUDA Toolkit或单独安装NVIDIA驱动(含NVML),头文件在
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.X\include\nvml.h - 链接时加
-lnvidia-ml(Linux)或nvidia-ml.lib(Windows,静态导入库在CUDA安装路径下) - 必须先调用
nvmlInit_v2(),结束前调用nvmlShutdown(),否则后续所有API返回失败 - 用
nvmlDeviceGetHandleByIndex(0, &device)获取第0块卡,再用nvmlDeviceGetMemoryInfo(device, &memInfo)读取memInfo.used和memInfo.total
Linux下通过/sys文件系统快速读取(无需SDK)
如果你只是想轻量级监控、不追求毫秒级精度,Linux可以直接读 /sys/devices/nvlink/device/ 下的伪文件,或者更通用的 /proc/driver/nvidia/gpus/*/information 和 /proc/driver/nvidia/gpus/*/hwmon/0/device/power —— 但显存用量实际藏在 /proc/driver/nvidia/gpus/*/information 并不暴露,真正可用的是 /proc/driver/nvidia/gpus/*/fb_mem(部分老驱动)或更稳定的 /sys/class/drm/card*/device/mem_info_*_bytes(仅限较新内核+DRM驱动)。
更通用稳妥的做法是读 /proc/driver/nvidia/gpus/*/information 确认设备存在后,走 /sys/class/drm/card*/device/gpu_busy_percent + mem_info_total_bytes + mem_info_used_bytes(如果存在)。但注意:这些节点不是所有内核版本都启用,尤其 mem_info_used_bytes 在主线内核5.15+才稳定支持。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 检查路径是否存在:
ls /sys/class/drm/card*/device/mem_info_used_bytes - 读取示例:
cat /sys/class/drm/card0/device/mem_info_used_bytes(单位字节) - 若该文件不存在,说明内核未导出或驱动未启用DRM管理,此时必须退回NVML或nvidia-smi
- 权限问题常见:需root或加入
video组,普通用户可能读不到
跨平台 fallback:调用nvidia-smi命令行解析输出
当NVML不可用、又不想硬依赖驱动内核模块时,最简单粗暴但有效的方法是执行 nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits,然后解析stdout。适用于开发机、CI、脚本类场景,但不适合高频轮询(每次启动进程开销大,约20–50ms)。
容易踩的坑:nvidia-smi 默认输出带空格和单位(如 1234 MiB),--format=csv,noheader,nounits 才能拿到纯数字;另外Windows下要确保 nvidia-smi.exe 在PATH中,Linux下通常在 /usr/bin/nvidia-smi。
- 推荐命令:
nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits - 输出样例:
1234,8192(单位MiB) - C++中用
popen()拿输出,注意截断换行符、跳过空行、处理超时(避免卡死) - 不要用
system(),无法捕获输出;也别漏掉错误码检查——nvidia-smi返回非0时大概率是GPU不可用或权限不足
AMD GPU怎么办?ROCm没有等效NVML
目前没有官方、稳定、用户态免root的API能直接读AMD GPU显存用量。ROCm SDK(rocm-smi)功能接近nvidia-smi,但只支持Linux,且需安装完整ROCm栈(不只是驱动)。Windows下几乎无解,只能靠WMI查GPU温度/负载,显存用量无法获取。
rocm-smi --showmeminfo 可输出类似信息,但它底层依赖 /sys/class/kfd/kfd/topology/nodes/*/mem_banks/*/properties,权限要求高,且不同ROCm版本字段名可能变动(比如 used_memory vs mem_used)。
- 确认ROCm安装:运行
rocm-smi --version,失败则无法继续 - 命令建议:
rocm-smi --showmeminfo --csv --no-header(输出格式较稳定) - 注意:ROCm 5.6+ 才支持
--showmeminfo,旧版只能看总显存,不能看已用 - 不建议自己读
/sys节点——AMD的sysfs结构比NVIDIA更不稳定,同一驱动版本在不同内核上节点名可能不同
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










