Hybrid graphics (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Hybrid graphics. Дата последней синхронизации: 6 июля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Гибридная графика - это концепция, предполагающая использование двух графических карт на одном компьютере. Производители ноутбуков разработали технологии, предусматривающие использование двух графических карт с разными возможностями и энергопотреблением на одном компьютере. Гибридная графика была разработана для поддержки как высокой производительности, так и энергосбережения за счет неактивности выделенного/дискретного графического процессора, если не требуется производительность 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-powerAUR, включите system76-power.service и запустите system76-power graphics hybrid.