# tuned-amdgpu Hacky solution to integrate AMDGPU power/clock control into `tuned` profiles with Ansible. Extends every `tuned` profile found in `/usr/lib/tuned` using the [AMDGPU hwmon interfaces](https://docs.kernel.org/gpu/amdgpu/thermal.html): - `default`: the out-of-the-box GPU clock/power configuration - `overclock`: the _optimized_ card configuration. Includes the clock/voltage/power settings outlined below. - `peak`: the same as `overclock`, but with clock gating removed. May help profiling. Contrary to the name, the `overclock` profiles can be used to de-tune the card as well. _Warning_: This is only tested with `RX6000` series GPUs, others may _not_ work properly. Use at your own risk! ## Profiles Two _'profiles'_ are in each name: - before `amdgpu` is the source profile provided with `tuned` - after `amdgpu` tells the GPU clock profile offered, outlined below | Output profile | Description | |:---|---| | `balanced-amdgpu-default` | Includes the (assumed) existing `balanced` tuned profile.

Only adjusts the GPU power limit (typically lower). Clocks/voltage curve remain the default. | | `desktop-amdgpu-overclock` | Includes the (assumed) existing `desktop` tuned profile.

Adjusts the GPU power limit, clocks, _and_ the voltage curve. | | `desktop-amdgpu-peak` | Includes the (assumed) existing `desktop` tuned profile.

Same as the `overclock` profile, but locks clocks to their highest configured values | ## Config The playbook will render/make effective this config file: `/etc/tuned/amdgpu-profile-vars.conf` Here is a preview: ```ini tuned_amdgpu_clock_min=500 tuned_amdgpu_clock_max=2715 tuned_amdgpu_memclock_static=1075 tuned_amdgpu_power_multi_def=0.869969040247678 tuned_amdgpu_power_multi_oc=1.0 tuned_amdgpu_mv_offset=+60 ``` These are the result of [Variables](#Variables) below; changes outside of _Ansible_ are not immediately effective. Switching `tuned` profiles or restarting the service would be required. One can use `gamemode` for dynamic switching. Sample `~/.config/gamemode.ini` below: ```ini [custom] start=tuned-adm profile latency-performance-amdgpu-overclock end=tuned-adm profile latency-performance-amdgpu-default ``` See this [Arch Wiki](https://wiki.archlinux.org/title/Gamemode) link for more comprehensive information. ## Variables These are the variables you'll want to change/consider. | Variable | Description | |------------------------|-------------| | `tuned_amdgpu_clock_min` | Mininum GPU clock _(in `Mhz`)_ for `overclock` and `peak` profiles | | `tuned_amdgpu_clock_max` | Maximum GPU clock _(in `MHz`)_ for `overclock` and `peak` profiles` | | `tuned_amdgpu_memclock_static` | _Static_ GPU **memory** clock _(in `MHz`)_ for `overclock` and `peak` profiles. Not the effective data rate _(multiplied by generation)_, but the actual clock. Static assignment avoids potential display flickering. | | `tuned_amdgpu_mv_offset` | GPU core voltage offset. Takes +/- some integer in millivolts. Can be used to both over _and_ under volt. eg: `-50` _(undervolt `50mV` or `0.05V`)_ | | `tuned_amdgpu_power_multi_def` | Float between `0.0` and `1.0`; controls power limit relative to the board _capability_ for the `default` profiles | | `tuned_amdgpu_power_multi_oc` | Similar to `tuned_amdgpu_power_multi_def`, for `overclock` and `peak` profiles |