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