Skip to content

Commit 61c8d3b

Browse files
zt64Dreaming-Codes
andauthored
Add get command (#18)
* feat: get command * improve get error handling --------- Co-authored-by: DreamingCodes <[email protected]>
1 parent e8b6f7a commit 61c8d3b

File tree

1 file changed

+56
-2
lines changed

1 file changed

+56
-2
lines changed

src/main.rs

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use clap::{arg, Args, CommandFactory, Parser, Subcommand};
22
use clap_complete::{generate, Generator, Shell};
3-
use nvml_wrapper::Nvml;
4-
use nvml_wrapper_sys::bindings::{nvmlDevice_t, NvmlLib};
3+
use nvml_wrapper::{
4+
error::{nvml_try, NvmlError},
5+
Nvml,
6+
};
7+
use nvml_wrapper_sys::bindings::{nvmlDevice_t, nvmlReturn_t, NvmlLib};
58
use serde::Deserialize;
69
use std::{collections::HashMap, io};
710

@@ -26,6 +29,12 @@ enum Commands {
2629
#[command(flatten)]
2730
sets: Sets,
2831
},
32+
/// Gets GPU parameters
33+
Get {
34+
/// GPU index
35+
#[arg(short, long)]
36+
index: u32,
37+
},
2938
/// Generate shell completion script
3039
Completion {
3140
/// The shell to generate the script for
@@ -108,6 +117,37 @@ fn main() {
108117
}
109118
println!("Successfully set GPU parameters.");
110119
}
120+
Some(Commands::Get { index }) => {
121+
let nvml = Nvml::init().expect("Failed to initialize NVML");
122+
let device = nvml.device_by_index(*index).expect("Failed to get GPU");
123+
124+
unsafe {
125+
let raw_device_handle: nvmlDevice_t = device.handle();
126+
let nvml_lib =
127+
NvmlLib::new("libnvidia-ml.so").expect("Failed to load NVML library");
128+
129+
let freq_offset =
130+
get_value(|v| nvml_lib.nvmlDeviceGetGpcClkVfOffset(raw_device_handle, v));
131+
match freq_offset {
132+
Ok(freq_offset) => println!("GPU frequency offset: {} Hz", freq_offset),
133+
Err(e) => eprintln!("Failed to get GPU frequency offset: {:?}", e),
134+
}
135+
136+
let mem_offset =
137+
get_value(|v| nvml_lib.nvmlDeviceGetMemClkVfOffset(raw_device_handle, v));
138+
match mem_offset {
139+
Ok(mem_offset) => println!("GPU memory frequency offset: {} Hz", mem_offset),
140+
Err(e) => eprintln!("Failed to get GPU memory frequency offset: {:?}", e),
141+
}
142+
143+
let power_limit =
144+
get_value(|v| nvml_lib.nvmlDeviceGetPowerManagementLimit(raw_device_handle, v));
145+
match power_limit {
146+
Ok(power_limit) => println!("GPU power limit: {} mW", power_limit),
147+
Err(e) => eprintln!("Failed to get GPU power limit: {:?}", e),
148+
}
149+
}
150+
}
111151
None => {
112152
let Ok(config_file) = std::fs::read_to_string(cli.file) else {
113153
panic!("Configuration file not found and no valid arguments were provided. Run `nvidia_oc --help` for more information.");
@@ -155,6 +195,20 @@ fn escalate_permissions() -> Result<(), Box<dyn std::error::Error>> {
155195
Ok(())
156196
}
157197

198+
fn get_value<T, F>(f: F) -> Result<T, Option<NvmlError>>
199+
where
200+
T: Default,
201+
F: FnOnce(*mut T) -> nvmlReturn_t,
202+
{
203+
let mut value = T::default();
204+
let status = f(&mut value);
205+
if status == 0 {
206+
Ok(value)
207+
} else {
208+
Err(nvml_try(status).err())
209+
}
210+
}
211+
158212
fn set_gpu_frequency_offset(
159213
nvml_lib: &NvmlLib,
160214
handle: nvmlDevice_t,

0 commit comments

Comments
 (0)