You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言直接获取Linux下NVIDIA GPU的整数形式温度?

直接用C语言获取NVIDIA GPU温度的整数数值

当然可以!你完全不用依赖解析nvidia-settings的输出来获取GPU温度——这种解析字符串的方式确实在持续监测时会有不必要的性能开销。下面给你两种高效的方案,直接拿到整数形式的GPU温度值:

方案一:使用NVIDIA官方NVML库(推荐)

NVML(NVIDIA Management Library)是NVIDIA提供的官方管理库,专门用于监控和管理NVIDIA GPU,功能全面且兼容性强,是长期监测GPU状态的首选方案。

步骤:

  1. 安装NVML开发包:
    在Debian/Ubuntu系统上,可以通过以下命令安装:

    sudo apt-get install libnvidia-ml-dev
    

    其他发行版可以查找对应的包(比如RHEL/CentOS的nvidia-ml-devel)。

  2. C语言代码示例:
    这段代码会初始化NVML,获取第一个GPU的核心温度,然后输出整数形式的摄氏度数值:

    #include <stdio.h>
    #include <nvidia-ml.h>
    
    int main() {
        nvmlReturn_t result;
        nvmlDevice_t device;
        unsigned int temp;
    
        // 初始化NVML库
        result = nvmlInit();
        if (result != NVML_SUCCESS) {
            printf("NVML初始化失败:%s\n", nvmlErrorString(result));
            return 1;
        }
    
        // 获取第一个GPU设备(索引0)
        result = nvmlDeviceGetHandleByIndex(0, &device);
        if (result != NVML_SUCCESS) {
            printf("获取GPU设备失败:%s\n", nvmlErrorString(result));
            nvmlShutdown();
            return 1;
        }
    
        // 获取GPU核心温度(单位:摄氏度,整数)
        result = nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &temp);
        if (result != NVML_SUCCESS) {
            printf("获取温度失败:%s\n", nvmlErrorString(result));
            nvmlShutdown();
            return 1;
        }
    
        printf("GPU核心温度:%u°C\n", temp);
    
        // 清理NVML资源
        nvmlShutdown();
        return 0;
    }
    
  3. 编译运行:
    编译时需要链接NVML库:

    gcc -o gpu_temp gpu_temp.c -lnvidia-ml
    ./gpu_temp
    

方案二:读取sysfs系统文件(轻量无依赖)

如果你的系统支持sysfs(几乎所有现代Linux发行版都支持),可以直接读取GPU暴露的温度文件,无需依赖任何额外库,非常轻量。

步骤:

  1. 找到温度文件路径:
    NVIDIA GPU的温度通常会暴露在/sys/class/drm/card0/device/hwmon/目录下的某个temp1_input文件中(card0对应第一个GPU,多GPU场景可以换card1、card2等)。你可以用以下命令快速定位:

    find /sys/class/drm/card0/device/hwmon -name "temp1_input"
    

    输出类似:/sys/class/drm/card0/device/hwmon/hwmon2/temp1_input

  2. C语言代码示例:
    这段代码直接读取该文件的内容,转换为整数后除以1000得到摄氏度(因为文件中存储的是毫摄氏度):

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        FILE *fp;
        char buffer[10];
        long temp_millic;
        int temp_c;
    
        // 替换为你找到的实际路径
        fp = fopen("/sys/class/drm/card0/device/hwmon/hwmon2/temp1_input", "r");
        if (fp == NULL) {
            perror("打开温度文件失败");
            return 1;
        }
    
        // 读取文件内容
        if (fgets(buffer, sizeof(buffer), fp) == NULL) {
            perror("读取温度失败");
            fclose(fp);
            return 1;
        }
    
        // 转换为整数(毫摄氏度),再转为摄氏度
        temp_millic = strtol(buffer, NULL, 10);
        temp_c = temp_millic / 1000;
    
        printf("GPU核心温度:%d°C\n", temp_c);
    
        fclose(fp);
        return 0;
    }
    
  3. 编译运行:
    直接编译即可,无需链接额外库:

    gcc -o gpu_temp_sysfs gpu_temp_sysfs.c
    ./gpu_temp_sysfs
    

方案对比

  • NVML库:功能全面(除了温度还能获取显存使用率、功耗等),兼容性强(适配不同NVIDIA驱动版本),适合需要完整GPU监控的场景。
  • sysfs读取:轻量无依赖,代码简单,适合只需要温度监测的简单场景,但路径可能因系统、GPU布局或驱动版本略有变化,需要提前确认路径。

两种方案都能直接获取整数形式的温度,完全避免了解析nvidia-settings输出的开销,非常适合持续监测GPU温度的场景。

内容的提问来源于stack exchange,提问作者secdet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:58:23