public void Close() { foreach (Hardware gpu in hardware) { gpu.Close(); } if (NVML.IsInitialized) { NVML.NvmlShutdown(); } }
public NvidiaGPU(int adapterIndex, NvPhysicalGpuHandle handle, NvDisplayHandle?displayHandle, ISettings settings) : base(GetName(handle), new Identifier("nvidiagpu", adapterIndex.ToString(CultureInfo.InvariantCulture)), settings) { this.adapterIndex = adapterIndex; this.handle = handle; this.displayHandle = displayHandle; NvGPUThermalSettings thermalSettings = GetThermalSettings(); temperatures = new Sensor[thermalSettings.Count]; for (int i = 0; i < temperatures.Length; i++) { NvSensor sensor = thermalSettings.Sensor[i]; string name; switch (sensor.Target) { case NvThermalTarget.BOARD: name = "GPU Board"; break; case NvThermalTarget.GPU: name = "GPU Core"; break; case NvThermalTarget.MEMORY: name = "GPU Memory"; break; case NvThermalTarget.POWER_SUPPLY: name = "GPU Power Supply"; break; case NvThermalTarget.UNKNOWN: name = "GPU Unknown"; break; default: name = "GPU"; break; } temperatures[i] = new Sensor(name, i, SensorType.Temperature, this, new ParameterDescription[0], settings); ActivateSensor(temperatures[i]); } fan = new Sensor("GPU", 0, SensorType.Fan, this, settings); clocks = new Sensor[3]; clocks[0] = new Sensor("GPU Core", 0, SensorType.Clock, this, settings); clocks[1] = new Sensor("GPU Memory", 1, SensorType.Clock, this, settings); clocks[2] = new Sensor("GPU Shader", 2, SensorType.Clock, this, settings); for (int i = 0; i < clocks.Length; i++) { ActivateSensor(clocks[i]); } loads = new Sensor[4]; loads[0] = new Sensor("GPU Core", 0, SensorType.Load, this, settings); loads[1] = new Sensor("GPU Frame Buffer", 1, SensorType.Load, this, settings); loads[2] = new Sensor("GPU Video Engine", 2, SensorType.Load, this, settings); loads[3] = new Sensor("GPU Bus Interface", 3, SensorType.Load, this, settings); memoryLoad = new Sensor("GPU Memory", 4, SensorType.Load, this, settings); memoryFree = new Sensor("GPU Memory Free", 1, SensorType.SmallData, this, settings); memoryUsed = new Sensor("GPU Memory Used", 2, SensorType.SmallData, this, settings); memoryAvail = new Sensor("GPU Memory Total", 3, SensorType.SmallData, this, settings); control = new Sensor("GPU Fan", 0, SensorType.Control, this, settings); NvGPUCoolerSettings coolerSettings = GetCoolerSettings(); if (coolerSettings.Count > 0) { fanControl = new Control(control, settings, coolerSettings.Cooler[0].DefaultMin, coolerSettings.Cooler[0].DefaultMax); fanControl.ControlModeChanged += ControlModeChanged; fanControl.SoftwareControlValueChanged += SoftwareControlValueChanged; ControlModeChanged(fanControl); control.Control = fanControl; } if (NVML.IsInitialized) { if (NVAPI.NvAPI_GPU_GetBusId != null && NVAPI.NvAPI_GPU_GetBusId(handle, out uint busId) == NvStatus.OK) { if (NVML.NvmlDeviceGetHandleByPciBusId != null && NVML.NvmlDeviceGetHandleByPciBusId( "0000:" + busId.ToString("X2") + ":00.0", out var result) == NVML.NvmlReturn.Success) { device = result; power = new Sensor("GPU Power", 0, SensorType.Power, this, settings); pcieThroughputRx = new Sensor("GPU PCIE Rx", 0, SensorType.Throughput, this, settings); pcieThroughputTx = new Sensor("GPU PCIE Tx", 1, SensorType.Throughput, this, settings); } } } Update(); }
public override void Update() { NvGPUThermalSettings settings = GetThermalSettings(); foreach (Sensor sensor in temperatures) { sensor.Value = settings.Sensor[sensor.Index].CurrentTemp; } bool tachReadingOk = false; if (NVAPI.NvAPI_GPU_GetTachReading != null && NVAPI.NvAPI_GPU_GetTachReading(handle, out int fanValue) == NvStatus.OK) { fan.Value = fanValue; ActivateSensor(fan); tachReadingOk = true; } uint[] values = GetClocks(); if (values != null) { clocks[1].Value = 0.001f * values[8]; if (values[30] != 0) { clocks[0].Value = 0.0005f * values[30]; clocks[2].Value = 0.001f * values[30]; } else { clocks[0].Value = 0.001f * values[0]; clocks[2].Value = 0.001f * values[14]; } } var infoEx = new NvDynamicPstatesInfoEx(); infoEx.Version = NVAPI.GPU_DYNAMIC_PSTATES_INFO_EX_VER; infoEx.UtilizationDomains = new NvUtilizationDomainEx[NVAPI.NVAPI_MAX_GPU_UTILIZATIONS]; if (NVAPI.NvAPI_GPU_GetDynamicPstatesInfoEx != null && NVAPI.NvAPI_GPU_GetDynamicPstatesInfoEx(handle, ref infoEx) == NvStatus.OK) { for (int i = 0; i < loads.Length; i++) { if (infoEx.UtilizationDomains[i].Present) { loads[i].Value = infoEx.UtilizationDomains[i].Percentage; ActivateSensor(loads[i]); } } } else { var info = new NvDynamicPstatesInfo(); info.Version = NVAPI.GPU_DYNAMIC_PSTATES_INFO_VER; info.UtilizationDomains = new NvUtilizationDomain[NVAPI.NVAPI_MAX_GPU_UTILIZATIONS]; if (NVAPI.NvAPI_GPU_GetDynamicPstatesInfo != null && NVAPI.NvAPI_GPU_GetDynamicPstatesInfo(handle, ref info) == NvStatus.OK) { for (int i = 0; i < loads.Length; i++) { if (info.UtilizationDomains[i].Present) { loads[i].Value = info.UtilizationDomains[i].Percentage; ActivateSensor(loads[i]); } } } } var coolerSettings = GetCoolerSettings(); var coolerSettingsOk = false; if (coolerSettings.Count > 0) { control.Value = coolerSettings.Cooler[0].CurrentLevel; ActivateSensor(control); coolerSettingsOk = true; } if (!tachReadingOk || !coolerSettingsOk) { var coolersStatus = GetFanCoolersStatus(); if (coolersStatus.Count > 0) { if (!coolerSettingsOk) { control.Value = coolersStatus.Items[0].CurrentLevel; ActivateSensor(control); coolerSettingsOk = true; } if (!tachReadingOk) { fan.Value = coolersStatus.Items[0].CurrentRpm; ActivateSensor(fan); tachReadingOk = true; } } } NvDisplayDriverMemoryInfo memoryInfo = new NvDisplayDriverMemoryInfo(); memoryInfo.Version = NVAPI.DISPLAY_DRIVER_MEMORY_INFO_VER; memoryInfo.Values = new uint[NVAPI.MAX_MEMORY_VALUES_PER_GPU]; if (NVAPI.NvAPI_GetDisplayDriverMemoryInfo != null && displayHandle.HasValue && NVAPI.NvAPI_GetDisplayDriverMemoryInfo(displayHandle.Value, ref memoryInfo) == NvStatus.OK) { uint totalMemory = memoryInfo.Values[0]; uint freeMemory = memoryInfo.Values[4]; float usedMemory = Math.Max(totalMemory - freeMemory, 0); memoryFree.Value = (float)freeMemory / 1024; memoryAvail.Value = (float)totalMemory / 1024; memoryUsed.Value = usedMemory / 1024; memoryLoad.Value = 100f * usedMemory / totalMemory; ActivateSensor(memoryAvail); ActivateSensor(memoryUsed); ActivateSensor(memoryFree); ActivateSensor(memoryLoad); } if (power != null) { if (NVML.NvmlDeviceGetPowerUsage(device.Value, out int powerValue) == NVML.NvmlReturn.Success) { power.Value = powerValue * 0.001f; ActivateSensor(power); } } if (pcieThroughputRx != null) { if (NVML.NvmlDeviceGetPcieThroughput(device.Value, NVML.NvmlPcieUtilCounter.RxBytes, out uint value) == NVML.NvmlReturn.Success) { pcieThroughputRx.Value = value * (1.0f / 0x400); ActivateSensor(pcieThroughputRx); } } if (pcieThroughputTx != null) { if (NVML.NvmlDeviceGetPcieThroughput(device.Value, NVML.NvmlPcieUtilCounter.TxBytes, out uint value) == NVML.NvmlReturn.Success) { pcieThroughputTx.Value = value * (1.0f / 0x400); ActivateSensor(pcieThroughputTx); } } }
public NvidiaGroup(ISettings settings) { if (!NVAPI.IsAvailable) { return; } report.AppendLine("NVAPI"); report.AppendLine(); string version; if (NVAPI.NvAPI_GetInterfaceVersionString(out version) == NvStatus.OK) { report.Append(" Version: "); report.AppendLine(version); } NvPhysicalGpuHandle[] handles = new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS]; int count; if (NVAPI.NvAPI_EnumPhysicalGPUs == null) { report.AppendLine(" Error: NvAPI_EnumPhysicalGPUs not available"); report.AppendLine(); return; } else { NvStatus status = NVAPI.NvAPI_EnumPhysicalGPUs(handles, out count); if (status != NvStatus.OK) { report.AppendLine(" Status: " + status); report.AppendLine(); return; } } var result = NVML.NvmlInit(); report.AppendLine(); report.AppendLine("NVML"); report.AppendLine(); report.AppendLine(" Status: " + result); report.AppendLine(); IDictionary <NvPhysicalGpuHandle, NvDisplayHandle> displayHandles = new Dictionary <NvPhysicalGpuHandle, NvDisplayHandle>(); if (NVAPI.NvAPI_EnumNvidiaDisplayHandle != null && NVAPI.NvAPI_GetPhysicalGPUsFromDisplay != null) { NvStatus status = NvStatus.OK; int i = 0; while (status == NvStatus.OK) { NvDisplayHandle displayHandle = new NvDisplayHandle(); status = NVAPI.NvAPI_EnumNvidiaDisplayHandle(i, ref displayHandle); i++; if (status == NvStatus.OK) { NvPhysicalGpuHandle[] handlesFromDisplay = new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS]; uint countFromDisplay; if (NVAPI.NvAPI_GetPhysicalGPUsFromDisplay(displayHandle, handlesFromDisplay, out countFromDisplay) == NvStatus.OK) { for (int j = 0; j < countFromDisplay; j++) { if (!displayHandles.ContainsKey(handlesFromDisplay[j])) { displayHandles.Add(handlesFromDisplay[j], displayHandle); } } } } } } report.Append("Number of GPUs: "); report.AppendLine(count.ToString(CultureInfo.InvariantCulture)); for (int i = 0; i < count; i++) { NvDisplayHandle displayHandle; displayHandles.TryGetValue(handles[i], out displayHandle); hardware.Add(new NvidiaGPU(i, handles[i], displayHandle, settings)); } report.AppendLine(); }