不可行,wmi的win32_videocontroller仅返回adapterram(总显存),无法获取实时显存占用;真实可用数据需依赖厂商专用接口,如nvidia的nvml、amd的adl或rocm smi。

Windows下用WMI查询GPU显存占用是否可行?
直接用WMI查显存占用(比如 Win32_VideoController)基本没用——它只暴露 AdapterRAM(显卡总显存),不提供实时使用量。你看到的“显存已用 2.1 GB”这种数据,WMI根本不返回。
真正能拿到实时显存使用的是GPU厂商提供的专用接口,不是系统通用API。
- NVIDIA GPU 必须用
Nvml(NVIDIA Management Library),对应头文件nvidia-ml.h - AMD GPU 推荐用
ADL(AMD Display Libraries)或更新的ROCm SMI(Linux为主,Windows支持有限) - Intel核显目前无公开稳定接口,
Intel GPU Tools仅限调试用途,不建议生产环境调用
用NVML获取NVIDIA GPU显存占用的最小可行代码
前提是已安装 NVIDIA 驱动(>=410.48),且链接 nvidia-ml.dll(Windows)或 libnvidia-ml.so(Linux)。头文件需从 NVIDIA官方文档 下载,不能靠CUDA Toolkit自带。
关键步骤:初始化 → 获取设备句柄 → 查询显存信息 → 清理
#include <nvidia-ml.h>
#include <iostream>
int main() {
nvmlReturn_t result = nvmlInit();
if (result != NVML_SUCCESS) {
std::cerr
<p>注意:<code>nvmlDeviceGetMemoryInfo</code> 返回的是GPU显存(VRAM)用量,不是系统内存或共享内存;<code>memory.used</code> 是当前被GPU进程(如CUDA kernel、OpenGL纹理、DirectX缓冲区)实际占用的字节数。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<h3>为什么程序运行时拿不到显存数据?常见失败原因</h3>
<p>最常遇到的不是代码写错,而是环境或权限问题:</p>
<ul>
<li>未以管理员权限运行 —— Windows上某些NVML调用(尤其是多GPU或带ECC的卡)会返回 <code>NVML_ERROR_NO_PERMISSION</code>
</li>
<li>驱动版本太旧 —— <code>nvmlDeviceGetMemoryInfo</code> 在早期驱动(如390系列)中可能返回0或错误码 <code>NVML_ERROR_NOT_SUPPORTED</code>
</li>
<li>链接时漏掉 <code>nvidia-ml.lib</code>(Windows)或 <code>-lnvidia-ml</code>(Linux),导致 <code>nvmlInit</code> 解析失败,程序崩溃而非报错</li>
<li>多GPU环境下误用 <code>nvmlDeviceGetHandleByIndex</code> 而没检查 <code>deviceCount</code>,索引越界触发未定义行为</li>
</ul>
<h3>Linux下是否能绕过NVML用sysfs读取?</h3>
<p>部分NVIDIA驱动在 <code>/sys/class/nvme/</code> 或 <code>/proc/driver/nvidia/gpus/</code> 下暴露节点,但显存用量不在其中。唯一可用的是 <code>/proc/driver/nvidia/gpus/xxx/information</code>(只含型号和总显存),<code>used memory</code> 不对外暴露。</p>
<p>有人尝试用 <code>nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits</code> 解析输出,这确实能用,但本质是启动子进程+文本解析,开销大、不稳定,且依赖 <code>nvidia-smi</code> 可执行文件存在和PATH配置正确 —— 不适合嵌入式或服务长期运行场景。</p>
<p>真正可靠的路径只有一条:用NVML的C API,而不是试图“绕过”。</p>
<p>跨平台统一获取不存在;不同厂商接口不兼容,连函数命名风格都不同(AMD ADL用 <code>ADL2_GraphicMemoryInfo_Get</code>,NVIDIA用 <code>nvmlDeviceGetMemoryInfo</code>),硬封装一层抽象库容易掩盖底层差异,反而增加维护成本。</p></iostream></nvidia-ml.h>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










