Esempio n. 1
0
 public void GetTemperature(IGpu gpu, out uint coreTemperature, out uint memoryTemperature)
 {
     coreTemperature   = 0;
     memoryTemperature = 0;
     if (NvapiNativeMethods.NvGetThermalSettings == null)
     {
         return;
     }
     try {
         int busId = gpu.GetOverClockId();
         if (!HandlesByBusId.TryGetValue(busId, out NvPhysicalGpuHandle handle))
         {
             return;
         }
         NvGPUThermalSettings settings = NvGPUThermalSettings.Create();
         var r = NvapiNativeMethods.NvGetThermalSettings(handle, (int)NvThermalTarget.ALL, ref settings);
         if (r != NvStatus.NVAPI_OK)
         {
             settings.Count = 0;
             NTMinerConsole.DevError(() => $"{nameof(NvapiNativeMethods.NvGetThermalSettings)} {r.ToString()}");
         }
         if (settings.Count > 0)
         {
             coreTemperature = settings.Sensor[0].CurrentTemp;
         }
         // TODO:3090是支持显存温度的,但不知道用什么接口读取
         if (settings.Count > 1)
         {
             memoryTemperature = settings.Sensor[1].CurrentTemp;
         }
     }
     catch (Exception e) {
         Logger.ErrorDebugLine(e);
     }
 }
Esempio n. 2
0
 private void UpdateTemperatureSettings()
 {
     _thermalSettings         = new NvGPUThermalSettings();
     _thermalSettings.Version = NVAPI.GPU_THERMAL_SETTINGS_VER;
     _thermalSettings.Count   = NVAPI.MAX_THERMAL_SENSORS_PER_GPU;
     _thermalSettings.Sensor  = new NvSensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU];
     NVAPI.NvAPI_GPU_GetThermalSettings(_handle, (int)NvThermalTarget.ALL, ref _thermalSettings);
 }
Esempio n. 3
0
        public IEnumerable <Sample> GetData()
        {
            if (!available)
            {
                yield break;
            }

            foreach (var handle in handles)
            {
                string name;
                NVAPI.NvAPI_GPU_GetFullName(handle, out name);

                NvGPUThermalSettings settings = GetThermalSettings(handle);

                for (int i = 0; i < settings.Count; i++)
                {
                    NvSensor sensor = settings.Sensor[i];
                    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;
                    }

                    yield return(Sample.Temperature(name, sensor.CurrentTemp, true));
                }

                int value;
                if (NVAPI.NvAPI_GPU_GetTachReading != null &&
                    NVAPI.NvAPI_GPU_GetTachReading(handle, out value) == NvStatus.OK)
                {
                    yield return(Sample.FanSpeed("GPU Fan", value, true));
                }
            }
        }
Esempio n. 4
0
        static NvGPUThermalSettings GetThermalSettings(NvPhysicalGpuHandle handle)
        {
            NvGPUThermalSettings settings = new NvGPUThermalSettings();

            settings.Version = NVAPI.GPU_THERMAL_SETTINGS_VER;
            settings.Count   = NVAPI.MAX_THERMAL_SENSORS_PER_GPU;
            settings.Sensor  = new NvSensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU];
            if (NVAPI.NvAPI_GPU_GetThermalSettings(handle, (int)NvThermalTarget.ALL,
                                                   ref settings) != NvStatus.OK)
            {
                settings.Count = 0;
            }
            return(settings);
        }
Esempio n. 5
0
        private NvGPUThermalSettings GetThermalSettings()
        {
            NvGPUThermalSettings settings = new NvGPUThermalSettings();

            settings.Version = NVAPI.GPU_THERMAL_SETTINGS_VER;
            settings.Count   = NVAPI.MAX_THERMAL_SENSORS_PER_GPU;
            settings.Sensor  = new NvSensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU];
            if (!(NVAPI.NvAPI_GPU_GetThermalSettings != null &&
                  NVAPI.NvAPI_GPU_GetThermalSettings(_handle, (int)NvThermalTarget.ALL,
                                                     ref settings) == NvStatus.OK))
            {
                settings.Count = 0;
            }
            return(settings);
        }
