最稳定方式是windows下用nvml:需驱动410+、管理员权限、正确调用nvmlinit_v2→gethandle→getmemoryinfo→shutdown,used单位为字节;linux可读sysfs节点;amd windows无可靠方案,dxgi接口兼容性差且非精确。

Windows下用NVML获取NVIDIA GPU显存占用(需驱动支持)
直接调用NVIDIA官方提供的NVML(NVIDIA Management Library)是目前最稳定、最接近驱动级的方式,但它不是操作系统原生接口,而是NVIDIA驱动自带的用户态库。你需要确保已安装对应版本的NVIDIA驱动(通常410+),并链接nvidia-ml.dll(Windows)或libnvidia-ml.so(Linux)。
常见错误现象:nvmlInit_v2返回NVML_ERROR_LIBRARY_NOT_FOUND或NVML_ERROR_DRIVER_NOT_LOADED——说明驱动未正常运行、CUDA工具包未装、或程序以低完整性级别运行(UAC限制)。
- 必须以管理员权限启动进程,否则部分显存指标(如GPU memory used)可能返回0或
NVML_ERROR_NO_PERMISSION -
nvmlDeviceGetMemoryInfo返回的used字段单位是字节,不是MB;别直接除1024两次,建议用info.used / (1024.0 * 1024.0)转MB - 调用前必须按顺序执行:
nvmlInit_v2→nvmlDeviceGetHandleByIndex→nvmlDeviceGetMemoryInfo→nvmlShutdown,漏掉nvmlShutdown会导致后续调用失败
Linux下通过sysfs读取NVIDIA GPU显存(无需链接NVML)
如果你只是想快速查当前显存用量,且确定用的是NVIDIA卡,Linux下可以直接读/proc/driver/nvidia/gpus/0000:01:00.0/information和/proc/driver/nvidia/gpus/0000:01:00.0/memory(路径中的PCI地址需动态获取)。更通用的做法是遍历/sys/class/drm下的card*设备,再匹配device/vendor为0x10de(NVIDIA)。
注意:该方式依赖内核nouveau或nvidia驱动暴露的sysfs节点,nouveau默认不提供显存用量,只有专有驱动(nvidia.ko)启用procfs支持后才可用。若/proc/driver/nvidia不存在,说明驱动未加载或禁用了proc接口(检查nvidia-modprobe是否运行)。
- 读
/sys/class/drm/card0/device/mem_info_total_bytes和mem_info_used_bytes(仅nvidia驱动v470+支持) - 若路径不存在,不要硬编码
card0,应先用opendir("/sys/class/drm")枚举所有card节点,再逐个检查device/vendor - 该方法无须管理员权限,但文件内容更新频率取决于驱动,一般为秒级,不适合高频采样
AMD GPU在Windows上只能靠WMI + ADL(已弃用)或ROCm smi(Linux限定)
AMD没有等效于NVML的跨平台稳定C API。Windows下旧版ADL SDK早已停止维护,ADL_Overdrive5_CurrentActivity_Get在Radeon RX 6000+系列上基本失效;WMI查询Win32_VideoController只能拿到显存总量,拿不到实时占用。
唯一可行路径是:在Linux下使用ROCm生态的rocm-smi命令行工具,再通过popen("rocm-smi --showmemuse")解析输出。但该方式要求系统安装ROCm驱动(非Adrenalin),且仅支持GCN 1.4+架构(Vega及以后),RX 500系列不支持。
-
rocm-smi输出中GPU Memory Usage字段单位是百分比,需自行换算为字节数(查rocm-smi --showmeminfo获取total) - Windows下对AMD GPU做驱动级显存监控,目前无可靠方案;若必须支持,建议降级到轮询
dxgi的IDXGIAdapter3::QueryVideoMemoryInfo(仅DirectX 12 UMA设备或部分集成显卡有效,独显返回DXGI_ERROR_UNSUPPORTED)
跨厂商通用方案:DXGI(Windows)或OpenGL/Vulkan扩展(局限大)
IDXGIAdapter3::QueryVideoMemoryInfo是微软在Win10 RS1引入的接口,理论上支持所有支持WDDM 2.2+的GPU(包括Intel核显、AMD Radeon、NVIDIA GeForce),但实际兼容性极差:多数OEM笔记本驱动未实现该接口,返回E_NOINTERFACE或DXGI_ERROR_NOT_SUPPORTED;NVIDIA桌面卡驱动通常只对独显返回local内存信息,对共享内存(nonlocal)始终为0。
Vulkan可通过vkGetPhysicalDeviceMemoryProperties2 + VK_KHR_get_memory_requirements2拿到内存类型,但无法获取实时用量;OpenGL无标准扩展支持显存用量查询。
- 调用
QueryVideoMemoryInfo前必须确认IDXGIAdapter3接口可用(QueryInterface成功),不能假设IDXGIAdapter可升级 - 返回结构体中
CurrentUsage字段是估算值,非精确硬件计数器,尤其在多应用共用显存时偏差可达10%~30% - 该接口在Windows Server或无桌面组件的系统(如WSL2)中不可用
真正“驱动级”的显存用量,本质上取决于GPU厂商是否在驱动中暴露性能计数器。NVIDIA做得最完整,AMD/Linux次之,Intel和Windows通用接口则基本不可靠。写代码时优先检测NVML,fallback到sysfs,AMD Windows场景建议明确告知用户不支持,而不是返回错误码或零值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











