nvml是c++程序中实时读取gpu显存最稳定的选择,需正确初始化、处理权限与驱动依赖,避免使用nvidia-smi解析或cuda runtime api等不适用方案。

用 nvidia-smi 快速查显存用量,但不是编程接口
想在 C++ 程序里实时读 GPU 显存,别直接 parse nvidia-smi 输出——它启动慢、格式不稳定、没权限时会失败,只适合调试或脚本临时看一眼。真要集成进程序,得走正式 API。
用 NVML(libnvidia-ml.so)读显存,最稳
NVML 是 NVIDIA 官方提供的轻量级管理库,不依赖 CUDA 上下文,进程无需 GPU 计算能力也能调,兼容性好(从 Tesla 到 RTX 都行),且线程安全。
常见错误现象:nvmlInit() 返回 NVML_ERROR_LIBRARY_NOT_FOUND —— 没装驱动或没把 libnvidia-ml.so 所在路径加进 LD_LIBRARY_PATH;返回 NVML_ERROR_NO_PERMISSION —— 普通用户默认不能访问设备状态,需加 sudo 或配 udev 规则。
- 初始化后必须调
nvmlDeviceGetHandleByIndex(0, &device)获取设备句柄,索引从 0 开始,不是 PCI ID - 显存总量和已用值用
nvmlDeviceGetMemoryInfo(device, &info)拿,info.used和info.total单位是字节 - 别漏掉
nvmlShutdown(),否则多次运行可能卡住设备句柄
CUDA Runtime API 能读,但有隐含前提
cudaMemGetInfo() 看起来最顺手,但它只返回当前 CUDA 上下文绑定的 GPU 的显存——如果没调过 cudaSetDevice() 或没触发过任何 kernel 启动,上下文可能根本没创建,这时调用会返回 cudaErrorInvalidValue。
立即学习“C++免费学习笔记(深入)”;
使用场景:你本来就在写 CUDA 程序,顺便查一下自己用的那块卡,没问题;纯 CPU 程序想查 GPU,别选它。
- 必须先确保至少一个 device 被
cudaSetDevice()指定过,否则cudaMemGetInfo()不可靠 - 返回的
free和total是当前 context 视角下的值,受 CUDA 内存池(如cudaMallocAsync)影响,不一定等于 NVML 的物理值 - Windows 下若链接
cudart静态库,要注意运行时 DLL 版本匹配,否则cudaGetLastError()可能报unknown error
NVAPI 在 Windows 上可用,但限制多
NVAPI 主要面向游戏/显示控制,读显存只是副业。它需要显卡驱动带 NVAPI 支持(新版基本都带),但默认禁用——得手动调 NvAPI_Initialize(),而且只支持单 GPU 查询(多卡时行为未定义)。
容易踩的坑:NvAPI_GPU_GetMemoryInfo() 返回的 dedicatedVideoMemory 是硬编码的显卡标称值,不是实时用量;真正可用的是 availableDedicatedVideoMemory,但这个字段在某些驱动版本里恒为 0。
- 必须用
NvAPI_Initialize()初始化,失败就别往下走了,不能靠LoadLibrary("nvapi.dll")就完事 - 调用前得用
NvAPI_SYS_GetDisplayDriverVersion()确认驱动版本 ≥ 381.65,老驱动不支持内存查询 - 返回结构体里的单位是 KB,不是字节,别直接当
size_t用
NVML_ERROR_DRIVER_NOT_LOADED。










