Skip to content

Commit 7a15b01

Browse files
committed
fanspeed percent
1 parent 0f7e2d3 commit 7a15b01

File tree

8 files changed

+118
-45
lines changed

8 files changed

+118
-45
lines changed

IntelPresentMon/ControlLib/IntelPowerTelemetryAdapter.cpp

Lines changed: 62 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,60 @@ namespace vi = std::views;
1414

1515
namespace pwr::intel
1616
{
17+
namespace {
18+
GpuTelemetryCapBits GetFanSpeedTelemetryCapBit_(
19+
uint32_t fan_index) {
20+
switch (fan_index) {
21+
case 0:
22+
return GpuTelemetryCapBits::fan_speed_0;
23+
case 1:
24+
return GpuTelemetryCapBits::fan_speed_1;
25+
case 2:
26+
return GpuTelemetryCapBits::fan_speed_2;
27+
case 3:
28+
return GpuTelemetryCapBits::fan_speed_3;
29+
case 4:
30+
return GpuTelemetryCapBits::fan_speed_4;
31+
default:
32+
throw std::runtime_error{ "Invalid fan speed index" };
33+
}
34+
}
35+
GpuTelemetryCapBits GetPsuTelemetryCapBit_(
36+
uint32_t psu_index) {
37+
switch (psu_index) {
38+
case 0:
39+
return GpuTelemetryCapBits::psu_info_0;
40+
case 1:
41+
return GpuTelemetryCapBits::psu_info_1;
42+
case 2:
43+
return GpuTelemetryCapBits::psu_info_2;
44+
case 3:
45+
return GpuTelemetryCapBits::psu_info_3;
46+
case 4:
47+
return GpuTelemetryCapBits::psu_info_4;
48+
default:
49+
throw std::runtime_error{ "Invalid PSU index" };
50+
}
51+
}
52+
GpuTelemetryCapBits GetMaxFanSpeedTelemetryCapBit_(
53+
uint32_t index) {
54+
switch (index) {
55+
case 0:
56+
return GpuTelemetryCapBits::max_fan_speed_0;
57+
case 1:
58+
return GpuTelemetryCapBits::max_fan_speed_1;
59+
case 2:
60+
return GpuTelemetryCapBits::max_fan_speed_2;
61+
case 3:
62+
return GpuTelemetryCapBits::max_fan_speed_3;
63+
case 4:
64+
return GpuTelemetryCapBits::max_fan_speed_4;
65+
default:
66+
throw std::runtime_error{ "Invalid max fan speed index" };
67+
}
68+
}
69+
}
70+
1771
// public interface functions
1872

1973
IntelPowerTelemetryAdapter::IntelPowerTelemetryAdapter(ctl_device_adapter_handle_t handle)
@@ -717,15 +771,18 @@ namespace pwr::intel
717771
ctl_result_t result = CTL_RESULT_SUCCESS;
718772

719773
for (uint32_t i = 0; i < CTL_FAN_COUNT; i++) {
720-
GpuTelemetryCapBits fan_telemetry_bit;
721774
try {
722-
fan_telemetry_bit = GetFlagTelemetryCapBit(i);
775+
const auto fanSpeedCapBit = GetFanSpeedTelemetryCapBit_(i);
723776
result = GetInstantaneousPowerTelemetryItem(
724777
currentSample.fanSpeed[i],
725778
pm_gpu_power_telemetry_info.fan_speed_rpm[i],
726-
fan_telemetry_bit);
779+
fanSpeedCapBit);
727780
if (result != CTL_RESULT_SUCCESS) {
728-
break;
781+
break;
782+
}
783+
if (HasTelemetryCapBit(fanSpeedCapBit) && maxFanSpeedsRpm_[i] > 0) {
784+
SetTelemetryCapBit(GetMaxFanSpeedTelemetryCapBit_(i));
785+
pm_gpu_power_telemetry_info.max_fan_speed_rpm[i] = maxFanSpeedsRpm_[i];
729786
}
730787
} catch (...) {
731788
result = CTL_RESULT_ERROR_INVALID_ARGUMENT;
@@ -751,7 +808,7 @@ namespace pwr::intel
751808
if (currentSample.psu[i].bSupported) {
752809
GpuTelemetryCapBits psu_telemetry_bit;
753810
try {
754-
psu_telemetry_bit = GetPsuTelemetryCapBit(i);
811+
psu_telemetry_bit = GetPsuTelemetryCapBit_(i);
755812
pm_gpu_power_telemetry_info.psu[i].psu_type =
756813
PresentMonPsuType(currentSample.psu[i].psuType);
757814
result = GetInstantaneousPowerTelemetryItem(
@@ -917,40 +974,4 @@ namespace pwr::intel
917974
history.Push(info);
918975
}
919976

920-
GpuTelemetryCapBits IntelPowerTelemetryAdapter::GetFlagTelemetryCapBit(
921-
uint32_t fan_index) {
922-
switch (fan_index) {
923-
case 0:
924-
return GpuTelemetryCapBits::fan_speed_0;
925-
case 1:
926-
return GpuTelemetryCapBits::fan_speed_1;
927-
case 2:
928-
return GpuTelemetryCapBits::fan_speed_2;
929-
case 3:
930-
return GpuTelemetryCapBits::fan_speed_3;
931-
case 4:
932-
return GpuTelemetryCapBits::fan_speed_4;
933-
default:
934-
throw std::runtime_error{"Invalid fan index"};
935-
}
936-
}
937-
938-
GpuTelemetryCapBits IntelPowerTelemetryAdapter::GetPsuTelemetryCapBit(
939-
uint32_t psu_index) {
940-
switch (psu_index) {
941-
case 0:
942-
return GpuTelemetryCapBits::psu_info_0;
943-
case 1:
944-
return GpuTelemetryCapBits::psu_info_1;
945-
case 2:
946-
return GpuTelemetryCapBits::psu_info_2;
947-
case 3:
948-
return GpuTelemetryCapBits::psu_info_3;
949-
case 4:
950-
return GpuTelemetryCapBits::psu_info_4;
951-
default:
952-
throw std::runtime_error{"Invalid PSU index"};
953-
}
954-
}
955-
956977
}

IntelPresentMon/ControlLib/IntelPowerTelemetryAdapter.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,6 @@ namespace pwr::intel
9090
const ctl_oc_telemetry_item_t& previous_telemetry_item,
9191
double& pm_telemetry_value,
9292
GpuTelemetryCapBits telemetry_cap_bit);
93-
GpuTelemetryCapBits GetFlagTelemetryCapBit(uint32_t fan_index);
94-
GpuTelemetryCapBits GetPsuTelemetryCapBit(uint32_t psu_index);
9593
// data
9694
ctl_device_adapter_handle_t deviceHandle = nullptr;
9795
LUID deviceId; // pointed to by a device_adapter_properties member, written to by igcl api

IntelPresentMon/ControlLib/PresentMonPowerTelemetry.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct PresentMonPowerTelemetryInfo {
4646
double vram_temperature_c;
4747

4848
std::array<double, 5> fan_speed_rpm;
49+
std::array<int32_t, 5> max_fan_speed_rpm;
4950
std::array<PresentMonPsuPowerTelemetryInfo, 5> psu;
5051

5152
// GPU memory state
@@ -117,6 +118,11 @@ enum class GpuTelemetryCapBits {
117118
gpu_overvoltage_percent,
118119
gpu_temperature_percent,
119120
gpu_power_percent,
121+
max_fan_speed_0,
122+
max_fan_speed_1,
123+
max_fan_speed_2,
124+
max_fan_speed_3,
125+
max_fan_speed_4,
120126
gpu_telemetry_count,
121127
};
122128

IntelPresentMon/Interprocess/source/IntrospectionCapsLookup.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ namespace pmon::ipc::intro
3333
static constexpr auto gpuCapBitArray = std::array{ GpuTelemetryCapBits::fan_speed_0, GpuTelemetryCapBits::fan_speed_1,
3434
GpuTelemetryCapBits::fan_speed_2, GpuTelemetryCapBits::fan_speed_3, GpuTelemetryCapBits::fan_speed_4, };
3535
};
36+
template<> struct IntrospectionCapsLookup<PM_METRIC_GPU_FAN_SPEED_PERCENT> {
37+
static constexpr auto gpuCapBitArray = std::array{ GpuTelemetryCapBits::max_fan_speed_0, GpuTelemetryCapBits::max_fan_speed_1,
38+
GpuTelemetryCapBits::max_fan_speed_2, GpuTelemetryCapBits::max_fan_speed_3, GpuTelemetryCapBits::max_fan_speed_4, };
39+
};
3640
//template<> struct IntrospectionCapsLookup<PM_METRIC_PSU_METRIC_NAME_HERE> { static constexpr auto gpuCapBitArray = std::array{
3741
// GpuTelemetryCapBits::psu_info_0, GpuTelemetryCapBits::psu_info_1, GpuTelemetryCapBits::psu_info_2, GpuTelemetryCapBits::psu_info_3, GpuTelemetryCapBits::psu_info_4, }; };
3842
template<> struct IntrospectionCapsLookup<PM_METRIC_GPU_MEM_SIZE> { static constexpr auto gpuCapBit = GpuTelemetryCapBits::gpu_mem_size; };

IntelPresentMon/Interprocess/source/metadata/MetricList.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,5 @@
9393
X_(PM_METRIC_GPU_MEM_EFFECTIVE_BANDWIDTH, PM_METRIC_TYPE_DYNAMIC_FRAME, PM_UNIT_GIGABITS_PER_SECOND, PM_DATA_TYPE_DOUBLE, PM_DATA_TYPE_DOUBLE, 0, PM_DEVICE_TYPE_GRAPHICS_ADAPTER, FULL_STATS) \
9494
X_(PM_METRIC_GPU_OVERVOLTAGE_PERCENT, PM_METRIC_TYPE_DYNAMIC_FRAME, PM_UNIT_PERCENT, PM_DATA_TYPE_DOUBLE, PM_DATA_TYPE_DOUBLE, 0, PM_DEVICE_TYPE_GRAPHICS_ADAPTER, FULL_STATS) \
9595
X_(PM_METRIC_GPU_TEMPERATURE_PERCENT, PM_METRIC_TYPE_DYNAMIC_FRAME, PM_UNIT_PERCENT, PM_DATA_TYPE_DOUBLE, PM_DATA_TYPE_DOUBLE, 0, PM_DEVICE_TYPE_GRAPHICS_ADAPTER, FULL_STATS) \
96-
X_(PM_METRIC_GPU_POWER_PERCENT, PM_METRIC_TYPE_DYNAMIC_FRAME, PM_UNIT_PERCENT, PM_DATA_TYPE_DOUBLE, PM_DATA_TYPE_DOUBLE, 0, PM_DEVICE_TYPE_GRAPHICS_ADAPTER, FULL_STATS)
96+
X_(PM_METRIC_GPU_POWER_PERCENT, PM_METRIC_TYPE_DYNAMIC_FRAME, PM_UNIT_PERCENT, PM_DATA_TYPE_DOUBLE, PM_DATA_TYPE_DOUBLE, 0, PM_DEVICE_TYPE_GRAPHICS_ADAPTER, FULL_STATS) \
97+
X_(PM_METRIC_GPU_FAN_SPEED_PERCENT, PM_METRIC_TYPE_DYNAMIC_FRAME, PM_UNIT_PERCENT, PM_DATA_TYPE_DOUBLE, PM_DATA_TYPE_DOUBLE, 0, PM_DEVICE_TYPE_GRAPHICS_ADAPTER, FULL_STATS)

IntelPresentMon/PresentMonAPI2/PresentMonAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ extern "C" {
130130
PM_METRIC_GPU_OVERVOLTAGE_PERCENT,
131131
PM_METRIC_GPU_TEMPERATURE_PERCENT,
132132
PM_METRIC_GPU_POWER_PERCENT,
133+
PM_METRIC_GPU_FAN_SPEED_PERCENT,
133134
};
134135

135136
enum PM_METRIC_TYPE

IntelPresentMon/PresentMonMiddleware/ConcreteMiddleware.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,26 @@ namespace pmon::mid
391391
break;
392392
}
393393
break;
394+
case PM_METRIC_GPU_FAN_SPEED_PERCENT:
395+
switch (qe.arrayIndex)
396+
{
397+
case 0:
398+
pQuery->accumGpuBits.set(static_cast<size_t>(GpuTelemetryCapBits::max_fan_speed_0));
399+
break;
400+
case 1:
401+
pQuery->accumGpuBits.set(static_cast<size_t>(GpuTelemetryCapBits::max_fan_speed_1));
402+
break;
403+
case 2:
404+
pQuery->accumGpuBits.set(static_cast<size_t>(GpuTelemetryCapBits::max_fan_speed_2));
405+
break;
406+
case 3:
407+
pQuery->accumGpuBits.set(static_cast<size_t>(GpuTelemetryCapBits::max_fan_speed_3));
408+
break;
409+
case 4:
410+
pQuery->accumGpuBits.set(static_cast<size_t>(GpuTelemetryCapBits::max_fan_speed_4));
411+
break;
412+
}
413+
break;
394414
case PM_METRIC_GPU_EFFECTIVE_FREQUENCY:
395415
pQuery->accumGpuBits.set(static_cast<size_t>(GpuTelemetryCapBits::gpu_effective_frequency));
396416
break;
@@ -1534,6 +1554,26 @@ static void ReportMetrics(
15341554
case GpuTelemetryCapBits::fan_speed_4:
15351555
metricInfo[PM_METRIC_GPU_FAN_SPEED].data[4].emplace_back(power_telemetry_info.fan_speed_rpm[4]);
15361556
break;
1557+
case GpuTelemetryCapBits::max_fan_speed_0:
1558+
metricInfo[PM_METRIC_GPU_FAN_SPEED_PERCENT].data[0].emplace_back(
1559+
power_telemetry_info.fan_speed_rpm[0] / double(power_telemetry_info.max_fan_speed_rpm[0]));
1560+
break;
1561+
case GpuTelemetryCapBits::max_fan_speed_1:
1562+
metricInfo[PM_METRIC_GPU_FAN_SPEED_PERCENT].data[1].emplace_back(
1563+
power_telemetry_info.fan_speed_rpm[0] / double(power_telemetry_info.max_fan_speed_rpm[1]));
1564+
break;
1565+
case GpuTelemetryCapBits::max_fan_speed_2:
1566+
metricInfo[PM_METRIC_GPU_FAN_SPEED_PERCENT].data[2].emplace_back(
1567+
power_telemetry_info.fan_speed_rpm[0] / double(power_telemetry_info.max_fan_speed_rpm[2]));
1568+
break;
1569+
case GpuTelemetryCapBits::max_fan_speed_3:
1570+
metricInfo[PM_METRIC_GPU_FAN_SPEED_PERCENT].data[3].emplace_back(
1571+
power_telemetry_info.fan_speed_rpm[0] / double(power_telemetry_info.max_fan_speed_rpm[3]));
1572+
break;
1573+
case GpuTelemetryCapBits::max_fan_speed_4:
1574+
metricInfo[PM_METRIC_GPU_FAN_SPEED_PERCENT].data[4].emplace_back(
1575+
power_telemetry_info.fan_speed_rpm[0] / double(power_telemetry_info.max_fan_speed_rpm[4]));
1576+
break;
15371577
case GpuTelemetryCapBits::gpu_mem_used:
15381578
metricInfo[PM_METRIC_GPU_MEM_USED].data[0].emplace_back(static_cast<double>(power_telemetry_info.gpu_mem_used_b));
15391579
break;
@@ -1810,6 +1850,7 @@ static void ReportMetrics(
18101850
{
18111851
case PM_METRIC_GPU_POWER:
18121852
case PM_METRIC_GPU_FAN_SPEED:
1853+
case PM_METRIC_GPU_FAN_SPEED_PERCENT:
18131854
case PM_METRIC_GPU_VOLTAGE:
18141855
case PM_METRIC_GPU_FREQUENCY:
18151856
case PM_METRIC_GPU_TEMPERATURE:

IntelPresentMon/metrics.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,5 @@ PM_METRIC_GPU_VOLTAGE_REGULATOR_TEMPERATURE,1,GPU Voltage Regulator Temperature,
8888
PM_METRIC_GPU_MEM_EFFECTIVE_BANDWIDTH,1,GPU Memory Effective Bandwidth,Data transfer rate that the memory modules can sustain based on current clock frequency.
8989
PM_METRIC_GPU_OVERVOLTAGE_PERCENT,1,GPU Overvoltage Percent,GPU overvoltage increment as a ratio of the maximum increment.
9090
PM_METRIC_GPU_TEMPERATURE_PERCENT,1,GPU Temperature Percent,GPU temperature as a ratio of the thermal margin.
91-
PM_METRIC_GPU_POWER_PERCENT,1,GPU Power Percent,GPU power draw as a ratio of default maximum power.
91+
PM_METRIC_GPU_POWER_PERCENT,1,GPU Power Percent,GPU power draw as a ratio of default maximum power.
92+
PM_METRIC_GPU_FAN_SPEED_PERCENT,1,GPU Fan Speed Percent,GPU fan speed as a ratio of the max speed for that fan.

0 commit comments

Comments
 (0)