1const BAR_WIDTH: usize = 40;
15
16const GIB: u64 = 1024 * 1024 * 1024;
17
18fn gib(bytes: u64) -> String {
20 let tenths = bytes / (GIB / 10);
21 format!("{}.{} GiB", tenths / 10, tenths % 10)
22}
23
24fn bar(used: Option<u64>, total: u64) -> String {
27 let Some(used) = used.filter(|_| total > 0) else {
28 return format!("[{}] usage unknown", "·".repeat(BAR_WIDTH));
29 };
30 let used = used.min(total);
31 let scaled = u128::from(used) * BAR_WIDTH as u128 / u128::from(total);
33 let filled = usize::try_from(scaled).unwrap_or(BAR_WIDTH).min(BAR_WIDTH);
34 let tenths = u128::from(used) * 1000 / u128::from(total);
35 format!(
36 "[{}{}] {}.{}%",
37 "█".repeat(filled),
38 "░".repeat(BAR_WIDTH - filled),
39 tenths / 10,
40 tenths % 10,
41 )
42}
43
44fn main() {
45 let gpus = gpu_probe::detect();
46
47 println!("gpu-probe · {} GPU(s)", gpus.len());
48 println!();
49
50 if gpus.is_empty() {
51 println!(" no GPUs detected");
52 }
53
54 for (index, gpu) in gpus.iter().enumerate() {
55 println!("[{index}] {} · {}", gpu.name, gpu.vendor);
56 match gpu.arch_target {
59 Some(arch) => println!(" arch {:>10}", arch.to_string()),
60 None => println!(" arch unavailable"),
61 }
62 println!(" total {:>10}", gib(gpu.total_bytes));
63 match gpu.used_bytes {
64 Some(used) => println!(" used {:>10}", gib(used)),
65 None => println!(" used unknown"),
66 }
67 match gpu.free_bytes {
68 Some(free) => println!(" free {:>10}", gib(free)),
69 None => println!(" free unknown"),
70 }
71 println!(" {}", bar(gpu.used_bytes, gpu.total_bytes));
72 println!();
73 }
74
75 println!("host");
85 match gpu_probe::oneapi_host() {
86 Some(oneapi) => println!(" oneapi {:>10}", oneapi.version.to_string()),
87 None => println!(" oneapi unavailable"),
88 }
89 match gpu_probe::rocm_host() {
90 Some(rocm) => println!(" rocm {:>10}", rocm.version.to_string()),
91 None => println!(" rocm unavailable"),
92 }
93 match gpu_probe::cuda_host() {
94 Some(cuda) => println!(" cuda {:>10}", cuda.driver_version.to_string()),
95 None => println!(" cuda unavailable"),
96 }
97 match gpu_probe::vulkan_host() {
98 Some(vulkan) => println!(" vulkan {:>10}", vulkan.api_version.to_string()),
99 None => println!(" vulkan unavailable"),
100 }
101}