Esempio n. 6
0
        public float GetSensorValue(int deviceIndex, SensorType sensorType)
        {
            NvPhysicalGpuHandle physicalHandle = nvPhysicalGpuHandles[deviceIndex];

            switch (sensorType)
            {
            case SensorType.GFX_LOAD:
                if (NvAPI_GPU_GetDynamicPstatesInfoEx != null)
                {
                    NvDynamicPstatesInfoEx infoEx = new NvDynamicPstatesInfoEx();
                    infoEx.Version            = GPU_DYNAMIC_PSTATES_INFO_EX_VER;
                    infoEx.UtilizationDomains = new NvUtilizationDomainEx[NVAPI_MAX_GPU_UTILIZATIONS];
                    return(NvAPI_GPU_GetDynamicPstatesInfoEx(physicalHandle, ref infoEx) == 0 && infoEx.UtilizationDomains[0].Present ? infoEx.UtilizationDomains[0].Percentage / 100.0f : 0);
                }
                if (NvAPI_GPU_GetDynamicPstatesInfo != null)
                {
                    NvDynamicPstatesInfo info = new NvDynamicPstatesInfo();
                    info.Version            = GPU_DYNAMIC_PSTATES_INFO_VER;
                    info.UtilizationDomains = new NvUtilizationDomain[NVAPI_MAX_GPU_UTILIZATIONS];
                    return(NvAPI_GPU_GetDynamicPstatesInfo(physicalHandle, ref info) == 0 && info.UtilizationDomains[0].Present ? info.UtilizationDomains[0].Percentage : 0);
                }
                break;

            case SensorType.GFX_TEMPERATURE:
                if (NvAPI_GPU_GetThermalSettings != null)
                {
                    NvGPUThermalSettings thermalSettings = new NvGPUThermalSettings();
                    thermalSettings.Version = GPU_THERMAL_SETTINGS_VER;
                    thermalSettings.Count   = MAX_THERMAL_SENSORS_PER_GPU;
                    thermalSettings.Sensor  = new NvSensor[MAX_THERMAL_SENSORS_PER_GPU];

                    return(NvAPI_GPU_GetThermalSettings(physicalHandle, (int)NvThermalTarget.ALL, ref thermalSettings) == 0 ?
                           Array.Find(thermalSettings.Sensor, sensor => sensor.Target == NvThermalTarget.GPU).CurrentTemp : 0);
                }
                break;

            case SensorType.GFX_POWER:
                break;
            }
            return(0);
        }
