@@ -54,7 +54,7 @@ uint64_t GPU_fdinfo::get_gpu_time()
54
54
return total_val;
55
55
}
56
56
57
- float GPU_fdinfo::get_vram_usage ()
57
+ float GPU_fdinfo::get_memory_used ()
58
58
{
59
59
uint64_t total_val = 0 ;
60
60
@@ -108,7 +108,7 @@ void GPU_fdinfo::find_intel_hwmon()
108
108
SPDLOG_DEBUG (" Intel hwmon: failed to open {}" , hwmon);
109
109
}
110
110
111
- float GPU_fdinfo::get_power_usage ()
111
+ float GPU_fdinfo::get_current_power ()
112
112
{
113
113
if (!energy_stream.is_open ())
114
114
return 0 .f ;
@@ -128,40 +128,51 @@ float GPU_fdinfo::get_power_usage()
128
128
return (float )energy_input / 1'000'000 ;
129
129
}
130
130
131
- void GPU_fdinfo::get_load ()
131
+ float GPU_fdinfo::get_power_usage ()
132
132
{
133
- while (!stop_thread) {
134
- std::unique_lock<std::mutex> lock (metrics_mutex);
135
- cond_var.wait (lock, [this ]() { return !paused || stop_thread; });
133
+ static float last;
134
+ float now = get_current_power ();
136
135
137
- static uint64_t previous_gpu_time, previous_time, now, gpu_time_now ;
138
- static float power_usage_now, previous_power_usage ;
136
+ float delta = now - last ;
137
+ delta /= ( float )METRICS_UPDATE_PERIOD_MS / 1000 ;
139
138
140
- now = os_time_get_nano ();
141
- gpu_time_now = get_gpu_time ();
142
- power_usage_now = get_power_usage ();
139
+ last = now;
143
140
144
- if (gpu_time_now > previous_gpu_time) {
145
- float time_since_last = now - previous_time;
146
- float gpu_since_last = gpu_time_now - previous_gpu_time;
147
- float power_usage_since_last =
148
- (power_usage_now - previous_power_usage) /
149
- ((float )METRICS_UPDATE_PERIOD_MS / 1000 );
141
+ return delta;
142
+ }
150
143
151
- auto result = int ((gpu_since_last / time_since_last) * 100 );
152
- if (result > 100 )
153
- result = 100 ;
144
+ int GPU_fdinfo::get_gpu_load ()
145
+ {
146
+ static uint64_t previous_gpu_time, previous_time ;
154
147
155
- metrics.load = result;
156
- metrics.memoryUsed = get_vram_usage ();
157
- metrics.powerUsage = power_usage_since_last;
148
+ uint64_t now = os_time_get_nano ();
149
+ uint64_t gpu_time_now = get_gpu_time ();
158
150
159
- previous_gpu_time = gpu_time_now;
160
- previous_power_usage = power_usage_now;
161
- }
151
+ float delta_time = now - previous_time;
152
+ float delta_gpu_time = gpu_time_now - previous_gpu_time;
153
+
154
+ int result = std::lround (delta_gpu_time / delta_time * 100 );
155
+
156
+ if (result > 100 )
157
+ result = 100 ;
158
+
159
+ previous_gpu_time = gpu_time_now;
160
+ previous_time = now;
161
+
162
+ return result;
163
+ }
164
+
165
+ void GPU_fdinfo::main_thread ()
166
+ {
167
+ while (!stop_thread) {
168
+ std::unique_lock<std::mutex> lock (metrics_mutex);
169
+ cond_var.wait (lock, [this ]() { return !paused || stop_thread; });
170
+
171
+ metrics.load = get_gpu_load ();
172
+ metrics.memoryUsed = get_memory_used ();
173
+ metrics.powerUsage = get_power_usage ();
162
174
163
175
std::this_thread::sleep_for (
164
- std::chrono::milliseconds (METRICS_UPDATE_PERIOD_MS)
165
- );
176
+ std::chrono::milliseconds (METRICS_UPDATE_PERIOD_MS));
166
177
}
167
178
}
0 commit comments