NVIDIA Optimus (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи NVIDIA Optimus. Дата последней синхронизации: 25 мая 2024. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

NVIDIA Optimus — технология, обеспечивающая совместную работу интегрированной графики и дискретной графики NVIDIA на ноутбуках.

Доступные методы

Есть несколько способов организовать работу интегрированной и дискретной графики:

  • #Использование только встроенной графики — позволяет сэкономить энергию за счёт полного отключения графики NVIDIA.
  • #Использование только графики NVIDIA — даёт более высокую производительность, но и быстрее расходует заряд батареи. Здесь используется тот же базовый процесс, что и в вариантах с optimus-manager и nvidia-xrun. Его следует использовать для решения проблем и проверки общей функциональности, прежде чем прибегать к одному из более автоматизированных подходов.
  • Использование и интегрированной, и дискретной графики (с отключением дискретной графики, когда она не используется):
    • #Использование PRIME render offload — официальный метод NVIDIA для поддержки переключаемой графики.
    • #Использование optimus-manager — переключает графику одной командой (для применения изменений нужно перезайти в систему). Также поддерживает гибридный режим с PRIME render offload. Позволяет получить максимальную производительность графики NVIDIA и отключает её, когда она не используется. С версии 1.4 также поддерживается комбинация AMD+NVIDIA.
    • #Использование nvidia-xrun — запускает отдельную X-сессию на другом TTY с графикой NVIDIA. Позволяет получить максимальную производительность графики NVIDIA и отключает её, когда она не используется.
    • #Использование Bumblebee — подобно Windows, позволяет запускать отдельные приложения на графике NVIDIA, используя интегрированную графику для всего остального. Однако реализация Bumblebee имеет проблемы с производительностью.
    • #Использование switcheroo-control — похоже на Bumblebee, но для GNOME. Позволяет задать предпочтительную графику через ярлыки приложений, а также позволяет вручную запускать любое приложение на NVIDIA через меню правой кнопки мыши.
    • #Использование nouveau — по сравнению с проприетарным драйвером NVIDIA хуже производительность и могут быть проблемы с ждущим режимом.
    • #Использование EnvyControl — похоже на optimus-manager, но не требует обширной настройки или наличия демона, работающего в фоновом режиме, а также установки патченого GDM, если вы используете GNOME.
    • #Использование NVidia-eXec — похоже на Bumblebee, но без проблем с производительностью. Работает как на Xorg, так и на Wayland. Этот пакет является экспериментальным и в настоящее время тестируется только под GNOME/GDM.
    • #Использование nvidia-switch — похоже на nvidia-xrun, но не требует изменения TTY, переключения будут осуществляться при входе и выходе в экранном менеджере. Этот пакет тестируется в Debian, но, как и nvidia-xrun, он должен работать во всех Linux-системах.
Примечание: Все эти варианты являются взаимоисключающими. Если вы протестируете один способ и решите попробовать другой, то перед использованием другого способа убедитесь, что все изменения в настройках, сделанные для предыдущего способа, были убраны, иначе могут случиться конфликты и неопределённое поведение.

Использование только встроенной графики

Если вы хотите использовать только определённый GPU без переключения между ними, поищите соответствующую настройку в BIOS — там должна быть опция отключения одного из GPU. Некоторые ноутбуки позволяют отключить только дискретную графику или наоборот, но проверить всё равно стоит.

Если BIOS не позволяет отключить графику NVIDIA, её можно отключить через Linux, как описано в разделе Гибридная графика#Полное отключение питания дискретного GPU.

Использование дискретной графики только для CUDA

Если вы хотите использовать графику NVIDIA для CUDA, но не для рендеринга, достаточно перед запуском CUDA-приложения убедиться, что дискретная графика NVIDIA включена. Подробнее в разделе Гибридная графика#Полное отключение питания дискретного GPU.

При запуске CUDA-приложения автоматически подгрузятся нужные модули ядра. Перед отключением дискретной графики модули nvidia нужно будет выгрузить:

# rmmod nvidia_uvm
# rmmod nvidia

Использование только графики NVIDIA

Проприетарный драйвер NVIDIA может быть настроен как «primary rendering provider». Он также имеет заметные проблемы с разрывом экрана, если не включить prime sync, включив NVIDIA (Русский)#DRM kernel mode setting, смотрите [1] для более подробной информации. Он позволяет использовать дискретную графику и имеет (по состоянию на январь 2017 года) заметное преимущество в производительности по сравнению с драйвером nouveau.

Сначала установите драйвер NVIDIA и xorg-xrandr. Затем настройте /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf, параметры которого будут объединены со стандартным /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf для обеспечения совместимости с этой установкой.

Примечание: В некоторых системах эта настройка нарушает автоматическое определение параметров монитора драйверами nvidia через файл EDID. Обходной путь описан в разделе #Неправильное разрешение экрана, ошибки EDID в Xorg.log.
/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection

Затем добавьте эти две строки в начале файла ~/.xinitrc:

~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Перезагрузитесь для загрузки драйверов, и после этого X должен успешно запуститься.

Если DPI экрана неверный, добавьте также такую строку:

xrandr --dpi 96

Если при загрузке X появился черный экран, удостоверьтесь, что в файле ~/.xinitrc нет & перед xrandr. Если & есть, то видимо оконный менеджер запускается раньше, чем команда xrandr завершает выполнение, что и приводит к черному экрану.

Экранные менеджеры

Если вы используете экранный менеджер, то вместо ~/.xinitrc нужно создать или отредактировать тот скрипт настройки дисплея, который используется вашим экранным менеджером.

LightDM

Для LightDM:

/etc/lightdm/display_setup.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Сделайте скрипт исполняемым.

Теперь настройте LightDM для запуска скрипта, отредактировав раздел [Seat:*] в /etc/lightdm/lightdm.conf:

/etc/lightdm/lightdm.conf
[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

После перезагрузки экранный менеджер должен успешно запуститься.

SDDM

Для SDDM (который используется по умолчанию для KDE):

/usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM

Для GDM создайте два файла .desktop:

/usr/share/gdm/greeter/autostart/optimus.desktop
/etc/xdg/autostart/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer

Убедитесь, что GDM использует X в качестве бэкенда по умолчанию.

Проверка 3D

Чтобы проверить, что графика NVIDIA действительно используется, установите mesa-utils и запустите:

$ glxinfo | grep NVIDIA

Дополнительная информация

Более подробная информация есть в официальной документации NVIDIA: [2].

Использование переключаемой графики

Использование PRIME render offload

С выходом драйвера NVIDIA версии 435.17 появилась возможность использовать PRIME Render Offload. xf86-video-modesetting, xf86-video-amdgpu (450.57), и xf86-video-intel (455.38) официально поддерживаются как iGPU драйвера.

Чтобы запустить программу на карточке от NVIDIA, вы можете использовать prime-run - скрипт из nvidia-prime:

$ prime-run glxinfo | grep "OpenGL renderer"
$ prime-run vulkaninfo

Подробнее в разделе PRIME#PRIME render offload.

Использование nouveau

Смотрите статьи PRIME и Nouveau (Русский).

Использование Bumblebee

Смотрите статью Bumblebee (Русский).

Использование switcheroo-control

Смотрите раздел PRIME#Gnome integration.

Использование nvidia-xrun

Смотрите статью nvidia-xrun (Русский).

Использование optimus-manager

Смотрите официальную документацию Optimus-manager.

Использование EnvyControl

Смотрите официальную документацию EnvyControl.

Использование NVidia-eXec

Смотрите официальную документацию NVidia-eXec.

Использование nvidia-switch

Смотрите официальную документацию nvidia-switch.

Решение проблем

Тиринг и неработающий VSync

Включите DRM kernel mode setting, который в свою очередь включит синхронизацию PRIME и исправит разрывы изображения.

См. также подробности в обсуждении на официальном форуме.

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)

Добавьте параметр ядра rcutree.gp_init_delay=1. [3] [4]

Неправильное разрешение экрана, ошибки EDID в Xorg.log

Эта ошибка возникает когда драйвер nvidia не определяет EDID для дисплея. Необходимо вручную указать путь к файлу EDID или предоставить ту же информацию подобным образом.

Для предоставления пути к файлу EDID отредактируйте раздел "Device" для NVIDIA в Xorg.conf, добавив эти строки. Не забудьте изменить поля в соответствии с вашей системой:

/etc/X11/xorg.conf
Section "Device"
    Option "ConnectedMonitor" "CRT-0"
    Option "CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid"
    Option "IgnoreEDID" "false"
    Option "UseEDID" "true"
EndSection

Если Xorg не запускается попробуйте поменять ссылки CRT на DFB. card0 это идентификатор чипа Intel, который подключен к дисплею с помощью LVDS. Если расположение аппаратных средств отличается, значение пользовательского EDID может быть другим. Путь же будет начинаться с /sys/class/drm.

Также можно сгенерировать EDID с помощью инструментов вроде read-edid и настроить драйвер на использование сгенерированного файла. Можно использовать даже modelines, но тогда не забудьте изменить UseEDID и IgnoreEDID.

Неправильное разрешение без ошибок EDID

nvidia-xconfig мог сгенерировать неверные настройки в xorg.conf, в частности, неверную частоту обновления монитора, что ограничивает возможные разрешения. Попробуйте закомментировать строки HorizSync/VertRefresh. Если это поможет, то, вероятно, вы также можете удалить всё остальное не упомянутое в этой статье.

Проблема блокировки (lspci зависает)

Симптомы: lspci виснет, переход в ждущий режим виснет, выключение виснет, optirun виснет.

Случается на некоторых новых ноутбуках с GTX 965M или подобными, когда используется bbswitch (например, через Bumblebee) или nouveau.

При включении питания дискретной графики может произойти сбой и зависание в коде ACPI (kernel bug 156341).

При использовании nouveau отключение управления питанием позволяет избежать этой проблемы. Для отключения добавьте параметр ядра nouveau.runpm=0.

Обходные пути для некоторых моделей описаны в issue 764 на GitHub. В других случаях вы можете попробовать загрузиться с параметром ядра acpi_osi="!Windows 2015" или acpi_osi=! acpi_osi="Windows 2009". (Возможно, стоит сообщить о вашей модели ноутбука в ранее упомянутом issue.)

No screens found

Проверьте вывод этой команды:

$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)

