C++如何读取GPU显存信息(CUDA/NVAPI调用)?

来源:站长素材作者:三上悠亚头衔:网络博主
导读:本期聚焦于小伙伴创作的《C++如何读取GPU显存信息(CUDA/NVAPI调用)?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何读取GPU显存信息(CUDA/NVAPI调用)?》有用,将其分享出去将是对创作者最好的鼓励。

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

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显存数据。

C++CUDANVAPIGPU显存信息修改时间:2026-06-24 13:27:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。