4

ここ数日、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 は初期化中であり、GTX680 である GPU を見つけることができますが、温度は返されません。

4

4 に答える 4

3

printf渡されるパラメーターのサイズとタイプに非常に敏感です。

は 32 ビットの符号なしとして固定されているためcurrentTemp(C++ は likes のような型の特定のビット数を保証しません)、予測できるprintf型にキャストします。printf

printf("Temp: %u C\n", static_cast<unsigned>(thermal.sensor[0].currentTemp) );
于 2013-03-29T19:37:19.327 に答える
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_EnumPhysicalGPUs を参照してください)。

于 2013-11-19T00:56:16.047 に答える
0

これらの行のタイプミスだけで、コードはほとんど機能します;)

(!ret == NVAPI_OK)

それらを次のように変更します。

(ret != NVAPI_OK)
于 2014-11-13T17:35:10.197 に答える