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