Драйверы NVIDIA поддерживают Optimus с версии 319.12 Beta [5] с ядрами 3.9 и новее.

Другое решение — установить драйвер Intel для управления экранами, а графику NVIDIA использовать только для запуска 3D-программ через Bumblebee.

Случайные зависания "(EE) NVIDIA(GPU-0): WAIT"

При использовании проприетарных драйверов в системе с интегрированной графикой AMD и дискретной графикой NVIDIA в качестве единственной используемой пользователи сообщают о зависаниях до 10 секунд со следующими ошибками в журнале Xorg:

[   219.796] (EE) NVIDIA(GPU-0): WAIT (2, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)
[   226.796] (EE) NVIDIA(GPU-0): WAIT (1, 8, 0x8000, 0x0002e1c4, 0x0002e1cc)

Точная причина происходящего ещё не известна, но, похоже, она связана с конфликтом в том, как интегрированная и выделенная карты взаимодействуют с Xorg.

Обходным решением является использование переключаемой графики — смотрите раздел PRIME#PRIME render offload.

"No Devices detected" при использовании optimus-manager

В некоторых случаях lspci отображает PCI domain в первой колонке вывода, из-за чего optimus-manager имеет проблемы с обработкой BusID.

Если у вас чёрный экран и графический интерфейс не появляется или появляется частично или Xorg падает с ошибкой (EE) - No Devices detected, смотрите issue 471 на GitHub.

