nVidia Temperatur auslesen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

nVidia Temperatur auslesen

Beitrag von man-in-black »

Hi,

wollte nur mal "schnell" die Temperatur meiner GPU auslesen lassen, suche aber jetzt schon ne Stunde
nach nem Fehler in meinem Code bzw. meiner Herangehensweise. Die Lib wird geladen; der Befehl wird gefunden;
der Befehlsaufruf scheitert jedoch?! So wie ich mich kenne, fehlt iwas wichtiges /:-> ...
Jemand ne Idee?

API-Handbuch: http://developer.download.nvidia.com/SD ... el_API.pdf
Befehl: NvCplGetThermalSettings()

Ach ja, zum Testen sollte man Windows, nen Nvidiatreiber und je nach OS nen 32/64bit (!) PB-Compiler besitzen ;)

Code: Alles auswählen

lib = OpenLibrary(0,"nvcpl.dll")
Debug lib

If lib
  
  *address = GetFunction(0,"NvCplGetThermalSettings")
  Debug *address
  
  Define out_CoreTemp.l
  Define out_AmbTemp.l
  Define out_LimTemp.l
  
  Debug CallCFunctionFast(*address,0,@out_CoreTemp,@out_AmbTemp,@out_LimTemp)
  
  Debug "Core: " + Str(out_CoreTemp)
  Debug "Amb : " + Str(out_AmbTemp)
  Debug "Lim : " + Str(out_LimTemp)
  
   CloseLibrary(0)
EndIf
(Mir ist bewusst, dass long nicht gleich dword ist.)

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: nVidia Temperatur auslesen

Beitrag von Bisonte »

Bist du dir sicher, dass damit die GPU gemeint ist ?

Alles was ich da rauslese dreht sich um den Monitor bzw. das Display.

Habe mal die LastErrorMsg eingefügt und dort kam als Meldung :

[07:28:22] [Debug] Lib geöffnet
[07:28:22] [Debug] 0
[07:28:22] [Debug] NV_NOTIMPLEMENTED

hier der Testlauf :

Code: Alles auswählen

Prototype p_NvCplGetThermalSettings(nWindowsMonitorNumber, pdwCoreTemp.l, pdwAmbientTemp.l, pdwUpperLimit.l)
Prototype p_NvGetLastErrorMessage()

nvcpl = OpenLibrary(#PB_Any, "nvcpl.dll")

If nvcpl 
  Debug "Lib geöffnet"
  NvCplGetThermalSettings.p_NvCplGetThermalSettings = GetFunction(nvcpl, "NvCplGetThermalSettings")
  
  CompilerIf #PB_Compiler_Unicode
    NvGetLastErrorMessage.p_NvGetLastErrorMessage = GetFunction(nvcpl, "NvGetLastErrorMessageW")
  CompilerElse
    NvGetLastErrorMessage.p_NvGetLastErrorMessage = GetFunction(nvcpl, "NvGetLastErrorMessageA")
  CompilerEndIf
  
  Debug NvCplGetThermalSettings(0, a, b, c)
  p = NvGetLastErrorMessage()
  If p
    Debug PeekS(p)
  EndIf
  
  CloseLibrary(nvcpl)
EndIf
P.S. : Nimm Prototypes... liest sich besser und klappt beinahe immer ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: nVidia Temperatur auslesen

Beitrag von Sven »

Der bringt mir:
Lib geöffnet
Debug NvCplGetThermalSettings(0, a, b, c) <= ungültiger Speicherzugriff auf Adresse 0

Kommentiere ich das aus, kommt:
Lib geöffnet
Erfolg. <= Muss ja dann die LastErrorMessage sein? Auf Deutsch? Nagut, meine Nvidia-Einstellungsbox ist ja auch auf Deutsch. ;-)
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: nVidia Temperatur auslesen

Beitrag von man-in-black »

Bist du dir sicher, dass damit die GPU gemeint ist ?
Alles was ich da rauslese dreht sich um den Monitor bzw. das Display.
Soweit ichs verstanden habe, soll nvcpl.dll die gleichen Informationen bereitstellen, die auch der GPU Monitor von NVidia anzeigen kann. Irgendwo stand auch, dass man sich so sein eigenes Control Panel schreiben könne, sofern einem das vorhandene nicht gefiele. Folglich ist es schon ein Mix aus allen Daten, die in irgendeiner Weise mit der GraKa in Verbindung stehen. Mag sein, dass das auch schon die Erklärung für NOTIMPLEMENTED ist. Was nicht in dem originalen GPU Monitor gezeigt wird, wird auch nicht als API bereitgestellt ... schade /:->
P.S. : Nimm Prototypes... liest sich besser und klappt beinahe immer
bin zufällig über nvcpl.dll gestolpert und wollte es nur q&d testen ;)

