Получите температуру от NVidia GPU, используя NVAPI

Последние несколько дней я пытался измерить температуру моего GPU с помощью C ++

используя 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 инициализируется и может найти мой графический процессор GTX680, но он не будет возвращать температуру

3

Решение

printf очень чувствителен к размеру и типу передаваемых параметров.

поскольку currentTemp фиксируется как 32-битный без знака (и C ++ не гарантирует конкретные битовые счета для типов printf нравится), приведите его к типу, который printf могу предвидеть.

printf("Temp: %u C\n", static_cast<unsigned>(thermal.sensor[0].currentTemp) );
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_EnumPhysicalGPU в документации, поставляемой вместе с NVAPI).

3

Ваш код почти работает, просто опечатки в этих строках;)

(!ret == NVAPI_OK)

измените их на:

(ret != NVAPI_OK)
0

Вы уже можете получить правильное значение для thermal.sensor [0] .currentTemp,

просто вы ошибаетесь при печати.

Пожалуйста, посмотрите на структуру thermal.sensor в 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];

Это показывает, что NvS32 currentTemp имеет 32-битное целое число со знаком.

0