Jak uzyskać informację o temperaturze chipsetu karty graficznej?

mgyver

W dzisiejszym odcinku zajmiemy się tak prozaiczną rzeczą jaką jest obsługa karty graficznej. Nie będziemy bynajmniej rysować, ale spróbujemy wyciągnąć jakieś informacje o karcie graficznej. Lud krzyczy "ciepło" więc spróbujemy wyciągnąć temperaturę procesora GPU.

Aby zacząć zabawę musimy ściągnąć plik NvApi.pas. Dla tych co nie umieją korzystać z wyszukiwarek dołączam link: http://andy.jgknet.de/blog/?page_id=351

Tworzymy nowy projekt i dołączmy plik NvApi.pas do projektu.

Inicjalizacja

</p>

Aby zacząć przygodę z kartą kraficzną NVidia należy zainicjalizować bibliotekę.

Robi się to tak:

var
  status: NvAPI_Status;
  errormsg: NvAPI_ShortString;
begin
  status:= NvAPI_Initialize();
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_Initialize: ' + errormsg), 'Błąd', 0);
    Exit;
  end;
end;

Sli nie Sli

</p>

Teraz dowiemy się ile mamy urządzeń wyświetlania NVidia:

var
  hDisplay_a: array[0..NVAPI_MAX_PHYSICAL_GPUS * 2] of PNvDisplayHandle;
  i: Integer;
begin
  i:= 0;
  status := NvAPI_EnumNvidiaDisplayHandle(i, @hDisplay_a[i]);
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_EnumNvidiaDisplayHandle: ' + errormsg), 'Błąd', 0);
    Exit;
  end;
end;

Temperatura karty graficznej

</p>

Jaka jest temperatura procesora GPU karty graficznej:

var
  thermalset: NV_GPU_THERMAL_SETTINGS;
  nvGPUHandle: TNvPhysicalGpuHandleArray;
  cnt: Cardinal;
begin
  status := NvAPI_GetPhysicalGPUsFromDisplay(hDisplay_a[i], nvGPUHandle, cnt);
  begin
    thermalset.version := NV_GPU_THERMAL_SETTINGS_VER;
    thermalset.count := 0;
    thermalset.sensor[0].controller := NVAPI_THERMAL_CONTROLLER_UNKNOWN;
    thermalset.sensor[0].target := NVAPI_THERMAL_TARGET_GPU;
    status := NvAPI_GPU_GetThermalSettings(nvGPUHandle[i], 0 , @thermalset);
    if status <> NVAPI_OK then
    begin
      NvAPI_GetErrorMessage(status, errormsg);
      MessageBox(0, PChar('NVAPI NvAPI_GPU_GetThermalSettings: ' + errormsg), 'Błąd', 0);
      Exit;
    end;
    LTemp.Caption:= IntToStr(thermalset.sensor[0].currentTemp); //tu wyśiwtlamy temperaturę GPU
  end;
end;

Cały projekt:

</p>
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NvAPI, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    LTemp: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  status: NvAPI_Status;
  errormsg: NvAPI_ShortString;
  thermalset: NV_GPU_THERMAL_SETTINGS;
  nvGPUHandle: TNvPhysicalGpuHandleArray;
  hDisplay_a: array[0..NVAPI_MAX_PHYSICAL_GPUS * 2] of PNvDisplayHandle;
  i: Integer;
  cnt: Cardinal;
begin
  status:= NvAPI_Initialize();
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_Initialize: ' + errormsg), 'Błąd', 0);
    Exit;
  end;

  i:= 0;
  status := NvAPI_EnumNvidiaDisplayHandle(i, @hDisplay_a[i]);
  if status <> NVAPI_OK then
  begin
    NvAPI_GetErrorMessage(status, errormsg);
    MessageBox(0, PChar('NVAPI NvAPI_EnumNvidiaDisplayHandle: ' + errormsg), 'Błąd', 0);
    Exit;
  end;

  status := NvAPI_GetPhysicalGPUsFromDisplay(hDisplay_a[i], nvGPUHandle, cnt);
  begin
    thermalset.version := NV_GPU_THERMAL_SETTINGS_VER;
    thermalset.count := 0;
    thermalset.sensor[0].controller := NVAPI_THERMAL_CONTROLLER_UNKNOWN;
    thermalset.sensor[0].target := NVAPI_THERMAL_TARGET_GPU;
    status := NvAPI_GPU_GetThermalSettings(nvGPUHandle[i], 0 , @thermalset);
    if status <> NVAPI_OK then
    begin
      NvAPI_GetErrorMessage(status, errormsg);
      MessageBox(0, PChar('NVAPI NvAPI_GPU_GetThermalSettings: ' + errormsg), 'Błąd', 0);
      Exit;
    end;
    LTemp.Caption:= IntToStr(thermalset.sensor[0].currentTemp); //wyświetlamy temperaturę GPU
  end;

end;

end.

Warto przejrzeć plik nagłówkowy NvApi.pas, w którym np. możemy znaleźć taką funkcję jak NvAPI_GPU_GetFullName która zwróci nam pełną nazwę karty graficznej.

0 komentarzy