Skip to content

GPU Governor and Tuning

MTSistemi edited this page Jun 9, 2026 · 1 revision

GPU Governor and Tuning

⚠️ Read the Voltage curve section before pushing GPU clocks. The wrong curve can hard-freeze the whole machine.

Why a governor?

The standard amdgpu sysfs knobs (power_dpm_force_performance_level, pp_dpm_sclk) do not control the BC-250 — they return errors. On the Cyan Skillfish GPU only the SMU sets the clock, through the OD voltage curve (pp_od_clk_voltage, vc <point> <MHz> <mV>).

SkillFishOS uses the cyan-skillfish-governor (Rust) as a systemd service, configured in /etc/cyan-skillfish-governor/config.toml. It is load-based: it samples a busy/idle bit and settles on the lowest frequency that keeps GPU utilisation inside the [load-target] band, idling to 350 MHz when nothing uses the GPU.

Balanced vs Performance

Switch profiles from the SkillFishOS Tuner → GPU section → Governor mode:

Mode load-target Behaviour
Balanced (default) upper 0.95 / lower 0.70 Raises the clock only as much as the workload needs — cooler and quieter.
Performance upper 0.20 / lower 0.08 + snappier ramp Holds the top safe-point under any gaming load (best FPS in GPU-bound titles). Still idles to 350 MHz on the desktop.

Measured — Black Myth: Wukong benchmark, 1080p:

Balanced Performance
Average FPS 100 111 (+11%)
5%-low FPS 92 102 (+11%)

An older note claimed 2000 ≈ 2230 MHz gave identical FPS. That holds for gameplay (more CPU/draw-call bound); the benchmark flythrough is heavier and is GPU-bound, so holding a high clock clearly helps there. Performance mode runs hotter — keep the fan high (the Tuner controls it).

The voltage curve — READ THIS

The governor follows a multi-point voltage curve of safe-points. SkillFishOS ships:

[[safe-points]]
frequency = 350
voltage = 700
[[safe-points]]
frequency = 1500
voltage = 900
[[safe-points]]
frequency = 2000
voltage = 1000
[[safe-points]]
frequency = 2200
voltage = 1000

Two rules, both learned the hard way:

  1. 1000 mV is the practical stable ceiling at ~2150–2200 MHz. 2230 MHz @ 1000 mV is undervolted. Pushing the top point to 2230 @ 1000 mV, or pinning a fixed 2230 MHz OD point, can hard-freeze the machine — a total hang where the kernel still answers ping but everything else is dead, and nothing is written to the logs. 2230 needs 1000–1060 mV and depends on the silicon lottery.
  2. Use a smooth, multi-point curve, not a 2-point line. A 350/700 → 2230/1000 two-point curve makes abrupt clock/voltage transitions and was reproducibly able to hang the box on the load→idle transition. The mid-points (1500/900, 2000/1000) keep transitions gentle.

The Tuner therefore caps the GPU max at 2200 MHz @ 1000 mV (the validated-stable point), always writes the multi-point curve, and reloads the governor gently (stop → settle → start) instead of an abrupt restart. 2000 MHz @ 1000 mV is the safe starting point for every board.

Manual control (advanced)

The Tuner's GPU Max frequency / Max voltage sliders write the curve's top safe-point. The Test (benchmark) button applies a setting, runs vkpeak, and reports the score/temperature so you can validate stability before keeping it.

If you really want >2200 MHz, raise the voltage first, increase the clock in 50–100 MHz steps, and stress-test 30+ minutes at each step. There are no guarantees above 2200 @ 1000 mV.

Memory clock

Memory bandwidth was measured (clpeak/OpenCL) at ~350–367 GB/s — healthy, not a bottleneck. The Memory Clock 450 MHz the driver reports is a reporting convention, not a 1/4 clock; the memory clock is not adjustable on the BC-250.

See also

Clone this wiki locally