Skip to content

Commit bf7f147

Browse files
committed
add nvidia process list
1 parent d76e2ca commit bf7f147

8 files changed

Lines changed: 390 additions & 57 deletions

File tree

CMakeLists.txt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,21 @@ include(CheckCXXSymbolExists)
103103

104104
check_cxx_source_compiles(
105105
"
106-
#include <version>
107-
#if __cpp_lib_optional < 202110L
108-
#error \"Missing __cpp_lib_optional < 202110L\"
109-
#endif
110-
int main() { return 0; }
106+
#include <optional>
107+
108+
int main() {
109+
std::optional<int> value{1};
110+
auto next = value.and_then([](int v) -> std::optional<int> { return v + 1; });
111+
return next.value_or(0) == 2 ? 0 : 1;
112+
}
111113
"
112114
HAS_CXX_OPTIONAL_MONADS
113115
)
114116
if(NOT HAS_CXX_OPTIONAL_MONADS)
115-
message(FATAL_ERROR "The compiler doesn't support std::optional::and_then")
117+
message(FATAL_ERROR
118+
"The compiler doesn't support std::optional::and_then "
119+
"(${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_VERSION})."
120+
)
116121
endif()
117122
check_cxx_symbol_exists("__cpp_lib_expected" "version" HAS_CXX_EXPECTED)
118123
if(NOT HAS_CXX_EXPECTED)

