AMDGPU power/clock control with custom 'tuned' profiles
Find a file
2024-08-27 07:39:13 -05:00
host_vars role/host_vars: properly prefix vars 2024-08-27 06:54:55 -05:00
inventories inv: localhost/workstation (map host_vars) 2024-03-24 18:30:15 -05:00
roles/tuned_amdgpu role/host_vars: properly prefix vars 2024-08-27 06:54:55 -05:00
.gitignore ignore vim swp files 2022-06-07 19:50:15 -05:00
ansible.cfg play: clock var updates, -retry files in ansible.cfg 2024-03-03 17:56:42 -06:00
LICENSE Initial commit 2022-06-07 19:42:16 -05:00
playbook.yml tuned: discover base profiles dynamically 2024-08-09 08:25:54 -05:00
power_max multi tab calculator.ods update spreadsheet w/ my card multis 2023-06-05 01:00:36 -05:00
README.md readme: format, request 2024-08-27 07:39:13 -05:00

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:

  • 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.

Assumptions / Limitations

Only tested with RX6000 series GPUs and the mainline amdgpu driver. Other permutations may not work properly. Please use at your own risk!

Multiple GPUs in a single system are not yet managed, assumes a single GPU with displays attached.

Please report any issues or PRs, all will be considered.

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:

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 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:

[custom]
start=tuned-adm profile latency-performance-amdgpu-overclock
end=tuned-adm profile latency-performance-amdgpu-default

See this Arch Wiki 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_mv_offset GPU voltage offset. Takes +/- some integer in millivolts to raise or lower. eg: -25 for 0.025V undervolt.
tuned_amdgpu_power_multi_def Float between 0.0 (none) and 1.0 (full); effective power limit relative to board capability. For the default profiles
tuned_amdgpu_power_multi_oc Instance of tuned_amdgpu_power_multi_def for overclock and peak profiles
tuned_amdgpu_memclock_static Static 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.