Skip to content

Commit df54145

Browse files
committed
Fixed several issues pertaining to the setting of clocks, in particular one where the memory clock would always be seen as not-equal due to a rounding error
1 parent 9dea137 commit df54145

File tree

1 file changed

+16
-28
lines changed

1 file changed

+16
-28
lines changed

kernel_tuner/observers/nvml.py

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ def persistence_mode(self, new_mode):
135135
raise ValueError(
136136
"Illegal value for persistence mode, should be either 0 or 1"
137137
)
138+
if self.persistence_mode == new_mode:
139+
return
138140
try:
139141
pynvml.nvmlDeviceSetPersistenceMode(self.dev, new_mode)
140142
self._persistence_mode = pynvml.nvmlDeviceGetPersistenceMode(self.dev)
@@ -168,21 +170,15 @@ def set_clocks(self, mem_clock, gr_clock):
168170
self.nvidia_smi,
169171
"-i",
170172
str(self.id),
171-
"--lock-gpu-clocks=" + str(gr_clock) + "," + str(gr_clock),
172173
]
173-
subprocess.run(args, check=True)
174-
args = [
175-
"sudo",
176-
self.nvidia_smi,
177-
"-i",
178-
str(self.id),
179-
"--lock-memory-clocks=" + str(mem_clock) + "," + str(mem_clock),
180-
]
181-
subprocess.run(args, check=True)
174+
command_set_mem_clocks = f"--lock-memory-clocks={str(mem_clock)},{str(mem_clock)}"
175+
command_set_gpu_clocks = f"--lock-gpu-clocks={str(gr_clock)},{str(gr_clock)}"
176+
subprocess.run(args + [command_set_gpu_clocks], check=True)
177+
subprocess.run(args + [command_set_mem_clocks], check=True)
182178
else:
183179
try:
184-
if self.persistence_mode != 0:
185-
self.persistence_mode = 0
180+
if self.persistence_mode != 1:
181+
self.persistence_mode = 1
186182
except Exception:
187183
pass
188184
try:
@@ -233,24 +229,20 @@ def reset_clocks(self):
233229
if (
234230
gr_app_clock != self.gr_clock_default
235231
or mem_app_clock != self.mem_clock_default
236-
):
232+
):
237233
self.set_clocks(self.mem_clock_default, self.gr_clock_default)
238234

239235
@property
240236
def gr_clock(self):
241237
"""Control the graphics clock (may require permission), only values compatible with the memory clock can be set directly."""
242-
return pynvml.nvmlDeviceGetClockInfo(self.dev, pynvml.NVML_CLOCK_GRAPHICS)
238+
if self.use_locked_clocks:
239+
return pynvml.nvmlDeviceGetClockInfo(self.dev, pynvml.NVML_CLOCK_GRAPHICS)
240+
else:
241+
return pynvml.nvmlDeviceGetApplicationsClock(self.dev, pynvml.NVML_CLOCK_GRAPHICS)
243242

244243
@gr_clock.setter
245244
def gr_clock(self, new_clock):
246-
cur_clock = (
247-
pynvml.nvmlDeviceGetClockInfo(self.dev, pynvml.NVML_CLOCK_GRAPHICS)
248-
if self.use_locked_clocks
249-
else pynvml.nvmlDeviceGetApplicationsClock(
250-
self.dev, pynvml.NVML_CLOCK_GRAPHICS
251-
)
252-
)
253-
if new_clock != cur_clock:
245+
if new_clock != self.gr_clock:
254246
self.set_clocks(self.mem_clock, new_clock)
255247

256248
@property
@@ -268,12 +260,8 @@ def mem_clock(self):
268260

269261
@mem_clock.setter
270262
def mem_clock(self, new_clock):
271-
cur_clock = (
272-
pynvml.nvmlDeviceGetClockInfo(self.dev, pynvml.NVML_CLOCK_MEM)
273-
if self.use_locked_clocks
274-
else pynvml.nvmlDeviceGetApplicationsClock(self.dev, pynvml.NVML_CLOCK_MEM)
275-
)
276-
if new_clock != cur_clock:
263+
if new_clock != self.mem_clock:
264+
print(f"mem_clock setter calls set_clocks because {new_clock=} != {cur_clock=}")
277265
self.set_clocks(new_clock, self.gr_clock)
278266

279267
@property

0 commit comments

Comments
 (0)