12. Гибридная графика в ноутбуках#

12.1. Что такое гибридная графика?#

Гибридная графика - это аппаратная конфигурация, в которой есть две и более видеокарт, которые могут работать в тандеме друг с другом. Такой подход встречается в основном в ноутбуках, где есть интегрированная графика (iGPU) от процессора и дискретная графика (dGPU). Его основное преимущество заключается в том, что интегрированная графика должна (но не обязательно) использоваться только для малозатратных задач, таких как серфинг в Интернете, просмотр видео и т. д. А дискретная графика используется для видеоигр, видеомонтажа, 3D-моделирования и так далее. Следовательно, если два GPU разделяют "большие" и "маленькие" задачи, и в данный момент выполняются только "маленькие" задачи, то нет никакого смысла в работе dGPU, поэтому его можно просто временно отключить (то есть усыпить), тем самым значительно снизив энергопотребление. Таким образом, когда dGPU снова понадобится (мы запустим приложение, которое его использует), он проснется и возобновит работу.

12.2. Что такое PRIME?#

PRIME - это универсальная технология для работы с различными наборами гибридной графики в Linux, такими как NVIDIA Optimus/AMD Dynamic Switchable Graphics. PRIME Offload - это реализация идеи переноса выполнения рендеринга с одного GPU на другой, но вот отображением уже готовых кадров на экран заниматься будет тот GPU, который управляет дисплеем в данный момент, как правило это встроенная графика. Поддержка PRIME в закрытом драйвере NVIDIA фактически началась только с драйвера 435.17, поэтому если вы являетесь пользователем устаревшей ветки драйверов 390xx или даже 340xx, PRIME Offload не будет работать для вас.

Обратите внимание, что автор настоятельно не рекомендует вам использовать устаревшие способы использования гибридной графики, такие как nvidia-xrun или Bumblebee. Они устарели и не поддерживаются (Bumblebee не обновлялся уже более 8 лет), работают исключительно на убогих хаках и имеют низкую производительность. В то же время открытый драйвер Nouveau поддерживает PRIME Offload, что может стать неплохой альтернативой для старых dGPU.

Кроме того, пожалуйста, избегайте использования таких инструментов, как optimus-manager. Они могут показаться вам очень удобными, но поверьте, они могут вызвать множество проблем, и они вам на самом деле не нужны, если ваш графический процессор поддерживает PRIME Offload и динамическое управление питанием.

12.3. Настройка PRIME#

Для того чтобы заставить работать PRIME в закрытом драйвере NVIDIA, необходимо включить поддержку KMS (указать параметр nvidia-drm.modeset=1), что уже подробно описывалось в разделе Первые шаги (Включение поддержки KMS). При условии, что все модули NVIDIA загружаются правильно, а проверить это можно при помощи команды lspci -k | grep "Kernel driver in use: nvidia", вы уже можете полноценно использовать вашу дискретную видеокарту. Никакой дополнительной настройки Xorg делать не нужно!. Для современных версий драйвера все должно работать из коробки.

Примечание

Если модули драйвера NVIDIA по какой-то причине не загружаются, убедитесь, что вы отключили Secure Boot в настройках UEFI.

Для конфигураций, где обе видеокарты управляются открытыми драйверами Mesa (к примеру AMD+AMD, AMD+Intel или даже Intel+NVIDIA, где дискретная графика NVIDIA находится под управлением открытого драйвера Nouveau), ничего настраивать не нужно и для использования дискретной графики нужно лишь указать переменную окружения DRI_PRIME=1 перед запуском приложений или игр по аналогии со всеми переменными, которые будут описаны далее для NVIDIA или использовать уже готовые графические способы.

12.3.1. Динамическое управление питанием#

Поддержка динамического управления питанием вашей дискретной видеокарты позволяет драйверу полностью отключать её питание на время простоя, то есть когда в ней нет необходимости, она просто уходит в состоянии сна не потребляя никакой энергии. К сожалению, она доступна не для всех и работает только для мобильных видеокарт NVIDIA начиная с поколения Turing (16xx/20xx) и выше. Для видеокарт поколения Ampere её поддержка включена по умолчанию и никаких дополнительных действий производить не нужно, однако если вы являетесь обладателем графики именно поколения Turing, то вам так же понадобиться создать дополнительные файлы настройки и правила udev, которые будут выполнять настройку динамического управления питания при каждом запуске. Для этого просто создайте файл под названием /etc/udev/rules.d/71-nvidia.rules со следующим содержанием:

sudo nano /etc/udev/rules.d/71-nvidia.rules#
ACTION=="add|bind", SUBSYSTEM=="pci", DRIVERS=="nvidia", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="remove|unbind", SUBSYSTEM=="pci", DRIVERS=="nvidia", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", TEST=="power/control", ATTR{power/control}="on"

Вам также потребуется изменить значение параметра для модуля драйвера NVIDIA, который и активирует работу динамического управления питанием:

sudo nano /etc/modprobe.d/nvidia-dynamic-powermanagment.conf#
options nvidia NVreg_DynamicPowerManagement=0x02

После чего рекомендуется обновить образы initramfs через команду sudo mkinitcpio -P и перезагрузиться. Чтобы убедиться, что все работает правильно нужно проверить вывод команды cat /proc/driver/nvidia/gpus/*/power, он должен быть примерно следующим:

Runtime D3 status:          Enabled (fine-grained)
Video Memory:               Active

GPU Hardware Support:
 Video Memory Self Refresh: Supported
 Video Memory Off:          Supported

S0ix Power Management:
 Platform Support:          Supported
 Status:                    Disabled

12.4. Использование PRIME Offload#

Чтобы указать, что вы хотите использовать дискретную графику вместо встроенной, перед запуском программы необходимо указать несколько переменных окружения:

__NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia <program>

Такой набор переменных выглядит очень громоздким и его легко забыть, поэтому вы можете установить пакет nvidia-prime (sudo pacman -S nvidia-prime), который содержит скрипт-псевдоним prime-run для всех этих переменных. Тогда запуск приложения с его помощью будет выглядеть следующим образом:

prime-run  <program>

Где <program> - это имя команды, запускающей ваше приложение. Например, вы можете запустить команду glxinfo, чтобы проверить корректность работы PRIME Offload:

prime-run glxinfo | grep OpenGL

Если вывод данной команды даёт вам упоминание вашей дискретной видеокарты, значит вы всё сделали правильно. При возникновении проблем, советуем вам перепроверить правильность установки драйвера NVIDIA и загрузки всех модулей.

12.4.1. Графический способ#

Возможно, запуск всех необходимых приложений через терминал с помощью prime-run покажется вам не слишком удобным, но некоторые приложения позволяют вам указывать запуск игр/других приложений с использованием дискретной графики через специальные настройки.

12.4.1.1. Lutris#

Чтобы настроить запуск игр с использованием дискретной графики в Lutris, нужно зайти в настройки (три полоски в правом верхнем углу окна и кнопка "Настройки"). Далее перейдите в раздел "Global options" -> "Display" -> GPU". Здесь вы выбираете графический процессор, с которым будет запускаться игра.

../_images/lutris-prime.png

12.4.1.2. Steam#

В Steam нет специальных настроек для запуска игр с дискретной графикой, но вы можете нажать на "Шестеренку" и перейти в "Свойства" перед запуском игры, после чего прописать команду prime-run %command% или указанные ранее переменные окружения, например:

../_images/steam-prime.png

12.4.1.3. Графические окружения#

Ряд пользовательских окружений таких как KDE Plasma, Cinnamon и GNOME имеют встроенную интеграцию с PRIME при помощи специального инструмента как switcheroo-control. Чтобы получить заветную удобную кнопку для запуска приложений с использованием дискретной графики в данных окружениях и без необходимости лезть в терминал, вы должны установить данный пакет и включить соответствующую службу:

sudo pacman -S switcheroo-control
sudo systemctl enable --now switcheroo-control

Примечание

Использование switcheroo-control позволяет работать описанным ниже графическим способам на всех конфигурациях PRIME, в которых даже нет NVIDIA dGPU, например AMD+AMD.

12.4.1.3.1. KDE Plasma#

После установки switcheroo-control щелкните правой кнопкой мыши на нужную вам значок приложения на рабочем столе или в меню приложений, затем перейдите в "Свойства" -> "Приложение" -> "Дополнительные параметры" -> "Запускать с использованием дискретной графики".

../_images/plasma-prime.jpg
12.4.1.3.2. Cinnamon#

По аналогии с Plasma в Cinnamon, вы также можете зайти в меню приложений, кликнуть правой кнопкой мыши по значку приложения и в появившемся контекстном меню выбрать "Свойства", после чего в появившемся меню поставить флажок "Использовать выделенный графический процессор, если он доступен".

../_images/cinnamon-prime.png
12.4.1.3.3. GNOME#

В GNOME также следует щелкнуть правой кнопкой мыши по значку приложения и выбрать "Запустить с дискретной графикой". Но учтите, что GNOME не запоминает этот выбор, и в следующий раз, когда вы просто щелкните по значку, приложение все равно будет работать с интегрированной графикой.