src/btop_config.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ namespace Config {
104104

105105
{"update_ms", "#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs."},
106106

107-
{"proc_sorting", "#* Processes sorting, \"pid\" \"program\" \"arguments\" \"threads\" \"user\" \"memory\" \"cpu lazy\" \"cpu direct\",\n"
107+
{"proc_sorting", "#* Processes sorting, \"pid\" \"program\" \"arguments\" \"threads\" \"user\" \"memory\" \"gpu\" \"gpu memory\" \"cpu lazy\" \"cpu direct\",\n"
108108
"#* \"cpu lazy\" sorts top process over time (easier to follow), \"cpu direct\" updates top process directly."},
109109

110110
{"proc_reversed", "#* Reverse sorting order, True or False."},

src/btop_draw.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,6 +1682,13 @@ namespace Proc {
16821682
auto mem_bytes = Config::getB("proc_mem_bytes");
16831683
auto vim_keys = Config::getB("vim_keys");
16841684
auto show_graphs = Config::getB("proc_cpu_graphs");
1685+
#if defined(__linux__)
1686+
const bool show_gpu = width >= (show_graphs ? 70 : 65);
1687+
const bool show_gpu_mem = width >= (show_graphs ? 78 : 73);
1688+
#else
1689+
const bool show_gpu = false;
1690+
const bool show_gpu_mem = false;
1691+
#endif
16851692
const auto pause_proc_list = Config::getB("pause_proc_list");
16861693
auto follow_process = Config::getB("follow_process");
16871694
int followed_pid = Config::getI("followed_pid");
@@ -1772,9 +1779,12 @@ namespace Proc {
17721779
//? Adapt sizes of text fields
17731780
user_size = (width < 75 ? 5 : 10);
17741781
thread_size = (width < 75 ? - 1 : 4);
1775-
prog_size = (width > 70 ? 16 : ( width > 55 ? 8 : width - user_size - thread_size - 33));
1776-
cmd_size = (width > 55 ? width - prog_size - user_size - thread_size - 33 : -1);
1777-
tree_size = width - user_size - thread_size - 23;
1782+
const int gpu_cols = (show_gpu ? 6 : 0) + (show_gpu_mem ? 6 : 0);
1783+
const int proc_fixed = 33 + gpu_cols;
1784+
const int tree_fixed = 23 + gpu_cols;
1785+
prog_size = (width > 70 ? 16 : ( width > 55 ? 8 : width - user_size - thread_size - proc_fixed));
1786+
cmd_size = (width > 55 ? width - prog_size - user_size - thread_size - proc_fixed : -1);
1787+
tree_size = width - user_size - thread_size - tree_fixed;
17781788
if (not show_graphs) {
17791789
cmd_size += 5;
17801790
tree_size += 5;
@@ -1958,7 +1968,10 @@ namespace Proc {
19581968
out += (thread_size > 0 ? Mv::l(4) + "Threads: " : "")
19591969
+ ljust("User:", user_size) + ' '
19601970
+ rjust((mem_bytes ? "MemB" : "Mem%"), 5) + ' '
1961-
+ rjust("Cpu%", (show_graphs ? 10 : 5)) + Fx::ub;
1971+
+ rjust("Cpu%", (show_graphs ? 10 : 5))
1972+
+ (show_gpu ? string{" "} + rjust("Gpu%", 5) : "")
1973+
+ (show_gpu_mem ? string{" "} + rjust("GMem", 5) : "")
1974+
+ Fx::ub;
19621975
}
19631976
//* End of redraw block
19641977

@@ -2110,6 +2123,13 @@ namespace Proc {
21102123
if (cpu_str.ends_with('.')) cpu_str.pop_back();
21112124
cpu_str += "k";
21122125
}
2126+
string gpu_str;
2127+
if (show_gpu) {
2128+
gpu_str = fmt::format("{:.1f}", clamp(p.gpu_p, 0.0, 100.0));
2129+
if (gpu_str.size() > 4) gpu_str.resize(4);
2130+
if (gpu_str.ends_with('.')) gpu_str.pop_back();
2131+
}
2132+
const string gpu_mem_str = show_gpu_mem ? floating_humanizer(p.gpu_m, true) : "";
21132133
string mem_str = (mem_bytes ? floating_humanizer(p.mem, true) : "");
21142134
if (not mem_bytes) {
21152135
double mem_p = clamp((double)p.mem * 100 / totalMem, 0.0, 100.0);
@@ -2133,7 +2153,9 @@ namespace Proc {
21332153
+ m_color + rjust(mem_str, 5) + end + ' '
21342154
+ (is_selected or is_followed ? "" : Theme::c("inactive_fg")) + (show_graphs ? graph_bg * 5: "")
21352155
+ (p_graphs.contains(p.pid) ? Mv::l(5) + c_color + p_graphs.at(p.pid)({(p.cpu_p >= 0.1 and p.cpu_p < 5 ? 5ll : (long long)round(p.cpu_p))}, data_same) : "") + end + ' '
2136-
+ c_color + rjust(cpu_str, 4) + " " + end;
2156+
+ c_color + rjust(cpu_str, 4) + (show_gpu ? " " : " ") + end
2157+
+ (show_gpu ? c_color + rjust(gpu_str, 5) + ' ' + end : "")
2158+
+ (show_gpu_mem ? c_color + rjust(gpu_mem_str, 5) + ' ' + end : "");
21372159
if (lc++ > height - 5) break;
21382160
else if (lc > height - 5 and proc_banner_shown) break;
21392161
}

src/btop_menu.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,8 @@ namespace Menu {
817817
"",
818818
"Possible values:",
819819
"\"pid\", \"program\", \"arguments\", \"threads\",",
820-
"\"user\", \"memory\", \"cpu lazy\" and",
820+
"\"user\", \"memory\", \"gpu\",",
821+
"\"gpu memory\", \"cpu lazy\" and",
821822
"\"cpu direct\".",
822823
"",
823824
"\"cpu lazy\" updates top process over time.",

src/btop_shared.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,10 @@ bool set_priority(pid_t pid, int priority) {
109109
case 3: rng::stable_sort(proc_vec, rng::less{}, &proc_info::threads); break;
110110
case 4: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::user); break;
111111
case 5: rng::stable_sort(proc_vec, rng::less{}, &proc_info::mem); break;
112-
case 6: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cpu_p); break;
113-
case 7: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cpu_c); break;
112+
case 6: rng::stable_sort(proc_vec, rng::less{}, &proc_info::gpu_p); break;
113+
case 7: rng::stable_sort(proc_vec, rng::less{}, &proc_info::gpu_m); break;
114+
case 8: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cpu_p); break;
115+
case 9: rng::stable_sort(proc_vec, rng::less{}, &proc_info::cpu_c); break;
114116
}
115117
}
116118
else {
@@ -121,8 +123,10 @@ bool set_priority(pid_t pid, int priority) {
121123
case 3: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::threads); break;
122124
case 4: rng::stable_sort(proc_vec, rng::less{}, &proc_info::user); break;
123125
case 5: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::mem); break;
124-
case 6: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cpu_p); break;
125-
case 7: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cpu_c); break;
126+
case 6: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::gpu_p); break;
127+
case 7: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::gpu_m); break;
128+
case 8: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cpu_p); break;
129+
case 9: rng::stable_sort(proc_vec, rng::greater{}, &proc_info::cpu_c); break;
126130
}
127131
}
128132

