2013-03-29 3 views
2

Я пытался в течение последних нескольких дней, чтобы получить температуру моего GPU с использованиемПолучить температуры от NVidia GPU с использованием NVAPI

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

+0

Чтобы напечатать длинный int, 'printf (" Temp:% l C \ n ")' должен быть 'printf (" Temp:% li C \ n ")'. l - это просто спецификатор длины, вы также должны указать тип, на который он влияет. Посмотрите [здесь] (http://www.cplusplus.com/reference/cstdio/printf/) –

+0

Большое вам спасибо Я думаю, я должен был проверить мои типы лучше – Shuttleu

ответ

3

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

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

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

Не должен 'static_cast ' be 'static_cast ', так как этот вопрос отмечен C++? unsigned сам по себе был допустимым спецификатором в C, в C++ он больше не существует. Также см. Мой комментарий к вопросу OP, поскольку этот ответ напрямую не связан с проблемой OP. –

+0

@TomKnapen остается открытым в C++. См. [Эта ссылка] (http://en.cppreference.com/w/cpp/language/types) –

+0

Да, я только что проверил быстрый тест и заметил, что он по-прежнему действителен. Я уже смотрел [здесь] (http://stackoverflow.com/editing-help#comment-formatting), чтобы увидеть, как ударить текст в моем комментарии. –

2

Я думаю, что проблема заключается в том, что вы должны установить тепловые параметры следующим образом:

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).

0

Ваш код работает почти, только опечаток на этих линиях;)

(!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-битным целым числом.

 Смежные вопросы

  • Нет связанных вопросов^_^