Esempio n. 7
0
        public void Update()
        {
            uint[] values = GetClocks();
            if (values != null)
            {
                _memoryClock = 0.001f * values[8];
                if (values[30] != 0)
                {
                    _coreClock   = 0.0005f * values[30];
                    _shaderClock = 0.001f * values[30];
                }
                else
                {
                    _coreClock   = 0.001f * values[0];
                    _shaderClock = 0.001f * values[14];
                }
            }

            /*
             * Console.Write("core:" + _coreClock.ToString());
             * Console.Write("mem:" + _memoryClock.ToString());
             * Console.Write("shader:" + _shaderClock.ToString());
             * Console.WriteLine();
             */


            NvMemoryInfo memoryInfo = new NvMemoryInfo();

            memoryInfo.Version = NVAPI.GPU_MEMORY_INFO_VER;
            memoryInfo.Values  = new uint[NVAPI.MAX_MEMORY_VALUES_PER_GPU];
            if (NVAPI.NvAPI_GPU_GetMemoryInfo != null && _displayHandle.HasValue &&
                NVAPI.NvAPI_GPU_GetMemoryInfo(_displayHandle.Value, ref memoryInfo) ==
                NvStatus.OK)
            {
                TotalMem   = memoryInfo.Values[0];
                TotalMemMb = TotalMem / 1024;
                FreeMem    = memoryInfo.Values[4];
                FreeMemMb  = FreeMem / 1024;
                UsedMem    = Math.Max(TotalMem - FreeMem, 0);
                UsedMemMb  = UsedMem / 1024;
                LoadMemPct = 100.0f * UsedMem / TotalMem;
            }


            NvPStates states = new NvPStates();

            states.Version = NVAPI.GPU_PSTATES_VER;
            states.PStates = new NvPState[NVAPI.MAX_PSTATES_PER_GPU];
            if (NVAPI.NvAPI_GPU_GetPStates != null && NVAPI.NvAPI_GPU_GetPStates(_handle, ref states) == NvStatus.OK)
            {
                /*
                 * 0: Core
                 * 1: MemoryController
                 * 2: VideoEngine
                 */
                for (int i = 0; i < 3; i++)
                {
                    if (states.PStates[i].Present)
                    {
                        LoadPct = states.PStates[i].Percentage;
                        break;
                        //Console.WriteLine(states.PStates[i].Percentage);
                    }
                }
            }

            NvGPUThermalSettings thermalSettings = GetThermalSettings();

            for (int i = 0; i < thermalSettings.Count; i++)
            {
                NvSensor sensor = thermalSettings.Sensor[i];
                if (sensor.Target == NvThermalTarget.GPU)
                {
                    Temperature = sensor.CurrentTemp;
                    //Console.WriteLine(temp);
                    break;
                }
            }
        }
Esempio n. 8
-1
 private NvGPUThermalSettings GetThermalSettings()
 {
     NvGPUThermalSettings settings = new NvGPUThermalSettings();
       settings.Version = NVAPI.GPU_THERMAL_SETTINGS_VER;
       settings.Count = NVAPI.MAX_THERMAL_SENSORS_PER_GPU;
       settings.Sensor = new NvSensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU];
       if (!(NVAPI.NvAPI_GPU_GetThermalSettings != null &&
     NVAPI.NvAPI_GPU_GetThermalSettings(handle, (int)NvThermalTarget.ALL,
       ref settings) == NvStatus.OK))
       {
     settings.Count = 0;
       }
       return settings;
 }
Esempio n. 9
-1
 static NvGPUThermalSettings GetThermalSettings(NvPhysicalGpuHandle handle)
 {
     NvGPUThermalSettings settings = new NvGPUThermalSettings();
       settings.Version = NVAPI.GPU_THERMAL_SETTINGS_VER;
       settings.Count = NVAPI.MAX_THERMAL_SENSORS_PER_GPU;
       settings.Sensor = new NvSensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU];
       if (NVAPI.NvAPI_GPU_GetThermalSettings(handle, (int)NvThermalTarget.ALL,
     ref settings) != NvStatus.OK)
       {
     settings.Count = 0;
       }
       return settings;
 }
