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);
        }
Example #3
0
        // 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);
        }
Example #4
0
        // 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);
        }