1
1
use clap:: { arg, Args , CommandFactory , Parser , Subcommand } ;
2
2
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 } ;
5
8
use serde:: Deserialize ;
6
9
use std:: { collections:: HashMap , io} ;
7
10
@@ -26,6 +29,12 @@ enum Commands {
26
29
#[ command( flatten) ]
27
30
sets : Sets ,
28
31
} ,
32
+ /// Gets GPU parameters
33
+ Get {
34
+ /// GPU index
35
+ #[ arg( short, long) ]
36
+ index : u32 ,
37
+ } ,
29
38
/// Generate shell completion script
30
39
Completion {
31
40
/// The shell to generate the script for
@@ -108,6 +117,37 @@ fn main() {
108
117
}
109
118
println ! ( "Successfully set GPU parameters." ) ;
110
119
}
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
+ }
111
151
None => {
112
152
let Ok ( config_file) = std:: fs:: read_to_string ( cli. file ) else {
113
153
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>> {
155
195
Ok ( ( ) )
156
196
}
157
197
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
+
158
212
fn set_gpu_frequency_offset (
159
213
nvml_lib : & NvmlLib ,
160
214
handle : nvmlDevice_t ,
0 commit comments