Esempio n. 10
-3
        public override string GetReport()
        {
            StringBuilder r = new StringBuilder();

              r.AppendLine("Nvidia GPU");
              r.AppendLine();

              r.AppendFormat("Name: {0}{1}", name, Environment.NewLine);
              r.AppendFormat("Index: {0}{1}", adapterIndex, Environment.NewLine);

              if (displayHandle.HasValue && NVAPI.NvAPI_GetDisplayDriverVersion != null) {
            NvDisplayDriverVersion driverVersion = new NvDisplayDriverVersion();
            driverVersion.Version = NVAPI.DISPLAY_DRIVER_VERSION_VER;
            if (NVAPI.NvAPI_GetDisplayDriverVersion(displayHandle.Value,
              ref driverVersion) == NvStatus.OK) {
              r.Append("Driver Version: ");
              r.Append(driverVersion.DriverVersion / 100);
              r.Append(".");
              r.Append((driverVersion.DriverVersion % 100).ToString("00",
            CultureInfo.InvariantCulture));
              r.AppendLine();
              r.Append("Driver Branch: ");
              r.AppendLine(driverVersion.BuildBranch);
            }
              }
              r.AppendLine();

              if (NVAPI.NvAPI_GPU_GetPCIIdentifiers != null) {
            uint deviceId, subSystemId, revisionId, extDeviceId;

            NvStatus status = NVAPI.NvAPI_GPU_GetPCIIdentifiers(handle,
              out deviceId, out subSystemId, out revisionId, out extDeviceId);

            if (status == NvStatus.OK) {
              r.Append("DeviceID: 0x");
              r.AppendLine(deviceId.ToString("X", CultureInfo.InvariantCulture));
              r.Append("SubSystemID: 0x");
              r.AppendLine(subSystemId.ToString("X", CultureInfo.InvariantCulture));
              r.Append("RevisionID: 0x");
              r.AppendLine(revisionId.ToString("X", CultureInfo.InvariantCulture));
              r.Append("ExtDeviceID: 0x");
              r.AppendLine(extDeviceId.ToString("X", CultureInfo.InvariantCulture));
              r.AppendLine();
            }
              }

              if (NVAPI.NvAPI_GPU_GetThermalSettings != null) {
            NvGPUThermalSettings settings = new NvGPUThermalSettings();
            settings.Version = NVAPI.GPU_THERMAL_SETTINGS_VER;
            settings.Count = NVAPI.MAX_THERMAL_SENSORS_PER_GPU;
            settings.Sensor = new NvSensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU];

            NvStatus status = NVAPI.NvAPI_GPU_GetThermalSettings(handle,
              (int)NvThermalTarget.ALL, ref settings);

            r.AppendLine("Thermal Settings");
            r.AppendLine();
            if (status == NvStatus.OK) {
              for (int i = 0; i < settings.Count; i++) {
            r.AppendFormat(" Sensor[{0}].Controller: {1}{2}", i,
              settings.Sensor[i].Controller, Environment.NewLine);
            r.AppendFormat(" Sensor[{0}].DefaultMinTemp: {1}{2}", i,
              settings.Sensor[i].DefaultMinTemp, Environment.NewLine);
            r.AppendFormat(" Sensor[{0}].DefaultMaxTemp: {1}{2}", i,
              settings.Sensor[i].DefaultMaxTemp, Environment.NewLine);
            r.AppendFormat(" Sensor[{0}].CurrentTemp: {1}{2}", i,
              settings.Sensor[i].CurrentTemp, Environment.NewLine);
            r.AppendFormat(" Sensor[{0}].Target: {1}{2}", i,
              settings.Sensor[i].Target, Environment.NewLine);
              }
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              if (NVAPI.NvAPI_GPU_GetAllClocks != null) {
            NvClocks allClocks = new NvClocks();
            allClocks.Version = NVAPI.GPU_CLOCKS_VER;
            allClocks.Clock = new uint[NVAPI.MAX_CLOCKS_PER_GPU];
            NvStatus status = NVAPI.NvAPI_GPU_GetAllClocks(handle, ref allClocks);

            r.AppendLine("Clocks");
            r.AppendLine();
            if (status == NvStatus.OK) {
              for (int i = 0; i < allClocks.Clock.Length; i++)
            if (allClocks.Clock[i] > 0) {
              r.AppendFormat(" Clock[{0}]: {1}{2}", i, allClocks.Clock[i],
                Environment.NewLine);
            }
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              if (NVAPI.NvAPI_GPU_GetTachReading != null) {
            int tachValue;
            NvStatus status = NVAPI.NvAPI_GPU_GetTachReading(handle, out tachValue);

            r.AppendLine("Tachometer");
            r.AppendLine();
            if (status == NvStatus.OK) {
              r.AppendFormat(" Value: {0}{1}", tachValue, Environment.NewLine);
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              if (NVAPI.NvAPI_GPU_GetPStates != null) {
            NvPStates states = new NvPStates();
            states.Version = NVAPI.GPU_PSTATES_VER;
            states.PStates = new NvPState[NVAPI.MAX_PSTATES_PER_GPU];
            NvStatus status = NVAPI.NvAPI_GPU_GetPStates(handle, ref states);

            r.AppendLine("P-States");
            r.AppendLine();
            if (status == NvStatus.OK) {
              for (int i = 0; i < states.PStates.Length; i++)
            if (states.PStates[i].Present)
              r.AppendFormat(" Percentage[{0}]: {1}{2}", i,
                states.PStates[i].Percentage, Environment.NewLine);
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              if (NVAPI.NvAPI_GPU_GetUsages != null) {
            NvUsages usages = new NvUsages();
            usages.Version = NVAPI.GPU_USAGES_VER;
            usages.Usage = new uint[NVAPI.MAX_USAGES_PER_GPU];
            NvStatus status = NVAPI.NvAPI_GPU_GetUsages(handle, ref usages);

            r.AppendLine("Usages");
            r.AppendLine();
            if (status == NvStatus.OK) {
              for (int i = 0; i < usages.Usage.Length; i++)
            if (usages.Usage[i] > 0)
              r.AppendFormat(" Usage[{0}]: {1}{2}", i,
                usages.Usage[i], Environment.NewLine);
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              if (NVAPI.NvAPI_GPU_GetCoolerSettings != null) {
            NvGPUCoolerSettings settings = new NvGPUCoolerSettings();
            settings.Version = NVAPI.GPU_COOLER_SETTINGS_VER;
            settings.Cooler = new NvCooler[NVAPI.MAX_COOLER_PER_GPU];
            NvStatus status =
              NVAPI.NvAPI_GPU_GetCoolerSettings(handle, 0, ref settings);

            r.AppendLine("Cooler Settings");
            r.AppendLine();
            if (status == NvStatus.OK) {
              for (int i = 0; i < settings.Count; i++) {
            r.AppendFormat(" Cooler[{0}].Type: {1}{2}", i,
              settings.Cooler[i].Type, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].Controller: {1}{2}", i,
              settings.Cooler[i].Controller, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].DefaultMin: {1}{2}", i,
              settings.Cooler[i].DefaultMin, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].DefaultMax: {1}{2}", i,
              settings.Cooler[i].DefaultMax, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].CurrentMin: {1}{2}", i,
              settings.Cooler[i].CurrentMin, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].CurrentMax: {1}{2}", i,
              settings.Cooler[i].CurrentMax, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].CurrentLevel: {1}{2}", i,
              settings.Cooler[i].CurrentLevel, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].DefaultPolicy: {1}{2}", i,
              settings.Cooler[i].DefaultPolicy, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].CurrentPolicy: {1}{2}", i,
              settings.Cooler[i].CurrentPolicy, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].Target: {1}{2}", i,
              settings.Cooler[i].Target, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].ControlType: {1}{2}", i,
              settings.Cooler[i].ControlType, Environment.NewLine);
            r.AppendFormat(" Cooler[{0}].Active: {1}{2}", i,
              settings.Cooler[i].Active, Environment.NewLine);
              }
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              if (NVAPI.NvAPI_GPU_GetMemoryInfo != null && displayHandle.HasValue) {
            NvMemoryInfo memoryInfo = new NvMemoryInfo();
            memoryInfo.Version = NVAPI.GPU_MEMORY_INFO_VER;
            memoryInfo.Values = new uint[NVAPI.MAX_MEMORY_VALUES_PER_GPU];
            NvStatus status = NVAPI.NvAPI_GPU_GetMemoryInfo(displayHandle.Value,
              ref memoryInfo);

            r.AppendLine("Memory Info");
            r.AppendLine();
            if (status == NvStatus.OK) {
              for (int i = 0; i < memoryInfo.Values.Length; i++)
            r.AppendFormat(" Value[{0}]: {1}{2}", i,
                memoryInfo.Values[i], Environment.NewLine);
            } else {
              r.Append(" Status: ");
              r.AppendLine(status.ToString());
            }
            r.AppendLine();
              }

              return r.ToString();
        }