@@ -13,32 +13,38 @@ const nvml_buf_size = c.NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE;
1313
1414pub const Nvml = struct {
1515 allocator : std.mem.Allocator ,
16- driver_version : [driver_buf_size ]u8 ,
17- nvml_version : [nvml_buf_size ]u8 ,
16+ driver_version : []u8 , // owned memory
17+ nvml_version : []u8 , // owned memory
1818 gpu_count : u32 ,
1919 gpus : []Gpu ,
2020
2121 pub fn init (gpa : std.mem.Allocator ) ! Nvml {
2222 try nvmlCheck (c .nvmlInit ());
2323
24- var driver_version : [driver_buf_size ]u8 = undefined ;
25- var nvml_version : [nvml_buf_size ]u8 = undefined ;
24+ var driver_version : [driver_buf_size : 0 ]u8 = undefined ;
25+ var nvml_version : [nvml_buf_size : 0 ]u8 = undefined ;
2626 // zig's usize = 64bits, nvml APIs expect c_uint = 32bits
2727 // so let's cast
2828 try nvmlCheck (c .nvmlSystemGetDriverVersion (& driver_version , @intCast (driver_version .len )));
2929 try nvmlCheck (c .nvmlSystemGetNVMLVersion (& nvml_version , @intCast (nvml_version .len )));
3030 var device_count : c_uint = 0 ;
3131 try nvmlCheck (c .nvmlDeviceGetCount (& device_count ));
3232
33- std .log .debug ("NVML version: {s}" , .{nvml_version });
34- std .log .debug ("driver version: {s}" , .{driver_version });
33+ // memory copy C sliced buffers, as in gpu.zig init
34+ const owned_nvml_version = try gpa .dupe (u8 , std .mem .sliceTo (& nvml_version , 0 ));
35+ const owned_driver_version = try gpa .dupe (u8 , std .mem .sliceTo (& driver_version , 0 ));
36+
37+ std .log .debug ("NVML version: {s}" , .{owned_nvml_version });
38+ std .log .debug ("driver version: {s}" , .{owned_driver_version });
3539 std .log .debug ("GPUs number: {d}" , .{device_count });
3640
3741 var arr : std .ArrayList (Gpu ) = .empty ;
3842 errdefer {
3943 for (arr .items ) | * g | g .deinit (gpa );
4044 arr .deinit (gpa );
4145 nvmlCheck (c .nvmlShutdown ()) catch {};
46+ gpa .free (owned_nvml_version );
47+ gpa .free (owned_driver_version );
4248 }
4349
4450 for (0.. device_count ) | index | {
@@ -49,8 +55,8 @@ pub const Nvml = struct {
4955
5056 return Nvml {
5157 .allocator = gpa ,
52- .driver_version = driver_version ,
53- .nvml_version = nvml_version ,
58+ .driver_version = owned_driver_version ,
59+ .nvml_version = owned_nvml_version ,
5460 .gpu_count = device_count ,
5561 .gpus = gpus ,
5662 };
@@ -59,7 +65,7 @@ pub const Nvml = struct {
5965 pub fn exec (self : * const Nvml , parsed : Parsed , config : ? UserConfig ) ! void {
6066 switch (parsed ) {
6167 .query = > | handler | {
62- try handler .run (self .gpus , & self .driver_version );
68+ try handler .run (self .gpus , self .driver_version );
6369 },
6470 .set = > | handler | {
6571 try handler .run (self .gpus );
@@ -92,7 +98,8 @@ pub const Nvml = struct {
9298 pub fn deinit (self : * Nvml ) void {
9399 for (self .gpus ) | * g | g .deinit (self .allocator );
94100 self .allocator .free (self .gpus );
95-
101+ self .allocator .free (self .nvml_version );
102+ self .allocator .free (self .driver_version );
96103 nvmlCheck (c .nvmlShutdown ()) catch {};
97104 }
98105};
0 commit comments