trotzdem danke
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: nVidia Temperatur auslesen

Beitrag von Bisonte »

Sven hat geschrieben:Der bringt mir:
Lib geöffnet
Debug NvCplGetThermalSettings(0, a, b, c) <= ungültiger Speicherzugriff auf Adresse 0

Kommentiere ich das aus, kommt:
Lib geöffnet
Erfolg. <= Muss ja dann die LastErrorMessage sein? Auf Deutsch? Nagut, meine Nvidia-Einstellungsbox ist ja auch auf Deutsch. ;-)
Eventuell hast du mit der 32Bit Version von PB versucht eine 64Bit dll von NVidia zu öffnen oder umgekehrt ?
Bei mir funktioniert es (weil 64Bit Windows und 64 Bit Treiber) nur mit der x64 Version von PB (was auch logisch ist ;) )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: nVidia Temperatur auslesen

Beitrag von Chimorin »

64-bit PC, aber es funktioniert nicht mit PB x64. NV_NotIMPLEMENTED

Mit PB x86 wird nicht einmal die DLL geöffnet (Richtig so).

Eventuell könnte man dies mit dem EntwicklerSDK ausführen oder die NVAPI64.dll nutzen.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: nVidia Temperatur auslesen

Beitrag von RSBasic »

http://www.purebasic.fr/english/viewtop ... 12&t=41747
1. Folgende Datei herunterladen und entpacken: http://developer.download.nvidia.com/NV ... ay2010.zip
2. Erstelle einen Ordner und in dem Ordner eine leere PB-Datei.
3. Kopiere und füge die Datei "nvapi.lib" (für 32 Bit, siehe Ordner "x86") bzw. "nvapi64.lib" (für 64 Bit, siehe Ordner "amd64") ein.
4. Füge den folgenden Code bei dir ein: http://www.purebasic.fr/english/viewtop ... 49#p356149
5. Datentypen bei Pointern entfernen, damit es mit der aktuellen PB-Version funktioniert.
6. Starten

Bei mir kann die Temperatur ausgelesen und angezeigt werden.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Re: nVidia Temperatur auslesen

Beitrag von andi256 »

win7 64bit / PB5.30 x64 / Quadro K2200

Code: Alles auswählen

#lib  = "D:\privat\Projekte\LCD\gpu\nvapi64.lib"  ; .... anpassen

Global Dim GpuHandles.i(64)

Structure sensor
 controller.l
 defaultMinTemp.l
 defaultMaxTemp.l
 currentTemp.l
 target.l
EndStructure

Structure NV_GPU_THERMAL_SETTINGS
 version.l
 count.l
 sensors.sensor[3]
EndStructure

Import #lib
NvAPI_Initialize()
NvAPI_EnumPhysicalGPUs      (GpuHandles, gpus)
NvAPI_GPU_GetFullName       (Handle.l, name)
NvAPI_GPU_GetThermalSettings(Handle.l, i.l, point)
NvAPI_GPU_GetTachReading    (Handle.l,  value)
EndImport

Procedure initgpu()
 If NvAPI_Initialize() <>0
  MessageRequester("error","Unable to Initialize NVAPI.")
  ProcedureReturn
 EndIf
 If NvAPI_EnumPhysicalGPUs(@GpuHandles(0), @gpus) <> 0
  MessageRequester("error","Unable to take number of physical gpus.")
  ProcedureReturn
 EndIf
 name.s = Space(64)
 NvAPI_GPU_GetFullName(GpuHandles(0), @name)
 Debug name
EndProcedure

Procedure NVidiainfo()   
 Protected temp.NV_GPU_THERMAL_SETTINGS
 Protected fan.l
 temp\version = SizeOf(NV_GPU_THERMAL_SETTINGS) | (1<<16)
 temp\count = 0
 temp\sensors[0]\controller = -1
 temp\sensors[0]\target = 1
 NvAPI_GPU_GetThermalSettings(GpuHandles(0), 0, @temp) 
 NvAPI_GPU_GetTachReading(GpuHandles(0), @fan) 
 Debug temp\sensors[0]\currentTemp
 Debug temp\sensors[0]\defaultMinTemp
 Debug temp\sensors[0]\defaultMaxTemp
 Debug fan
EndProcedure

initgpu()
NVidiainfo()
Antworten