fix: improved GPU temperature reliability

This commit is contained in:
seerge
2023-03-13 23:28:57 +01:00
parent dd4d85f254
commit 2afbde814f
4 changed files with 27 additions and 22 deletions

View File

@@ -19,14 +19,12 @@ public class NvidiaGpuTemperatureProvider : IGpuTemperatureProvider {
if (!IsValid) if (!IsValid)
return null; return null;
PhysicalGPU internalGpu = _internalGpu!;
IThermalSensor? gpuSensor = IThermalSensor? gpuSensor =
GPUApi.GetThermalSettings(_internalGpu!.Handle).Sensors GPUApi.GetThermalSettings(internalGpu.Handle).Sensors
.FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU); .FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU);
if (gpuSensor == null) return gpuSensor?.CurrentTemperature;
return null;
return gpuSensor.CurrentTemperature;
} }
public void Dispose() { public void Dispose() {

View File

@@ -40,19 +40,28 @@ public class HardwareMonitor
try try
{ {
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature(); gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
} catch (Exception ex) } catch (Exception ex) {
{ gpuTemp = null;
Logger.WriteLine("Failed reading GPU temp"); Logger.WriteLine("Failed reading GPU temp");
Logger.WriteLine(ex.ToString()); Logger.WriteLine(ex.ToString());
} }
} }
public static void RecreateGpuTemperatureProviderWithRetry() {
RecreateGpuTemperatureProvider();
// Re-enabling the discrete GPU takes a bit of time,
// so a simple workaround is to refresh again after that happens
Task.Run(async () => {
await Task.Delay(TimeSpan.FromSeconds(3));
RecreateGpuTemperatureProvider();
});
}
public static void RecreateGpuTemperatureProvider() { public static void RecreateGpuTemperatureProvider() {
try { try {
if (GpuTemperatureProvider != null) { GpuTemperatureProvider?.Dispose();
GpuTemperatureProvider.Dispose();
}
// Detect valid GPU temperature provider. // Detect valid GPU temperature provider.
// We start with NVIDIA because there's always at least an integrated AMD GPU // We start with NVIDIA because there's always at least an integrated AMD GPU
@@ -73,7 +82,7 @@ public class HardwareMonitor
GpuTemperatureProvider = null; GpuTemperatureProvider = null;
} finally { } finally {
Debug.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}"); Logger.WriteLine($"GpuTemperatureProvider: {GpuTemperatureProvider?.GetType().Name}");
} }
} }
} }

View File

@@ -8,6 +8,8 @@ public static class Logger
{ {
public static void WriteLine(string logMessage) public static void WriteLine(string logMessage)
{ {
Debug.WriteLine(logMessage);
var appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper"; var appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
var logFile = appPath + "\\log.txt"; var logFile = appPath + "\\log.txt";
@@ -109,6 +111,7 @@ namespace GHelper
settingsForm.SetStartupCheck(Startup.IsScheduled()); settingsForm.SetStartupCheck(Startup.IsScheduled());
SetAutoModes(); SetAutoModes();
HardwareMonitor.RecreateGpuTemperatureProvider();
// Subscribing for native power change events // Subscribing for native power change events
@@ -205,15 +208,6 @@ namespace GHelper
settingsForm.AutoGPUMode(isPlugged); settingsForm.AutoGPUMode(isPlugged);
settingsForm.SetMatrix(isPlugged); settingsForm.SetMatrix(isPlugged);
HardwareMonitor.RecreateGpuTemperatureProvider();
// Re-enabling the discrete GPU takes a bit of time,
// so a simple workaround is to refresh again after that happens
Task.Run(async () => {
await Task.Delay(TimeSpan.FromSeconds(3));
HardwareMonitor.RecreateGpuTemperatureProvider();
});
} }
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)

View File

@@ -935,6 +935,7 @@ namespace GHelper
Program.settingsForm.BeginInvoke(delegate Program.settingsForm.BeginInvoke(delegate
{ {
InitGPUMode(); InitGPUMode();
HardwareMonitor.RecreateGpuTemperatureProviderWithRetry();
Thread.Sleep(500); Thread.Sleep(500);
AutoScreen(SystemInformation.PowerStatus.PowerLineStatus); AutoScreen(SystemInformation.PowerStatus.PowerLineStatus);
}); });
@@ -987,9 +988,12 @@ namespace GHelper
changed = true; changed = true;
} }
if (changed) if (changed) {
Program.config.setConfig("gpu_mode", GPUMode); Program.config.setConfig("gpu_mode", GPUMode);
HardwareMonitor.RecreateGpuTemperatureProviderWithRetry();
}
if (restart) if (restart)
{ {
VisualiseGPUMode(GPUMode); VisualiseGPUMode(GPUMode);