AMDGPU power/clock control with custom 'tuned' profiles
Find a file
2024-08-05 08:19:51 -05:00
host_vars tuned/amdgpu: introduce config file, consolidated script 2024-08-05 08:12:02 -05:00
inventories inv: localhost/workstation (map host_vars) 2024-03-24 18:30:15 -05:00
roles/tuned_amdgpu tuned/amdgpu: introduce config file, consolidated script 2024-08-05 08:12:02 -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 vars: move to host_vars 2024-03-24 18:28:38 -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: use 'ini' for config highlighting 2024-08-05 08:19:51 -05:00

tuned-amdgpu

Hacky solution to integrate AMDGPU power control and overclocking in tuned with Ansible.

TLDR: See my host_vars for an overview.

A host will have a collection of tuned profiles. For example: desktop, balanced, virt-host

This role extends those with AMD GPU power/clock/voltage control. Each gets default, overclock, and peak variations.

An attempt is made to discover the active GPU using the 'connected' state in the DRM subsystem, example:

~ $ grep -ls ^connected /sys/class/drm/*/status | grep -o card[0-9] | sort | uniq | sort -h | tail -1
card1

Warning: This is only tested with RX6000 series GPUs, it is probable that other generations will 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 this config file: /etc/tuned/amdgpu-profile-vars.conf

Here is a preview:

gpu_clock_min=500
gpu_clock_max=2715
gpumem_clock_static=1075
gpu_power_multi_def=0.869969040247678
gpu_power_multi_oc=1.0
gpu_mv_offset=+60

Changes will require switching tuned profiles to re-read/apply the config.

One can use gamemode to do this automatically on start/stop.

Sample ~/.config/gamemode.ini:

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

Variables

These are the variables you'll want to change/consider.

Variable Description
gpu_clock_min Sets the min (dynamic) GPU clock (in Mhz) for the non-default amdgpu profiles
gpu_clock_max Sets the max (dynamic) GPU clock (in MHz) for the non-default amdgpu profiles
gpumem_clock_static Sets the static memory clock for the GPU (in MHz). This is not the effective data rate. That would be a multiple of this depending on the type of VRAM.

To avoid flickering this is not allowed to change with load, only between default and overclock/peak profiles.
gpu_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)
base_profiles List of base tuned profiles to clone in the new AMDGPU profiles. Defaults based on Fedora
gpu_power_multi_def Float between 0.0 and 1.0; controls power limit relative to the board capability. For 'default'-named power profiles.
gpu_power_multi_oc Similar to gpu_power_multi_def, for 'overclock'-named power profiles.