Esempio n. 1
0
        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.CalculateValueNVIDIA(percentage, defaultLimit);
                var setLimit = (uint)limit;
                if (setLimit > maxLimit)
                {
                    setLimit = maxLimit;
                }
                if (setLimit < minLimit)
                {
                    setLimit = minLimit;
                }
                ret = NvmlNativeMethods.nvmlDeviceSetPowerManagementLimit(nvmlDevice, setLimit);
                if (ret != nvmlReturn.Success)
                {
                    throw new NvmlException("nvmlDeviceSetPowerManagementLimit", ret);
                }

                return(true);
            });

            return(execRet);
        }