Seite 1 von 1

nVidia Temperatur auslesen

Verfasst: 18.08.2015 21:10
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

Re: nVidia Temperatur auslesen

Verfasst: 19.08.2015 07:34
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 ;)

Re: nVidia Temperatur auslesen

Verfasst: 19.08.2015 12:53
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. ;-)

Re: nVidia Temperatur auslesen

Verfasst: 19.08.2015 13:23
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

Re: nVidia Temperatur auslesen

Verfasst: 19.08.2015 18:05
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 ;) )

Re: nVidia Temperatur auslesen

Verfasst: 20.08.2015 10:10
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.

Re: nVidia Temperatur auslesen

Verfasst: 20.08.2015 10:48
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.

Re: nVidia Temperatur auslesen

Verfasst: 20.08.2015 16:04
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()