过去几天我一直试图用C ++来获取GPU的温度
使用NVAPI我有以下代码
#include "stdafx.h"
#include "nvapi.h"
int _tmain(int argc, _TCHAR* argv[])
{
NvAPI_Status ret = NVAPI_OK;
int i=0;
NvDisplayHandle hDisplay_a[NVAPI_MAX_PHYSICAL_GPUS*2] = {0};
ret = NvAPI_Initialize();
if (!ret == NVAPI_OK){
NvAPI_ShortString string;
NvAPI_GetErrorMessage(ret, string);
printf("NVAPI NvAPI_Initialize: %s\n", string);
}
NvAPI_ShortString ver;
NvAPI_GetInterfaceVersionString(ver);
printf("NVAPI Version: %s\n", ver);
NvU32 cnt;
NvPhysicalGpuHandle phys;
ret = NvAPI_EnumPhysicalGPUs(&phys, &cnt);
if (!ret == NVAPI_OK){
NvAPI_ShortString string;
NvAPI_GetErrorMessage(ret, string);
printf("NVAPI NvAPI_EnumPhysicalGPUs: %s\n", string);
}
NvAPI_ShortString name;
NV_GPU_THERMAL_SETTINGS thermal;
ret = NvAPI_GPU_GetFullName(phys, name);
if (!ret == NVAPI_OK){
NvAPI_ShortString string;
NvAPI_GetErrorMessage(ret, string);
printf("NVAPI NvAPI_GPU_GetFullName: %s\n", string);
}
printf("Name: %s\n", name);
thermal.version =NV_GPU_THERMAL_SETTINGS_VER;
ret = NvAPI_GPU_GetThermalSettings(phys,0, &thermal);
if (!ret == NVAPI_OK){
NvAPI_ShortString string;
NvAPI_GetErrorMessage(ret, string);
printf("NVAPI NvAPI_GPU_GetThermalSettings: %s\n", string);
}
printf("Temp: %l C\n", thermal.sensor[0].currentTemp);
return 0;
}
我得到的输出是
NVAPI Version: NVidia Complete Version 1.10
Name: GeForce GTX 680
Temp: C
所以NVAPI正在初始化,它可以找到我的GPU,这是一个GTX680,但它不会返回温度
答案 0 :(得分:3)
printf
对传递的参数的大小和类型非常敏感。
由于currentTemp
被修复为32位无符号(并且C ++不保证类型printf
喜欢的特定bitcounts),因此将其强制转换为printf
可以预期的类型。 / p>
printf("Temp: %u C\n", static_cast<unsigned>(thermal.sensor[0].currentTemp) );
答案 1 :(得分:3)
我认为问题在于您需要按以下方式设置热设置:
NV_GPU_THERMAL_SETTINGS ThermalInfo;
ThermalInfo.version = NV_GPU_THERMAL_SETTINGS_VER_2;
ThermalInfo.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_GPU_INTERNAL;
ThermalInfo.sensor[0].target = NVAPI_THERMAL_TARGET_GPU;
你也应该写:
NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS];
因为你可能会破坏记忆。 (请注意NVAPI随附的文档中的NvAPI_EnumPhysicalGPU)。
答案 2 :(得分:0)
您的代码几乎可以正常工作,只是在这些行上打字错误;)
(!ret == NVAPI_OK)
将其更改为:
(ret != NVAPI_OK)
答案 3 :(得分:0)
您已经能够为thermal.sensor [0]获得正确的值.currentTemp,
只是你在打印时误以为。请看Nvapi中的thermal.sensor结构:
struct
{
NV_THERMAL_CONTROLLER controller; //!< internal, ADM1032, MAX6649...
NvS32 defaultMinTemp; //!< Minimum default temperature value of the thermal sensor in degree Celsius
NvS32 defaultMaxTemp; //!< Maximum default temperature value of the thermal sensor in degree Celsius
NvS32 currentTemp; //!< Current temperature value of the thermal sensor in degree Celsius
NV_THERMAL_TARGET target; //!< Thermal sensor targeted - GPU, memory, chipset, powersupply, Visual Computing Device, etc
} sensor[NVAPI_MAX_THERMAL_SENSORS_PER_GPU];
它表明NvS32 currentTemp是32位整数。