
Разгон и даунвольтинг видеокарт AMD в Linux с помощью OverDrive
При переходе с операционной системы Windows на Linux поначалу довольно сложно установить нужные значения разгона и даунвольтинга видеокарт при майнинге.
В ОС семейства Linux с ядром версии 4.17 и выше есть возможность управления разгоном видеокарт AMD встроенными в драйвер amdgpu средствами (технология OverDrive). К сожалению, эта функция по умолчанию отключена, но, как говорится, «стучите в двери, и Вам откроют…». Большим плюсом технологии OverDrive является поддержка видеокарт с ядром Navi (RX5xxx). Пока это единственная возможность полноценно работать с параметрами разгона и даунвольтинга с такими картами в Linux.
Почему стоит обновлять ядро системы и как проверить его версию
Для того, чтобы максимально использовать все возможности ОС, желательно сразу после установки произвести обновление компонентов. Это может добавить ряд полезных функций и устранит возможные баги.
Например, поддержка опций оверклокинга в видеокартах с ядром Hawaii появилась только в ядре 4.20 с драйверами amdgpu. Отсутствие такой возможности в более ранних ядрах с успехом решалось перепрошивкой BIOS, но зачем делать лишние телодвижения, если все уже продумано и встроено в ядро? Кроме того, даже при прошивке всех значений оверклокинга и даунвольтинга в Биос карточки, лучше продублировать управление и контроль за ее состоянием на уровне операционной системы.
Проверить версию установленного в системе ядра можно командой:
uname -a
Просмотреть информацию о том, какие вообще версии ядра сохранены в системе можно командой:
sudo dpkg -l | grep linux-headers | grep ii | awk '{print $3}'Примеры отображения информации о версии ядра по команде uname -a:
В ОС xubuntu 16.04 с ядром 4.15.0-72 (OverDrive не поддерживается):

В HiveOS на начало 2020 года используется ядро 5.0.21:

В RaveOS в январе 2020 года используется ядро 5.2.5:

Как включить управление вольтажом, частотами ядра и памяти в ОС типа *Ubuntu?
Для полноценного управления и контроля за состоянием видеокарт АМД Polaris и Vega в операционках на базе дистрибутива Убунту с драйверами amdgpu нужно включить поддержку технологии Radeon OverDrive. Для видеокарт Navi поддержка OverDrive включена в Linux с kernel 5.5 и выше.
Нужно понимать, что бездумное использование функций OverDrive может испортить оборудование, например, сжечь карту или перенагрузить блок питания и тем самым ускорить его прибытие в мир иной.
С точки зрения теории для включения OverDrive изменяют параметры ppfeaturemask в amdgpu драйвере. Благодаря этому появится полный контроль над состоянием видеокарт производства АМД, так как включатся следующие функции:
--showclkvolt;
--showvoltagerange;
--showvc;
--showsclkrange;
--showmclkrange;
--setslevel;
--setmlevel;
--setoverdrive;
--setpoweroverdrive;
--resetpoweroverdrive;
--setvc;
--setsrange;
--setmrange
На практике с этой целью в загрузчике ядра /etc/default/grub в строке GRUB_CMDLINE_LINUX_DEFAULT нужно прописать:
amdgpu.ppfeaturemask=0xfffd7fff
либо
amdgpu.ppfeaturemask=0xffffffff
Затем нужно не забыть обновить загрузчик ядра командой:
sudo update-grub
и перезагрузиться.
Для справки:
По умолчанию в драйверах используется значение 0xfffd3fff. Установка значения 0xffffffff изменяет следующие опции:
- включается режим OverDrive;
- включается патч gfxoff для уменьшения потребления энергии (функция power-saving);
- включается режим энергосбережения Stutter при работе на низких p-state.
При установке значения 0xfffd7fff включается только режим OverDrive.
Установка значения 0xffffffff на видеокартах RX 470/570 может привести к появлению артефактов, поэтому для них лучше использовать режим 0xfffd7fff.
Затем нужно найти в системе файл, в котором прописаны частоты и вольтаж видеокарты. Это делается командой (например, для видеокарты 0):
readlink -f /sys/class/drm/card0/device