Xorg: изображение на внешнем мониторе обновляется только при перемещении мыши

Обходным решением является удаление драйвера Xorg для встроенной графики (например, xf86-video-amdgpu или xf86-video-intel) [6]. Это должно сработать, если порт внешнего монитора (HDMI/DP/USB-C) подключен напрямую к графике NVIDIA.

Совет: Поведение рабочего стола может стать странным (например, переключение виртуальных рабочих столов или Alt-Tab замораживает изображение на внешнем мониторе), что также можно обойти отключением монитора ноутбука.

Низкое энергопотребление (TDP)

Начиная с версии драйвера 530.41 графика NVIDIA может оставаться на низком уровне энергопотребления (GitHub issue 483). В драйвере была отключена возможность ручной установки лимита энергопотребления с через nvidia-smi, из-за чего многие ноутбуки остаются с плохой производительностью.

Чтобы обойти эту проблему (для поколения Ampere и новее), запустите/включите службу nvidia-powerd.service, которая включает DynamicBoost.

Графика NVIDIA не отключается или отключается ненадолго

Если вы используете мониторинг температуры, он скорее всего вызывает nvidia-smi для её получения, что приводит к пробуждению дискретной графики и повышению энергопотребления.

Проверьте состояние графики:

$ cat /sys/bus/pci/devices/0000\:01\:00.0/power/runtime_status

Если состояние active, то перепроверьте, нет ли у вас запущенных инструментов мониторинга, использующих nvidia-smi.