#なぜに記事にしたか
英語だと記事があったけど、日本語の情報が無かったので
自分へのメモ
#環境
OS: Manjaro Linux (kernel 4.19)
GPU: Radeon RX480
#やりかた
※複数カードを刺している人等は適宜パスを変更してください
##カーネルパラメータ変更
これをしないと電圧などを弄れない
$ sudo vim /etc/default/grub
でGRUB_CMDLINE_LINUX_DEFAULTにamdgpu.ppfeaturemask=0xffffffffを追加
具体的には
GRUB_CMDLINE_LINUX_DEFAULT="amdgpu.ppfeaturemask=0xffffffff quiet"
みたいにして、
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
で、GRUB設定を反映し再起動
##周波数/電圧制御をマニュアルモードにする
$ sudo sh -c "echo manual > /sys/class/drm/card0/device/power_dpm_force_performance_level"
##GPU周波数/電圧を読む
$ cat /sys/class/drm/card0/device/pp_od_clk_voltage
OD_SCLK:
0: 300MHz 800mV
1: 608MHz 818mV
2: 910MHz 824mV
3: 1077MHz 856mV
4: 1135MHz 870mV
5: 1180MHz 880mV
6: 1200MHz 900mV
7: 1250MHz 930mV
OD_MCLK:
0: 300MHz 800mV
1: 2000MHz 930mV
OD_RANGE:
SCLK: 300MHz 2000MHz
MCLK: 300MHz 2250MHz
VDDC: 800mV 1175mV
みたいなのが出てくる。
- OD_SCLK部分がレベル/GPU周波数/GPU電圧
- OD_MCLK部分がレベル/メモリ周波数/メモリ電圧
- その下は変更できる範囲
##周波数、電圧を変更してみる
変更は
"変更対象 レベル 周波数 電圧"
をpp_od_clk_voltageにリダイレクトする。
GPUの周波数/電圧を変えるならsを
$ sudo sh -c "echo s 7 1250 930 > /sys/class/drm/card0/device/pp_od_clk_voltage"
メモリの周波数/電圧を変えるならmを
$ sudo sh -c "echo m 1 2000 930 > /sys/class/drm/card0/device/pp_od_clk_voltage"
##変更した周波数/電圧をコミットする
$ sudo sh -c "echo c > /sys/class/drm/card0/device/pp_od_clk_voltage"
##なんなら確認する
$ watch -n 0.5 sensors
#んで、何をするか
低電圧化して消費電力を減らし、ディープラーニングを走らせました。
#参考文献
カーネルパラメータについて
https://wiki.archlinux.jp/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF#GRUB
GPUオーバークロック
https://wiki.archlinux.org/index.php/AMDGPU#Overclocking
Linuxカーネルガイド
https://dri.freedesktop.org/docs/drm/gpu/amdgpu.html#power-dpm-force-performance-level
#まとめ
ファイルに文字列リダイレクトするだけで色々できるUnixは素晴らしい