-
Notifications
You must be signed in to change notification settings - Fork 0
/
amdgpu-tune@.service
128 lines (116 loc) · 8.37 KB
/
amdgpu-tune@.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# SPDX-License-Identifier: Unlicense
[Service]
# Use the following environment variables to tune the settings.
# All settings are optional.
# On multi-GPU systems (e.g. a laptop with AMD/AMD hybrid-graphics) you must set DEVICE
# to the Device ID of the dGPU.
#
# Example: DEVICE=73df
#
Environment=DEVICE=73df
# Set the minimum and maximum core clocks in MHz.
# This setting is not supported on mobile GPUs.
#
# Example: CORE_CLOCK_MAX=2500
#
Environment=CORE_CLOCK_MIN=
Environment=CORE_CLOCK_MAX=
# Set the minimum and maximum memory clocks in MHz.
# This setting is not supported on mobile GPUs.
#
# Note that the actual memory controller clock rate are exposed, not
# the effective memory clock of the DRAMs. To translate it, use the
# formulas documented on the amdgpu kernel driver.
#
# Example: MEMORY_CLOCK_MAX=1000
#
Environment=MEMORY_CLOCK_MIN=
Environment=MEMORY_CLOCK_MAX=
# Set a voltage offset in mV.
# Undervolting reduces power consumption and heat generation and can improve performance.
# This setting is not supported on GPUs older than RDNA2/RX 6000 series.
#
# Example: VOLTAGE_OFFSET=-50
#
Environment=VOLTAGE_OFFSET=
# Set a frequency/voltage curve in <MHz, mV>.
# Three <frequency, voltage> points that can be used to calibrate the core voltage curve.
# This setting is not supported on mobile GPUs.
#
# Example: VDDC_CURVE_0='300 600'
# VDDC_CURVE_1='1200 800'
# VDDC_CURVE_2='2300 1000'
#
Environment=VDDC_CURVE_0=
Environment=VDDC_CURVE_1=
Environment=VDDC_CURVE_2=
# Set the power limit in Watts.
# This setting is not supported on mobile GPUs.
#
# Example: POWER_CAP=130
#
Environment=POWER_CAP=
###############################################
### Do NOT change anything bellow this line ###
###############################################
Type=oneshot
# We can just embed the whole script in the service unit to avoid dependency on another file.
ExecStart=sh -c ' \n\
log_error() { printf "ERROR: %%s\\n" "$*" >&2; }; \n\
abort() { log_error "$*"; exit 1; }; \n\
CARD=/sys/class/drm/card0; \n\
for d in /sys/class/drm/card?; do \n\
[ "${DEVICE}" ] && [ "0x${DEVICE}" = "$(cat $d/device/device)" ] && \n\
CARD="$d" && printf "Selected device at $d\\n"; \n\
done; \n\
for d in "$CARD"/device/hwmon/hwmon?; do \n\
HWMON="$d"; printf "Selected hwmon at $HWMON\\n"; break; \n\
done; \n\
[ "%I" = "apply" ] && sleep 2; \n\
if [ "%I" = "reset" ]; then \n\
printf "Reverting changes: \\"r\\" >$CARD/device/pp_od_clk_voltage \\n" && \n\
printf "r\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
printf "Setting auto power management: \\"auto\\" >$CARD/device/power_dpm_force_performance_level \\n" && \n\
printf "auto\\n" >"$CARD"/device/power_dpm_force_performance_level; \n\
exit 0; \n\
fi; \n\
printf "Setting manual power management: \\"manual\\" >$CARD/device/power_dpm_force_performance_level \\n" && \n\
printf "manual\\n" >"$CARD"/device/power_dpm_force_performance_level || \n\
abort "Failed to set manual performance level"; \n\
[ "${CORE_CLOCK_MIN}" ] && \n\
printf "Setting minimum core clock: \\"s 0 ${CORE_CLOCK_MIN}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "s 0 ${CORE_CLOCK_MIN}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${CORE_CLOCK_MAX}" ] && \n\
printf "Setting maximum core clock: \\"s 1 ${CORE_CLOCK_MAX}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "s 1 ${CORE_CLOCK_MAX}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${MEMORY_CLOCK_MIN}" ] && \n\
printf "Setting minimum core clock: \\"m 0 ${MEMORY_CLOCK_MIN}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "m 0 ${MEMORY_CLOCK_MIN}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${MEMORY_CLOCK_MAX}" ] && \n\
printf "Setting maximum core clock: \\"m 1 ${MEMORY_CLOCK_MAX}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "m 1 ${MEMORY_CLOCK_MAX}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${VDDC_CURVE_0}" ] && \n\
printf "Setting frequency/voltage curve: \\"vc 0 ${VDDC_CURVE_0}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "vc 0 ${VDDC_CURVE_0}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${VDDC_CURVE_1}" ] && \n\
printf "Setting frequency/voltage curve: \\"vc 1 ${VDDC_CURVE_1}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "vc 1 ${VDDC_CURVE_1}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${VDDC_CURVE_2}" ] && \n\
printf "Setting frequency/voltage curve: \\"vc 2 ${VDDC_CURVE_2}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "vc 2 ${VDDC_CURVE_2}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
[ "${VOLTAGE_OFFSET}" ] && \n\
printf "Setting voltage offset: \\"vo ${VOLTAGE_OFFSET}\\" >$CARD/device/pp_od_clk_voltage\\n" && \n\
printf "vo ${VOLTAGE_OFFSET}\\n" >"$CARD"/device/pp_od_clk_voltage; \n\
printf "Committing changes: \\"c\\" >$CARD/device/pp_od_clk_voltage \\n" && \n\
printf "c\\n" >"$CARD"/device/pp_od_clk_voltage || \n\
log_error "Failed to commit changes"; \n\
[ "${POWER_CAP}" ] && [ "$HWMON" ] && \n\
printf "Setting power limit: \\"${POWER_CAP}000000\\" >$HWMON/power1_cap\\n" && \n\
printf "${POWER_CAP}000000\\n" >"$HWMON"/power1_cap; \n\
printf "Setting auto power management: \\"auto\\" >$CARD/device/power_dpm_force_performance_level \\n" && \n\
printf "auto\\n" >"$CARD"/device/power_dpm_force_performance_level; \n\
'
[Unit]
Description=Tune performance of AMD GPU (%i)
After=default.target modprobe@amdgpu.service
Wants=modprobe@amdgpu.service