如何用C语言直接获取Linux下NVIDIA GPU的整数型核心温度?
直接用C语言获取NVIDIA GPU核心温度(无需解析命令输出)
当然可以直接通过C语言获取整数形式的GPU核心温度,而且效率比解析nvidia-settings的输出高得多——你需要用到NVIDIA官方提供的NVML(NVIDIA Management Library),这是专门用于管理NVIDIA GPU的原生接口,完全避免了调用外部命令的开销。
步骤说明
1. 安装NVML开发库
首先确保系统上安装了NVML的开发文件:
- Debian/Ubuntu系:
sudo apt install nvidia-ml-dev - RHEL/CentOS系:
sudo yum install nvidia-devel
如果是手动安装的NVIDIA驱动,通常已经自带了NVML的头文件和库文件,路径一般在/usr/include/nvidia/和/usr/lib64/(或/usr/lib/)。
2. C语言示例代码
下面是一个完整的示例,直接获取第一个GPU(索引0)的核心温度:
#include <stdio.h> #include <nvml.h> int main() { nvmlReturn_t ret; unsigned int gpu_temp; nvmlDevice_t device_handle; // 初始化NVML库 ret = nvmlInit(); if (ret != NVML_SUCCESS) { fprintf(stderr, "NVML初始化失败: %s\n", nvmlErrorString(ret)); return 1; } // 获取索引为0的GPU设备句柄 ret = nvmlDeviceGetHandleByIndex(0, &device_handle); if (ret != NVML_SUCCESS) { fprintf(stderr, "获取GPU设备失败: %s\n", nvmlErrorString(ret)); nvmlShutdown(); return 1; } // 获取GPU核心温度(单位:摄氏度,整数形式) ret = nvmlDeviceGetTemperature(device_handle, NVML_TEMPERATURE_GPU, &gpu_temp); if (ret != NVML_SUCCESS) { fprintf(stderr, "读取GPU温度失败: %s\n", nvmlErrorString(ret)); nvmlShutdown(); return 1; } printf("GPU核心温度: %u°C\n", gpu_temp); // 清理NVML资源 nvmlShutdown(); return 0; }
3. 编译与运行
编译时需要链接NVML库(libnvidia-ml.so):
gcc -o gpu_temp_reader gpu_temp_reader.c -lnvidia-ml
运行编译后的程序:
./gpu_temp_reader
输出会直接显示整数形式的温度,比如GPU核心温度: 41°C。
为什么这个方法更高效?
相比解析nvidia-settings的输出:
- 避免了fork/exec外部进程的开销,这在连续检测时会积累大量额外消耗
- 无需处理字符串解析(比如从命令输出中提取数字),直接得到整数结果
- NVML是原生系统级接口,调用延迟极低,适合高频监控场景
额外说明
- 如果你的系统有多个GPU,只需要循环调用
nvmlDeviceGetHandleByIndex,传入不同的索引(从0开始)即可获取每个GPU的温度 - 大多数情况下,普通用户权限就可以读取GPU温度,无需root权限
- NVML还支持获取更多GPU状态信息(比如显存使用率、功耗等),如果需要扩展功能可以参考官方文档
内容的提问来源于stack exchange,提问作者secdet
相关产品推荐
相关产品推荐

