在C++开发中,读取GPU显存信息是很多图形计算、深度学习相关项目的常见需求,常用的实现路径有CUDA调用和NVAPI调用两种,两种方式各有适用场景,下面分别介绍具体实现方法。

一、通过CUDA读取GPU显存信息
CUDA是NVIDIA推出的并行计算平台,提供了直接查询GPU硬件信息的接口,适合已经在使用CUDA进行并行计算的项目,无需额外引入第三方库。
1. 环境准备
需要提前安装对应显卡型号的NVIDIA驱动,以及CUDA Toolkit开发包,项目中需要链接cuda库,包含cuda_runtime.h头文件。
2. 实现步骤
首先获取当前设备数量,然后遍历每个设备,调用cudaMemGetInfo函数获取可用显存和总显存,具体代码如下:
#include <stdio.h>
#include <cuda_runtime.h>
int main() {
int deviceCount;
// 获取GPU设备数量
cudaGetDeviceCount(&deviceCount);
printf("检测到 %d 个GPU设备n", deviceCount);
for (int i = 0; i < deviceCount; i++) {
cudaSetDevice(i);
cudaDeviceProp deviceProp;
// 获取设备属性
cudaGetDeviceProperties(&deviceProp, i);
printf("设备 %d 名称: %sn", i, deviceProp.name);
size_t freeMem, totalMem;
// 获取显存信息,单位字节
cudaMemGetInfo(&freeMem, &totalMem);
// 转换为MB输出
printf("总显存: %.2f MBn", totalMem / 1024.0 / 1024.0);
printf("可用显存: %.2f MBn", freeMem / 1024.0 / 1024.0);
}
return 0;
}
编译时需要链接cuda库,例如使用g++编译可以添加-lcuda -lcudart参数。
二、通过NVAPI读取GPU显存信息
NVAPI是NVIDIA提供的更底层的硬件控制接口,不仅可以读取显存信息,还能获取温度、风扇转速等更多硬件参数,适合需要更全面硬件信息的场景,不需要依赖CUDA环境。
1. 环境准备
需要从NVIDIA官方获取NVAPI的开发包,包含nvapi.h和对应的静态库文件,项目中引入相关头文件和库即可。
2. 实现步骤
首先初始化NVAPI,然后枚举所有GPU物理手柄,调用对应的接口获取显存信息,具体代码如下:
#include <stdio.h>
#include <windows.h>
#include "nvapi.h"
int main() {
// 初始化NVAPI
if (NvAPI_Initialize() != NVAPI_OK) {
printf("NVAPI初始化失败n");
return -1;
}
NvU32 gpuCount;
NvPhysicalGpuHandle gpuHandles[64];
// 获取所有物理GPU手柄
if (NvAPI_EnumPhysicalGPUs(gpuHandles, &gpuCount) != NVAPI_OK) {
printf("枚举GPU失败n");
NvAPI_Unload();
return -1;
}
for (NvU32 i = 0; i < gpuCount; i++) {
NvAPI_ShortString gpuName;
// 获取GPU名称
if (NvAPI_GPU_GetFullName(gpuHandles[i], gpuName) == NVAPI_OK) {
printf("设备 %d 名称: %sn", i, gpuName);
}
NV_GPU_MEMORY_INFO memInfo = {0};
memInfo.version = NV_GPU_MEMORY_INFO_VER;
// 获取显存信息
if (NvAPI_GPU_GetMemoryInfo(gpuHandles[i], &memInfo) == NVAPI_OK) {
// 显存单位默认是KB
printf("总显存: %.2f MBn", memInfo.dedicatedVideoMemory / 1024.0);
printf("可用显存: %.2f MBn", memInfo.availableDedicatedVideoMemory / 1024.0);
printf("已使用显存: %.2f MBn", memInfo.curAvailableDedicatedVideoMemory / 1024.0);
}
}
// 卸载NVAPI
NvAPI_Unload();
return 0;
}
该代码适用于Windows平台,编译时需要链接NVAPI对应的静态库。
三、两种方式对比
| 对比项 | CUDA调用 | NVAPI调用 |
|---|---|---|
| 依赖环境 | 需要安装CUDA Toolkit | 仅需NVAPI开发包,无需CUDA |
| 可获取信息范围 | 仅基础显存和核心信息 | 支持显存、温度、风扇等更多硬件参数 |
| 适用场景 | 已有CUDA计算逻辑的项目 | 需要全面硬件信息的通用项目 |
开发者可以根据项目的实际依赖和需求,选择合适的显存信息读取方式,两种方式都能稳定获取准确的GPU显存数据。