Obtener la temperatura de NVidia GPU usando NVAPI

He estado intentando durante los últimos días obtener la temperatura de mi GPU utilizando C ++

Usando el NVAPI tengo el siguiente código

#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; } 

La salida que obtengo es

 NVAPI Version: NVidia Complete Version 1.10 Name: GeForce GTX 680 Temp: C 

Entonces NVAPI se está inicializando, y puede encontrar mi GPU que es una GTX680, pero no devolverá la temperatura

printf es muy sensible al tamaño y al tipo de parámetros que se pasa.

Dado que currentTemp se arregla como un 32 bit sin firmar (y C ++ no garantiza cuentas de bits específicas para los tipos de printf likes), conviértalo en un tipo que printf pueda anticipar.

 printf("Temp: %u C\n", static_cast(thermal.sensor[0].currentTemp) ); 

Creo que el problema es que se requiere que establezca la configuración térmica de la siguiente manera:

 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; 

También deberías escribir también:

 NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS]; 

Porque podrías corromper la memoria. (Tenga en cuenta que consulte NvAPI_EnumPhysicalGPUs en la documentación suministrada con NVAPI).

Tu código casi funciona, solo errores tipográficos en estas líneas;)

 (!ret == NVAPI_OK) 

cambiarlos a

 (ret != NVAPI_OK) 

Ya puedes obtener el valor correcto para thermal.sensor [0] .currentTemp,

Sólo te equivocas al imprimir.

Por favor, mire la estructura del sensor térmico en Nvapi:

 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]; 

Muestra que NvS32 currentTemp es un entero de 32 bits firmado.