Hybrid graphics (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Hybrid graphics
. Дата последней синхронизации: 6 июля 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
NVIDIA Optimus (Русский)
PRIME
Xorg (Русский)
External GPU
Гибридная графика - это концепция, предполагающая использование двух графических карт на одном компьютере. Производители ноутбуков разработали технологии, предусматривающие использование двух графических карт с разными возможностями и энергопотреблением на одном компьютере. Гибридная графика была разработана для поддержки как высокой производительности, так и энергосбережения за счет неактивности выделенного/дискретного графического процессора, если не требуется производительность 3D-рендеринга по сравнению с интегрированным графическим процессором.
Существует множество технологий, и каждый производитель разработал свое собственное решение этой проблемы. Эта технология хорошо поддерживается в Windows, но в дистрибутивах Linux она еще не получила должной поддержки. В этой статье мы попытаемся немного рассказать о каждом подходе и описать некоторые решения сообщества, связанные с отсутствием поддержки GNU/Linux систем производителями.
Примечание
Если ваша установка не относится к периоду до 2010 года, она, скорее всего, использует модель динамического переключения. Предыдущие гибридные графические решения включали либо перезагрузку для самых грубых, либо полный перезапуск графического стека, который требовал повторного входа в систему для вступления в силу.
Динамическое переключение
Большинство новых технологий гибридной графики предполагают использование двух графических карт: выделенная и интегрированная карты подключаются к фреймбуферу, при этом аппаратный мультиплексор отсутствует. Интегрированная карта всегда включена, а выделенная карта включается/выключается, когда есть необходимость в энергосбережении или рендеринге производительности. В большинстве случаев нет возможности использовать
только
выделенную карту, и все переключения и рендеринг контролируются программно.
При запуске ядро Linux начинает использовать видеорежим и устанавливать низкоуровневые графические драйверы, которые будут использоваться приложениями. Большинство дистрибутивов Linux затем используют X.org для создания графической среды. Наконец, запускается несколько других программ, сначала менеджер входа в систему, затем оконный менеджер и так далее. Эта иерархическая система была разработана для использования в большинстве случаев на одной графической карте.
Примечание
Прочитайте статьи
NVIDIA Optimus (Русский)
и
Bumblebee (Русский)
для подробностей об использовании NVidia гибридной графики с проприетарным драйвером NVidia. Читайте
PRIME
, чтобы узнать обо всем остальном (например, о графических процессорах AMD Radeon и NVidia с драйвером Nouveau).
Полное отключение питания дискретного GPU
Вы можете отключить высокопроизводительный графический процессор для экономии заряда батареи.
Использование BIOS/UEFI
Некоторые производители ноутбуков предоставляют переключатель в BIOS или UEFI для полной деактивации выделенной карты.
Использование правил udev
Убедитесь, что все настройки экранного менеджера, связанные с NVIDIA, удалены.
Внесите драйверы nouveau в черный список, создав
/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
Затем создайте
/etc/udev/rules.d/00-remove-nvidia.rules
# Remove NVIDIA USB xHCI Host Controller devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"

# Remove NVIDIA USB Type-C UCSI devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"

# Remove NVIDIA Audio devices, if present
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"

# Remove NVIDIA VGA/3D controller devices
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x03[0-9]*", ATTR{power/control}="auto", ATTR{remove}="1"
Перезагрузитесь и запустите
lspci
, чтобы проверить, есть ли ваш графический процессор NVIDIA в списке.
Использование bbswitch
С графическим процессором NVidia это можно сделать более безопасно, используя
bbswitch
, который состоит из пакета ядра, автоматически выдающего правильные вызовы ACPI для отключения дискретного GPU, когда он не нужен, или автоматически при загрузке.
Примечание
bbswitch не работает с методом управления питанием портов PCI-E, начиная с версии ядра 4.8. Подробности смотрите в
Bumblebee#Broken power management with kernel 4.8
.
Использование acpi_call
В противном случае, а также для GPU, не поддерживаемых bbswitch, это можно сделать вручную, установив пакет
acpi_call
.
Tip
Для ядер, отсутствующих в
официальных репозиториях
, альтернативой является
acpi_call-dkms
. Смотрите также
DKMS
.
После установки загрузите модуль ядра:
# modprobe acpi_call
Загрузив модуль ядра, выполните скрипт по адресу
/usr/share/acpi_call/examples/turn_off_gpu.sh
.
Скрипт пройдет по всем известным шинам данных и попытается их отключить. Вы получите результат, подобный следующему:
# /usr/share/acpi_call/examples/turn_off_gpu.sh
Trying \_SB.PCI0.P0P1.VGA._OFF: failed
Trying \_SB.PCI0.P0P2.VGA._OFF: failed
Trying \_SB_.PCI0.OVGA.ATPX: failed
Trying \_SB_.PCI0.OVGA.XTPX: failed
Trying \_SB.PCI0.P0P3.PEGP._OFF: failed
Trying \_SB.PCI0.P0P2.PEGP._OFF: failed
Trying \_SB.PCI0.P0P1.PEGP._OFF: failed
Trying \_SB.PCI0.MXR0.MXM0._OFF: failed
Trying \_SB.PCI0.PEG1.GFX0._OFF: failed
Trying \_SB.PCI0.PEG0.GFX0.DOFF: failed
Trying \_SB.PCI0.PEG1.GFX0.DOFF: failed
Trying \_SB.PCI0.PEG0.PEGP._OFF: works!
Trying \_SB.PCI0.XVR0.Z01I.DGOF: failed
Trying \_SB.PCI0.PEGR.GFX0._OFF: failed
Trying \_SB.PCI0.PEG.VID._OFF: failed
Trying \_SB.PCI0.PEG0.VID._OFF: failed
Trying \_SB.PCI0.P0P2.DGPU._OFF: failed
Trying \_SB.PCI0.P0P4.DGPU.DOFF: failed
Trying \_SB.PCI0.IXVE.IGPU.DGOF: failed
Trying \_SB.PCI0.RP00.VGA._PS3: failed
Trying \_SB.PCI0.RP00.VGA.P3MO: failed
Trying \_SB.PCI0.GFX0.DSM._T_0: failed
Trying \_SB.PCI0.LPC.EC.PUBS._OFF: failed
Trying \_SB.PCI0.P0P2.NVID._OFF: failed
Trying \_SB.PCI0.P0P2.VGA.PX02: failed
Trying \_SB_.PCI0.PEGP.DGFX._OFF: failed
Trying \_SB_.PCI0.VGA.PX02: failed
Видите "works"? Это означает, что скрипт нашел шину, на которой находится ваш GPU, и теперь отключил чип. Чтобы подтвердить это, оставшееся время работы батареи должно увеличиться.
Совет
Если у вас возникли проблемы с переходом в спящий режим или приостановкой системы после отключения GPU, попробуйте включить его снова, отправив соответствующий вызов acpi_call. Смотрите также
Power management (Русский)#Файлы служб
.
Автоматическое выключение графического процессора
В настоящее время чип включается при следующей перезагрузке. Чтобы обойти это, добавьте модуль ядра в массив модулей, загружаемых при загрузке:
/etc/modules-load.d/acpi_call.conf
#Load 'acpi_call.ko' at boot.

acpi_call
При загрузке
Для отключения GPU при загрузке можно использовать
systemd-tmpfiles
.
/etc/tmpfiles.d/acpi_call.conf
w /proc/acpi/call - - - -
\\_SB.PCI0.PEG0.PEGP._OFF
Приведенная выше конфигурация будет загружена при загрузке systemd. Что она делает, так это записывает определенный сигнал OFF в файл
/proc/acpi/call
. Очевидно, замените
\_SB.PCI0.PEG0.PEGP._OFF
на тот, который работает в вашей системе (обратите внимание, что нужно экранировать обратную косую черту).
После инициализации X-сервера
В некоторых системах отключение дискретного GPU до инициализации X-сервера может привести к зависанию системы. В таких случаях лучше отключить GPU после инициализации X-сервера, что возможно с некоторыми экранными менеджерами. В
LightDM
, например, параметр конфигурации места
display-setup-script
можно использовать для выполнения скрипта от имени root, который отключает GPU.
System76
Некоторые ноутбуки System76 (например,
Oryx Pro
) имеют собственную уникальную опцию гибридной графики.  Чтобы воспользоваться ею, установите
system76-power
AUR
,
включите
system76-power.service
и запустите
system76-power graphics hybrid
.