@@ -150,16 +154,20 @@ bool set_priority(pid_t pid, int priority) {
150154
switch (v_index(sort_vector, sorting)) {
151155
case 3: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().threads < b.entry.get().threads; }); break;
152156
case 5: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().mem < b.entry.get().mem; }); break;
153-
case 6: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_p < b.entry.get().cpu_p; }); break;
154-
case 7: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_c < b.entry.get().cpu_c; }); break;
157+
case 6: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().gpu_p < b.entry.get().gpu_p; }); break;
158+
case 7: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().gpu_m < b.entry.get().gpu_m; }); break;
159+
case 8: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_p < b.entry.get().cpu_p; }); break;
160+
case 9: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_c < b.entry.get().cpu_c; }); break;
155161
}
156162
}
157163
else {
158164
switch (v_index(sort_vector, sorting)) {
159165
case 3: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().threads > b.entry.get().threads; }); break;
160166
case 5: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().mem > b.entry.get().mem; }); break;
161-
case 6: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_p > b.entry.get().cpu_p; }); break;
162-
case 7: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_c > b.entry.get().cpu_c; }); break;
167+
case 6: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().gpu_p > b.entry.get().gpu_p; }); break;
168+
case 7: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().gpu_m > b.entry.get().gpu_m; }); break;
169+
case 8: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_p > b.entry.get().cpu_p; }); break;
170+
case 9: rng::stable_sort(proc_vec, [](const auto& a, const auto& b) { return a.entry.get().cpu_c > b.entry.get().cpu_c; }); break;
163171
}
164172
}
165173
}
@@ -242,6 +250,8 @@ bool set_priority(pid_t pid, int priority) {
242250
if (p.state != 'X') {
243251
cur_proc.cpu_p += p.cpu_p;
244252
cur_proc.cpu_c += p.cpu_c;
253+
cur_proc.gpu_p += p.gpu_p;
254+
cur_proc.gpu_m += p.gpu_m;
245255
cur_proc.mem += p.mem;
246256
cur_proc.threads += p.threads;
247257
}
@@ -251,6 +261,8 @@ bool set_priority(pid_t pid, int priority) {
251261
else if (Config::getB("proc_aggregate") and p.state != 'X') {
252262
cur_proc.cpu_p += p.cpu_p;
253263
cur_proc.cpu_c += p.cpu_c;
264+
cur_proc.gpu_p += p.gpu_p;
265+
cur_proc.gpu_m += p.gpu_m;
254266
cur_proc.mem += p.mem;
255267
cur_proc.threads += p.threads;
256268
}

src/btop_shared.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ namespace Proc {
373373
"threads",
374374
"user",
375375
"memory",
376+
"gpu",
377+
"gpu memory",
376378
"cpu direct",
377379
"cpu lazy",
378380
};
@@ -404,11 +406,14 @@ namespace Proc {
404406
uint64_t mem{};
405407
double cpu_p{}; // defaults to = 0.0
406408
double cpu_c{}; // defaults to = 0.0
409+
double gpu_p{}; // defaults to = 0.0
410+
uint64_t gpu_m{};
407411
char state = '0';
408412
int64_t p_nice{};
409413
uint64_t ppid{};
410414
uint64_t cpu_s{};
411415
uint64_t cpu_t{};
416+
uint64_t gpu_t{};
412417
uint64_t death_time{};
413418
string prefix{}; // defaults to ""
414419
size_t depth{};

0 commit comments

Comments
 (0)