void CNvidia::MakeAdapterActivity() { int iResult; if (NvAPI_GPU_GetThermalSettings(m_nvGPUHandle, 0, &m_settings) != NVAPI_OK) m_CoreTemperature = 0; else m_CoreTemperature = m_settings.sensor[0].currentTemp; if (NvAPI_GPU_GetTachReading(m_nvGPUHandle, static_cast<NvU32*>(&m_FanSpeed)) != NVAPI_OK) m_FanSpeed = 0; iResult = NvAPI_GPU_GetAllClockFrequencies(m_nvGPUHandle, &m_clkFreqs); if (iResult != NVAPI_OK) { m_CoreClock = 0; m_MemoryClock = 0; } else { m_CoreClock = (DWORD)(m_clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency / 1000); m_MemoryClock = (DWORD)(m_clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000); } if (m_MaxCoreTemperature < m_CoreTemperature) m_MaxCoreTemperature = m_CoreTemperature; if (m_MaxCoreClock < m_CoreClock) m_MaxCoreClock = m_CoreClock; if (m_MaxMemoryClock < m_MemoryClock) m_MaxMemoryClock = m_MemoryClock; if (m_MaxFanSpeed < m_FanSpeed) m_MaxFanSpeed = m_FanSpeed; }
VOID NvGpuUpdateValues(VOID) { NV_USAGES_INFO usagesInfo = { NV_USAGES_INFO_VER }; NV_DISPLAY_DRIVER_MEMORY_INFO memoryInfo = { NV_DISPLAY_DRIVER_MEMORY_INFO_VER }; NV_GPU_THERMAL_SETTINGS thermalSettings = { NV_GPU_THERMAL_SETTINGS_VER }; NV_GPU_CLOCK_FREQUENCIES clkFreqs = { NV_GPU_CLOCK_FREQUENCIES_VER }; NV_CLOCKS_INFO clocksInfo = { NV_CLOCKS_INFO_VER }; if (NvAPI_GPU_GetMemoryInfo(NvGpuDisplayHandleList->Items[0], &memoryInfo) == NVAPI_OK) { GpuMemoryLimit = memoryInfo.availableDedicatedVideoMemory; GpuCurrentMemSharedUsage = memoryInfo.sharedSystemMemory; GpuCurrentMemUsage = memoryInfo.availableDedicatedVideoMemory - memoryInfo.curAvailableDedicatedVideoMemory; } if (NvAPI_GPU_GetUsages(NvGpuPhysicalHandleList->Items[0], &usagesInfo) == NVAPI_OK) { GpuCurrentGpuUsage = (FLOAT)usagesInfo.usages[2] / 100; GpuCurrentCoreUsage = (FLOAT)usagesInfo.usages[6] / 100; GpuCurrentBusUsage = (FLOAT)usagesInfo.usages[14] / 100; } if (NvAPI_GPU_GetThermalSettings(NvGpuPhysicalHandleList->Items[0], NVAPI_THERMAL_TARGET_ALL, &thermalSettings) == NVAPI_OK) { GpuCurrentCoreTemp = thermalSettings.sensor[0].currentTemp; GpuCurrentBoardTemp = thermalSettings.sensor[1].currentTemp; } if (NvAPI_GPU_GetAllClockFrequencies(NvGpuPhysicalHandleList->Items[0], &clkFreqs) == NVAPI_OK) { //if (clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].bIsPresent) GpuCurrentCoreClock = clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency / 1000; //if (clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].bIsPresent) GpuCurrentMemoryClock = clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000; //if (clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_PROCESSOR].bIsPresent) GpuCurrentShaderClock = clkFreqs.domain[NVAPI_GPU_PUBLIC_CLOCK_PROCESSOR].frequency / 1000; } if (NvAPI_GPU_GetAllClocks(NvGpuPhysicalHandleList->Items[0], &clocksInfo) == NVAPI_OK) { if (GpuCurrentCoreClock == 0) GpuCurrentCoreClock = clocksInfo.clocks[0] / 1000; if (GpuCurrentMemoryClock == 0) GpuCurrentMemoryClock = clocksInfo.clocks[1] / 1000; if (GpuCurrentShaderClock == 0) GpuCurrentShaderClock = clocksInfo.clocks[2] / 1000; if (clocksInfo.clocks[30] != 0) { if (GpuCurrentCoreClock == 0) GpuCurrentCoreClock = (ULONG)(clocksInfo.clocks[30] * 0.0005f); if (GpuCurrentShaderClock == 0) GpuCurrentShaderClock = (ULONG)(clocksInfo.clocks[30] * 0.001f); } } }
void NvidiaGPUService::ObtainGPUs() { NvPhysicalGpuHandle hPhysicalGpu[NVAPI_MAX_PHYSICAL_GPUS]; NvU32 physicalGpuCount = 0; NvAPI_Status ret = NvAPI_EnumPhysicalGPUs(hPhysicalGpu, &physicalGpuCount); m_GPUs.New(physicalGpuCount); for (NvU32 i = 0; i < physicalGpuCount; ++i) { m_GPUs[i].m_AvailableValues.Resize(9); for(auto j = 0; j < m_GPUs[i].m_AvailableValues.Count(); ++j) { m_GPUs[i].m_AvailableValues(j) = false; } m_GPUs[i].m_MaxValues.Resize(9); m_GPUs[i].m_MinValues.Resize(9); m_GPUs[i].m_Values.Resize(9); m_GPUs[i].m_AdapterId = hPhysicalGpu[i]; m_GPUs[i].m_AvailableValues(GPUService::FanSpeedPercentage) = false; m_GPUs[i].m_MaxValues(GPUService::FanSpeedPercentage) = 1; m_GPUs[i].m_MinValues(GPUService::FanSpeedPercentage) = 0; NvU32 tach = 0; if(NvAPI_GPU_GetTachReading(m_GPUs[i].m_AdapterId, &tach) == NVAPI_OK) { m_GPUs[i].m_AvailableValues(GPUService::FanSpeedRPM) = true; m_GPUs[i].m_MaxValues(GPUService::FanSpeedRPM) = 1; m_GPUs[i].m_MinValues(GPUService::FanSpeedRPM) = 0; } NV_GPU_THERMAL_SETTINGS thermal = {0}; thermal.version = NV_GPU_THERMAL_SETTINGS_VER; thermal.sensor[0].target = NVAPI_THERMAL_TARGET_GPU; thermal.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_GPU_INTERNAL; if(NvAPI_GPU_GetThermalSettings(m_GPUs[i].m_AdapterId, NVAPI_THERMAL_TARGET_NONE, &thermal) == NVAPI_OK) { m_GPUs[i].m_AvailableValues(GPUService::GPUTemperature) = true; m_GPUs[i].m_MaxValues(GPUService::GPUTemperature) = thermal.sensor[0].defaultMaxTemp; m_GPUs[i].m_MinValues(GPUService::GPUTemperature) = thermal.sensor[0].defaultMinTemp; } NvU32 lanes; if(NvAPI_GPU_GetCurrentPCIEDownstreamWidth(m_GPUs[i].m_AdapterId, &lanes) == NVAPI_OK) { m_GPUs[i].m_AvailableValues(GPUService::Lanes) = true; m_GPUs[i].m_MaxValues(GPUService::Lanes) = 16; m_GPUs[i].m_MinValues(GPUService::Lanes) = 0; m_GPUs[i].m_Values(GPUService::Lanes) = lanes; } NV_GPU_CLOCK_FREQUENCIES_V2 clkFreq = {0}; clkFreq.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ; clkFreq.version = NV_GPU_CLOCK_FREQUENCIES_VER; if(NvAPI_GPU_GetAllClockFrequencies(m_GPUs[i].m_AdapterId, &clkFreq) == NVAPI_OK) { m_GPUs[i].m_AvailableValues(GPUService::MemoryClock) = clkFreq.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].bIsPresent; m_GPUs[i].m_MaxValues(GPUService::MemoryClock) = 1; m_GPUs[i].m_MinValues(GPUService::MemoryClock) = 0; m_GPUs[i].m_AvailableValues(GPUService::CoreClock) = clkFreq.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].bIsPresent; m_GPUs[i].m_MaxValues(GPUService::CoreClock) = 1; m_GPUs[i].m_MinValues(GPUService::CoreClock) = 0; } NV_GPU_DYNAMIC_PSTATES_INFO_EX states = {0}; states.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER; if(NvAPI_GPU_GetDynamicPstatesInfoEx(m_GPUs[i].m_AdapterId, &states) == NVAPI_OK) { m_GPUs[i].m_AvailableValues(GPUService::GPUActivity) = states.utilization[0].bIsPresent; m_GPUs[i].m_MaxValues(GPUService::GPUActivity) = 1; m_GPUs[i].m_MinValues(GPUService::GPUActivity) = 0; } m_GPUs[i].m_AvailableValues(GPUService::BusSpeed) = false; m_GPUs[i].m_MaxValues(GPUService::BusSpeed) = 1; m_GPUs[i].m_MinValues(GPUService::BusSpeed) = 0; } }
void NvidiaGPUService::Update(const RF_Type::Size GPUIndex) { if(m_GPUs.Count() > 0 && GPUIndex < m_GPUs.Count()) { if(m_GPUs[GPUIndex].m_AvailableValues(GPUService::FanSpeedRPM)) { NvU32 tach = 0; if(NvAPI_GPU_GetTachReading(m_GPUs[GPUIndex].m_AdapterId, &tach) == NVAPI_OK) { m_GPUs[GPUIndex].m_Values(GPUService::FanSpeedRPM) = tach; } } if(m_GPUs[GPUIndex].m_AvailableValues(GPUService::GPUTemperature)) { NV_GPU_THERMAL_SETTINGS thermal = {0}; thermal.version = NV_GPU_THERMAL_SETTINGS_VER; thermal.sensor[0].target = NVAPI_THERMAL_TARGET_GPU; thermal.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_GPU_INTERNAL; if(NvAPI_GPU_GetThermalSettings(m_GPUs[GPUIndex].m_AdapterId, NVAPI_THERMAL_TARGET_NONE, &thermal) == NVAPI_OK) { m_GPUs[GPUIndex].m_Values(GPUService::GPUTemperature) = thermal.sensor[0].currentTemp; } } if(m_GPUs[GPUIndex].m_AvailableValues(GPUService::Lanes)) { NvU32 lanes; if(NvAPI_GPU_GetCurrentPCIEDownstreamWidth(m_GPUs[GPUIndex].m_AdapterId, &lanes) == NVAPI_OK) { m_GPUs[GPUIndex].m_Values(GPUService::Lanes) = lanes; } } if(m_GPUs[GPUIndex].m_AvailableValues(GPUService::MemoryClock)) { NV_GPU_CLOCK_FREQUENCIES_V2 clkFreq = {0}; clkFreq.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ; clkFreq.version = NV_GPU_CLOCK_FREQUENCIES_VER; if(NvAPI_GPU_GetAllClockFrequencies(m_GPUs[GPUIndex].m_AdapterId, &clkFreq) == NVAPI_OK) { m_GPUs[GPUIndex].m_Values(GPUService::MemoryClock) = clkFreq.domain[NVAPI_GPU_PUBLIC_CLOCK_MEMORY].frequency / 1000; } } if(m_GPUs[GPUIndex].m_AvailableValues(GPUService::CoreClock)) { NV_GPU_CLOCK_FREQUENCIES_V2 clkFreq = {0}; clkFreq.ClockType = NV_GPU_CLOCK_FREQUENCIES_CURRENT_FREQ; clkFreq.version = NV_GPU_CLOCK_FREQUENCIES_VER; if(NvAPI_GPU_GetAllClockFrequencies(m_GPUs[GPUIndex].m_AdapterId, &clkFreq) == NVAPI_OK) { m_GPUs[GPUIndex].m_Values(GPUService::CoreClock) = clkFreq.domain[NVAPI_GPU_PUBLIC_CLOCK_GRAPHICS].frequency/1000; } } if(m_GPUs[GPUIndex].m_AvailableValues(GPUService::GPUActivity)) { NV_GPU_DYNAMIC_PSTATES_INFO_EX states = {0}; states.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER; if(NvAPI_GPU_GetDynamicPstatesInfoEx(m_GPUs[GPUIndex].m_AdapterId, &states) == NVAPI_OK) { m_GPUs[GPUIndex].m_Values(GPUService::GPUActivity) = states.utilization[0].percentage / 100.0f; } } } }