Skip to content

Commit 6978ee2

Browse files
17314642retrixe
andcommitted
gpu_fdinfo: calculate xe fd load separately
I wrote an explanation down below why current method is the correct one. But really, you can ignore that, because I have a better reason. Because Intel's engineers do like this in their gputop program. So I just copied them, because they know better. https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/blob/master/tools/gputop.c#L249 ======================================================================== Currently xe load is calculated like this: sum_of_all_deltas_cycles / sum_of_all_deltas_total_cycles This is fine as long as you have on fd open. But if not, this will lead to incorrect results. Imagine this scenario: fd1: delta_cycles = 3152315 delta_total_cycles = 9611144 fd_load = 0.327985409 = 33% fd2: delta_cycles = 1132858 delta_total_cycles = 9607938 fd_load = 0.117908546 = 12% Total load: 33 + 12 = 45% If you calculated this the old way, you would get: (3152315 / 1132858) / (9611144 / 9607938) = 0.2229645 = 22% Co-authored-by: Ibrahim Ansari <ansari.ibrahim1@gmail.com>
1 parent 2a0ed4f commit 6978ee2

File tree

2 files changed

+23
-47
lines changed

2 files changed

+23
-47
lines changed

src/gpu_fdinfo.cpp

+22-46
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,6 @@ void GPU_fdinfo::find_fd()
6161
void GPU_fdinfo::open_fdinfo_fd(std::string path) {
6262
fdinfo.push_back(std::ifstream(path));
6363
fdinfo_data.push_back({});
64-
65-
if (module == "xe")
66-
xe_fdinfo_last_cycles.push_back(0);
6764
}
6865

6966
void GPU_fdinfo::gather_fdinfo_data() {
@@ -181,68 +178,47 @@ float GPU_fdinfo::get_power_usage()
181178
return delta;
182179
}
183180

184-
std::pair<uint64_t, uint64_t> GPU_fdinfo::get_gpu_time_xe()
181+
int GPU_fdinfo::get_xe_load()
185182
{
186-
uint64_t total_cycles = 0, total_total_cycles = 0;
183+
double load = 0;
187184

188-
size_t idx = -1;
189185
for (auto& fd : fdinfo_data) {
190-
idx++;
186+
std::string client_id = fd["drm-client-id"];
187+
std::string cur_cycles_str = fd["drm-cycles-rcs"];
188+
std::string cur_total_cycles_str = fd["drm-total-cycles-rcs"];
191189

192-
auto cur_cycles_str = fd["drm-cycles-rcs"];
193-
auto cur_total_cycles_str = fd["drm-total-cycles-rcs"];
194-
195-
if (cur_cycles_str.empty() || cur_total_cycles_str.empty())
190+
if (
191+
client_id.empty() || cur_cycles_str.empty() ||
192+
cur_total_cycles_str.empty()
193+
)
196194
continue;
197195

198196
auto cur_cycles = std::stoull(cur_cycles_str);
199197
auto cur_total_cycles = std::stoull(cur_total_cycles_str);
200198

201-
if (
202-
cur_cycles <= 0 ||
203-
cur_cycles == xe_fdinfo_last_cycles[idx] ||
204-
cur_total_cycles <= 0
205-
)
199+
if (prev_xe_cycles.find(client_id) == prev_xe_cycles.end()) {
200+
prev_xe_cycles[client_id] = { cur_cycles, cur_total_cycles };
206201
continue;
202+
}
207203

208-
total_cycles += cur_cycles;
209-
total_total_cycles += cur_total_cycles;
210-
211-
xe_fdinfo_last_cycles[idx] = cur_cycles;
212-
}
213-
214-
return { total_cycles, total_total_cycles };
215-
}
216-
217-
int GPU_fdinfo::get_xe_load()
218-
{
219-
static uint64_t previous_cycles, previous_total_cycles;
204+
auto prev_cycles = prev_xe_cycles[client_id].first;
205+
auto prev_total_cycles = prev_xe_cycles[client_id].second;
220206

221-
auto gpu_time = get_gpu_time_xe();
222-
uint64_t cycles = gpu_time.first;
223-
uint64_t total_cycles = gpu_time.second;
207+
auto delta_cycles = cur_cycles - prev_cycles;
208+
auto delta_total_cycles = cur_total_cycles - prev_total_cycles;
224209

225-
uint64_t delta_cycles = cycles - previous_cycles;
226-
uint64_t delta_total_cycles = total_cycles - previous_total_cycles;
210+
prev_xe_cycles[client_id] = { cur_cycles, cur_total_cycles };
227211

228-
if (delta_cycles == 0 || delta_total_cycles == 0)
229-
return 0;
212+
if (delta_cycles <= 0 || delta_total_cycles <= 0)
213+
continue;
230214

231-
double load = (double)delta_cycles / delta_total_cycles * 100;
215+
auto fd_load = (double)delta_cycles / delta_total_cycles * 100;
216+
load += fd_load;
217+
}
232218

233219
if (load > 100.f)
234220
load = 100.f;
235221

236-
previous_cycles = cycles;
237-
previous_total_cycles = total_cycles;
238-
239-
// SPDLOG_DEBUG("cycles = {}", cycles);
240-
// SPDLOG_DEBUG("total_cycles = {}", total_cycles);
241-
// SPDLOG_DEBUG("delta_cycles = {}", delta_cycles);
242-
// SPDLOG_DEBUG("delta_total_cycles = {}", delta_total_cycles);
243-
// SPDLOG_DEBUG("{} / {} * 100 = {}", delta_cycles, delta_total_cycles, load);
244-
// SPDLOG_DEBUG("load = {}\n", std::lround(load));
245-
246222
return std::lround(load);
247223
}
248224

src/gpu_fdinfo.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class GPU_fdinfo {
5353
uint64_t previous_gpu_time, previous_time = 0;
5454

5555
std::vector<uint64_t> xe_fdinfo_last_cycles;
56+
std::map<std::string, std::pair<uint64_t, uint64_t>> prev_xe_cycles;
5657
int get_xe_load();
57-
std::pair<uint64_t, uint64_t> get_gpu_time_xe();
5858

5959
float get_memory_used();
6060

0 commit comments

Comments
 (0)