@@ -108,30 +108,71 @@ float GPU_fdinfo::get_vram_usage() {
108
108
return (float )total_val / 1024 / 1024 ;
109
109
}
110
110
111
+ void GPU_fdinfo::find_intel_hwmon () {
112
+ std::string device = " /sys/bus/pci/devices/" ;
113
+ device += pci_dev;
114
+ device += " /hwmon" ;
115
+
116
+ auto dir_iterator = fs::directory_iterator (device);
117
+ auto hwmon = dir_iterator->path ().string ();
118
+
119
+ if (hwmon.empty ()) {
120
+ SPDLOG_DEBUG (" Intel hwmon directory is empty." );
121
+ return ;
122
+ }
123
+
124
+ hwmon += " /energy1_input" ;
125
+
126
+ SPDLOG_DEBUG (" Intel hwmon found: hwmon = {}" , hwmon);
127
+ energy_stream.open (hwmon);
128
+
129
+ if (!energy_stream.good ())
130
+ SPDLOG_DEBUG (" Intel hwmon: failed to open {}" , hwmon);
131
+ }
132
+
133
+ float GPU_fdinfo::get_power_usage () {
134
+ if (!energy_stream.is_open ())
135
+ return 0 .f ;
136
+
137
+ std::string energy_input_str;
138
+ uint64_t energy_input;
139
+
140
+ energy_stream.seekg (0 );
141
+ std::getline (energy_stream, energy_input_str);
142
+ energy_input = std::stoull (energy_input_str);
143
+
144
+ return energy_input / 1'000'000 ;
145
+ }
146
+
111
147
void GPU_fdinfo::get_load () {
112
148
while (!stop_thread) {
113
149
std::unique_lock<std::mutex> lock (metrics_mutex);
114
150
cond_var.wait (lock, [this ]() { return !paused || stop_thread; });
115
151
116
152
static uint64_t previous_gpu_time, previous_time, now, gpu_time_now;
153
+ static float power_usage_now, previous_power_usage;
117
154
118
155
gpu_time_now = get_gpu_time ();
156
+ power_usage_now = get_power_usage ();
119
157
now = os_time_get_nano ();
120
158
121
159
if (gpu_time_now > previous_gpu_time &&
122
160
now - previous_time > METRICS_UPDATE_PERIOD_MS * 1'000'000 ) {
123
161
float time_since_last = now - previous_time;
124
162
float gpu_since_last = gpu_time_now - previous_gpu_time;
163
+ float power_usage_since_last = power_usage_now - previous_power_usage;
125
164
126
165
auto result = int ((gpu_since_last / time_since_last) * 100 );
127
166
if (result > 100 )
128
167
result = 100 ;
129
168
130
169
metrics.load = result;
131
170
metrics.memoryUsed = get_vram_usage ();
171
+ metrics.powerUsage = power_usage_since_last;
132
172
133
173
previous_gpu_time = gpu_time_now;
134
174
previous_time = now;
175
+ previous_power_usage = power_usage_now;
135
176
}
136
177
}
137
178
}
0 commit comments