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