不可行;wmi的win32_videocontroller仅提供静态总显存(adapterram),无法获取实时占用值,真正反映当前占用需用dxgi的queryvideomemoryinfo()获取currentusage与budget并计算比率。

Windows下用WMI查询GPU显存占用是否可行
直接调用WMI(Win32_VideoController)只能拿到AdapterRAM(显卡总显存),不是当前占用值。它不提供实时使用率,查到的永远是静态硬件参数,比如1073741824(1GB),和任务管理器里“GPU内存”那一栏完全对不上。
真正能反映“当前占用”的,是WMI里的Win32_PerfFormattedData_Counters_GPUInformation(Windows 10 1803+)或更底层的Win32_PerfRawData_Counters_GPUInformation,但这类类名在不同系统版本中不稳定,且需要启用性能计数器服务(sysmon或PerfOS相关服务),很多机器默认没开,一查就报0x80041010(类不存在)错误。
推荐方案:用DXGI枚举适配器 + GetDesc1() + QueryVideoMemoryInfo()
这是目前最稳定、无需额外服务、兼容Win10/Win11的方法,依赖DirectX 12运行时(d3d12.dll)和dxgi.dll,只要系统装了显卡驱动基本都支持。
-
IDXGIFactory4创建后枚举IDXGIAdapter3(不是IDXGIAdapter1,否则没有QueryVideoMemoryInfo) - 调用
QueryVideoMemoryInfo(0, DXGI_MEMORY_SEGMENT_GROUP_LOCAL, &info),其中0表示默认节点(独显一般就一个),DXGI_MEMORY_SEGMENT_GROUP_LOCAL对应显存(非共享内存) - 返回结构体
DXGI_QUERY_VIDEO_MEMORY_INFO里CurrentUsage字段即当前已用字节数,Budget是系统允许上限(受后台进程、桌面窗口管理器等影响,常小于显卡标称容量)
注意:必须链接dxgi.lib,头文件包含<dxgi1_4.h></dxgi1_4.h>,编译器需定义WINVER=0x0A00(Win10)及以上。若QueryVideoMemoryInfo返回E_NOINTERFACE,说明驱动太旧或不是WDDM驱动(如某些虚拟机、核显老驱动)。
Linux下无法用统一API,得看GPU厂商
Linux没有跨厂商的显存API。NVIDIA显卡必须用nvidia-smi命令行工具解析输出,或者调用libnvidia-ml.so里的nvmlDeviceGetMemoryInfo();AMD GPU要走rocm-smi或libdrm+amdgpu内核接口;Intel核显则依赖intel_gpu_top或libdrm_i915 ioctl调用。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
这意味着C++程序若想跨平台获取显存占用,必须:
- 运行时检测GPU厂商(读
/proc/driver/nvidia/gpus/0/information或/sys/class/drm/card0/device/vendor) - 动态加载对应厂商的库(
dlopen("libnvidia-ml.so.1")等) - 避免硬编码路径,因为
libnvidia-ml.so可能在/usr/lib64或/usr/lib/nvidia下
常见错误:误把GPU温度/利用率当显存占用
很多人用nvmlDeviceGetUtilizationRates()(返回gpu_util和memory_util百分比)以为这就是显存用量,其实memory_util是带宽利用率(每秒传输量占比),不是容量占用率。同理,Windows性能计数器里的GPU Engine\*Video_*Engine_Frequency也是频率/负载指标,和CurrentUsage / Budget完全无关。
真正要算占用率,得自己做除法:(double)info.CurrentUsage / info.Budget * 100.0,而且要注意Budget会动态变化——比如打开一个Chrome窗口,Budget可能从3.8GB掉到3.2GB,这是正常行为,不是API bug。
别忘了加异常处理:QueryVideoMemoryInfo可能返回DXGI_ERROR_NOT_CURRENTLY_AVAILABLE(例如锁屏时),这时候应该跳过或缓存上次有效值,而不是崩溃或报错退出。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










