private bool ExecNvmlSetTDP(string calledFrom, double percentage) { var execRet = ExecNvmlProcedure(false, calledFrom, () => { var nvmlDevice = GetNvmlDevice(); uint minLimit = 0; uint maxLimit = 0; var ret = NvmlNativeMethods.nvmlDeviceGetPowerManagementLimitConstraints(nvmlDevice, ref minLimit, ref maxLimit); if (ret != nvmlReturn.Success) { throw new NvmlException($"nvmlDeviceGetPowerManagementLimitConstraints", ret); } uint defaultLimit = 0; ret = NvmlNativeMethods.nvmlDeviceGetPowerManagementDefaultLimit(nvmlDevice, ref defaultLimit); if (ret != nvmlReturn.Success) { throw new NvmlException($"nvmlDeviceGetPowerManagementDefaultLimit", ret); } // We limit 100% to the default as max var limit = RangeCalculator.CalculateValue(percentage, minLimit, defaultLimit); var setLimit = (uint)limit; ret = NvmlNativeMethods.nvmlDeviceSetPowerManagementLimit(nvmlDevice, setLimit); if (ret != nvmlReturn.Success) { throw new NvmlException("nvmlDeviceSetPowerManagementLimit", ret); } return(true); }); return(execRet); }
// AMD tdpLimit private bool SetTdpADL(double percValue) { int min = 0, max = 0, defaultValue = 0; int ok = AMD_ODN.nhm_amd_device_get_tdp_ranges(BusID, ref min, ref max, ref defaultValue); if (ok != 0) { Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_tdp_ranges failed with error code {ok}", _delayedLogging); return(false); } // We limit 100% to the default as max var limit = 0.0d; if (percValue > 1) { limit = RangeCalculator.CalculateValueAMD(percValue - 1, defaultValue, max); } else { limit = RangeCalculator.CalculateValueAMD(percValue, min, defaultValue); } int ok2 = AMD_ODN.nhm_amd_device_set_tdp(BusID, (int)limit); if (ok2 != 0) { Logger.InfoDelayed(LogTag, $"nhm_amd_device_set_tdp failed with error code {ok}", _delayedLogging); return(false); } return(true); }
// AMD tdpLimit private bool SetTdpADL(double percValue) { try { if (ADL.ADL2_OverdriveN_PowerLimit_Set.Delegate == null) { Logger.ErrorDelayed(LogTag, $"SetTdpADL ADL2_OverdriveN_PowerLimit_Set not supported", TimeSpan.FromSeconds(30)); return(false); } if (ADL.ADL2_OverdriveN_CapabilitiesX2_Get.Delegate == null) { Logger.ErrorDelayed(LogTag, $"SetTdpADL ADL2_OverdriveN_CapabilitiesX2_Get not supported", TimeSpan.FromSeconds(30)); return(false); } var ADLODNCapabilitiesX2 = new ADLODNCapabilitiesX2(); var ret = ADL.ADL2_OverdriveN_CapabilitiesX2_Get.Delegate(_adlContext, _adapterIndex, ref ADLODNCapabilitiesX2); if (ret != ADL.ADL_SUCCESS) { Logger.Info(LogTag, $"SetTdpADL ADL2_OverdriveN_CapabilitiesX2_Get returned {ret}"); return(false); } var limit = 0.0d; if (percValue > 1) { limit = RangeCalculator.CalculateValueAMD(percValue - 1, ADLODNCapabilitiesX2.power.iDefault, ADLODNCapabilitiesX2.power.iMax); } else { limit = RangeCalculator.CalculateValueAMD(percValue, ADLODNCapabilitiesX2.power.iMin, ADLODNCapabilitiesX2.power.iDefault); } var setLimit = (int)limit; if (setLimit > ADLODNCapabilitiesX2.power.iMax) { setLimit = ADLODNCapabilitiesX2.power.iMax; } //set value here var lpODPowerLimit = new ADLODNPowerLimitSetting(); lpODPowerLimit.iMode = (int)ADLODNControlType.ODNControlType_Manual; lpODPowerLimit.iTDPLimit = setLimit; var adlRet = ADL.ADL2_OverdriveN_PowerLimit_Set.Delegate(_adlContext, _adapterIndex, ref lpODPowerLimit); if (adlRet != ADL.ADL_SUCCESS) { Logger.Error(LogTag, $"ADL2_OverdriveN_PowerLimit_Set failed with code {adlRet} for GPU BusID={BusID}."); return(false); } return(true); } catch (Exception e) { Logger.Info(LogTag, $"SetTdpADL {e.Message}"); } return(false); }
// AMD tdpLimit private bool SetTdpADL(bool usePercentage, double rawOrPercValue) { try { if (ADL.ADL2_OverdriveN_PowerLimit_Set.Delegate == null) { Logger.ErrorDelayed(LogTag, $"SetTdpADL ADL2_OverdriveN_PowerLimit_Set not supported", TimeSpan.FromSeconds(30)); return(false); } if (ADL.ADL2_OverdriveN_CapabilitiesX2_Get.Delegate == null) { Logger.ErrorDelayed(LogTag, $"SetTdpADL ADL2_OverdriveN_CapabilitiesX2_Get not supported", TimeSpan.FromSeconds(30)); return(false); } var ADLODNCapabilitiesX2 = new ADLODNCapabilitiesX2(); var ret = ADL.ADL2_OverdriveN_CapabilitiesX2_Get.Delegate(_adlContext, _adapterIndex, ref ADLODNCapabilitiesX2); if (ret != ADL.ADL_SUCCESS) { Logger.Info(LogTag, $"SetTdpADL ADL2_OverdriveN_CapabilitiesX2_Get returned {ret}"); return(false); } // We limit 100% to the default as max int tdpLimit = 0; if (usePercentage) { var limit = RangeCalculator.CalculateValue(rawOrPercValue, ADLODNCapabilitiesX2.power.iMin, ADLODNCapabilitiesX2.power.iDefault); tdpLimit = (int)limit; } else { var limit = Math.Max((int)rawOrPercValue, ADLODNCapabilitiesX2.power.iMin); tdpLimit = Math.Min(limit, ADLODNCapabilitiesX2.power.iDefault); } //set value here var lpODPowerLimit = new ADLODNPowerLimitSetting(); lpODPowerLimit.iMode = (int)ADLODNControlType.ODNControlType_Manual; lpODPowerLimit.iTDPLimit = tdpLimit; var adlRet = ADL.ADL2_OverdriveN_PowerLimit_Set.Delegate(_adlContext, _adapterIndex, ref lpODPowerLimit); if (adlRet != ADL.ADL_SUCCESS) { Logger.Error(LogTag, $"ADL2_OverdriveN_PowerLimit_Set failed with code {adlRet} for GPU BusID={BusID}."); return(false); } return(true); } catch (Exception e) { Logger.Info(LogTag, $"SetTdpADL {e.Message}"); } return(false); }