Исходя из информации на картинке, искомый файл находится по пути:
/sys/devices/pci0000:00/0000:00:1c.4/0000:0d:00.0
В этой директории имеется файл pp_od_clk_voltage, где содержится информация о состояниях P-state ядра/памяти и соответствующих им вольтажам:
OD_SCLK:
0: 300MHz 750mV
1: 600MHz 769mV
2: 900MHz 887mV
3: 1145MHz 1100mV
4: 1215MHz 1181mV
5: 1257MHz 1150mV
6: 1300MHz 1150mV
7: 1411MHz 1150mV
OD_MCLK:
0: 300MHz 750mV
1: 1000MHz 800mV
2: 1750MHz 950mV
OD_RANGE:
SCLK: 300MHz 2000MHz
MCLK: 300MHz 2250MHz
VDDC: 750mV 1200mV
Если в системе включена интегрированная в процессор видеокарта (обычно это нулевая или первая карта), то для нее файла pp_od_clk_voltage создаваться не будет.
В Linux можно менять значения P-state для ядра и VRAM аналогично разгону в Windows с помощью OverdriveNTool. Для ручного изменения параметров разгона нужно сначала выполнить команду:
sudo echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level
Для изменения P-state для ядра и VRAM используют команду вида (в данном случае для изменения частоты и напряжения в P-state 7):
sudo sh -c "echo 's 7 1140 890' > /sys/devices/pci0000:00/0000:00:02.0/pp_od_clk_voltage"
Здесь значение «s» изменяет параметры ядра на седьмой P-state, 1140 – частота ядра в MHz, 890 – его вольтаж в mV.
В команде нужно прописать свой путь к файлу pp_od_clk_voltage.
Для изменения частоты и вольтажа видеопамяти используют команду:
sudo sh -c "echo 'm 2 2065 950' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage"
Здесь 2 – это второй стейт памяти, 2065 – частота в мегагерцах, 1150 –напряжение на контроллере памяти в мВ.
Для проверки внесения изменений выполняют:
cat /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage
команду и проверяют содержимое файла pp_od_clk_voltage с вольтажом и частотами.
Если изменения не применяются, нужно проверить установку ручного управления производительностью видеокарты командой:
echo "manual" > /sys/class/drm/card0/device/power_dpm_force_performance_level
Если все значения сохранены и проверены, то для их применения применяют команду:
sudo sh -c "echo 'c' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage"
Для автоматического применения этих команд после перезагрузки можно использовать скрипт, например, под названием overclock в директории /usr/bin/ или прописывать эти команды в начало скрипта майнера.
В скрипт вписывают команды с нужными параметрами, например:
#!/bin/sh
sudo sh -c "echo 's 7 1450 1150' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage"
sudo sh -c "echo 'm 2 2065 950' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage"
sudo sh -c "echo 'c' > /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage"
Затем в папке /etc/systemd/system создают файл с расширением .service, например, overclock.service с таким содержимым:
[Unit]
Description=Change GPU core and memory clocks
[Service]
Type=oneshot
ExecStart=/usr/bin/overclock
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Потом выполняют команду:
sudo systemctl enable overclock.service
которая включает автозагрузку скрипта в виде системной службы.
Работоспособность автозагрузки скрипта можно проверить после перезагрузки командой:
cat /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/pp_od_clk_voltage
Аналогичные операции можно сделать более простым путем с помощью утилит wolfamdctrl, AMDCOVC, или amdgpu-clocks, но это тема других статей.



7 комментариев
Павел
Скажите, на xubuntu 18.04 с каким ядром и версией драйверов будет нормально работать регулировка частоты и вольтажа в майнере и 6 видеокарт?
cryptoprofi
Как правило, наилучшие результаты показывает последняя официальная версия ядра. На практике результаты могут отличаться из-за различий в используемом железе, настройках системы. Видеокарты AMD ведут себя довольно капризно, поэтому иногда приходиться долго искать для них приемлемую конфигурацию. Из-за этого я сейчас использую Linux только для старых АМД R9 290 с пониженным напряжением, прописанным в BIOS, четверки RX у меня сейчас работают на Windows 8.1 Embedded с драйверами от Robinhood, пока проблем с Ethereum нет, хотя скоро придется и их переводить на Linux. Тогда поделюсь своим опытом их настройки для получения стабильного даунвольтинга и разгона, сравнимого с восьмеркой.
Павел
Я кое-как вышел из ситуации. Могу рассказать что и как делал.
cryptoprofi
Павел, спасибо за комментарий. Если не затруднит, был был бы рад прочесть Ваш способ разгона и даунвольтинга. Было бы интересно сравнить достигнутое потребление по измерителю мощности на Винде и Лине. Заранее спасибо.
Павел
Дайте телегу туда все изложу.
Две недели отмучался, с начала выяснил как прошивать Поларисы, чтобы дайнвольт работал при правке биоса (если нет параметра оффсета), потом этот метод был признан черезчур узкоспециализированным под ethash и было решено даунволтить на уровне Ос. Если бы я тогда знал сколько это мучений наверно не связывался бы.
cryptoprofi
Согласен с вами, я потому и отказался от Linux для RX-ов, потому что на Windows 8.1 все летает, настройки минимальны, жор карт тоже.
blackwhite
Сначала в примере приводится «sudo sh -c «echo ‘s 7 1140 890′»,
а затем в скрипте «sudo sh -c «echo ‘s 7 1450 1150′»