Hybrid graphics (Español)

From ArchWiki
Esta traducción de Hybrid graphics fue revisada el 2024-03-08. Si existen cambios puede actualizarla o avisar al equipo de traducción.

El concepto de gráficos híbridos incluye dos tarjetas gráficas en un mismo ordenador. Los fabricantes de portátiles han desarrollado tecnologías que incluyen dos tarjetas gráficas con capacidades y consumos diferentes en un mismo ordenador. Los gráficos híbridos se han desarrollado para ofrecer un alto rendimiento y ahorrar energía manteniendo inactivo el procesador gráfico dedicado/discreto a menos que se necesite más rendimiento de renderizado 3D que el procesador gráfico integrado.

Existe una gran variedad de tecnologías y cada fabricante ha desarrollado su propia solución a este problema. Esta tecnología está bien soportada en Windows, pero todavía está muy poco desarrollada en las distribuciones Linux. Este artículo intentará explicar un poco cada enfoque y describir algunas soluciones comunitarias a la falta de soporte de los sistemas GNU/Linux por parte de los fabricantes.

Nota: A menos que tu equipo sea antiguo (anterior a 2010), es probable que utilice un modelo de cambio dinámico. Las soluciones gráficas híbridas anteriores implicaban un reinicio del equipo o bien, un reinicio completo de la plataforma gráfica que necesitaba de un cierre de sesi para surtir efecto.

Cambio dinámico

La mayoría de las nuevas tecnologías de gráficos híbridos incluyen dos tarjetas gráficas: la dedicada y la integrada están conectadas a un framebuffer y no hay multiplexor por hardware. La tarjeta integrada está siempre encendida y la tarjeta dedicada se enciende y apaga cuando es necesario ahorrar energía o mejorar el rendimiento. En la mayoría de los casos, no hay forma de utilizar sólo la tarjeta dedicada y toda el cambio y renderización se controla por software. Al iniciar, el kernel de Linux comienza a utilizar un modo de vídeo y a configurar los controladores gráficos de bajo nivel que utilizarán las aplicaciones. La mayoría de las distribuciones Linux utilizan X.org para crear un entorno gráfico. Por último, se lanzan algunos otros programas, primero un gestor de inicio de sesión y luego un gestor de ventanas, y así sucesivamente. Este sistema jerárquico ha sido diseñado para ser utilizado en la mayoría de los casos con una sola tarjeta gráfica.

Nota: Lea NVIDIA Optimus y Bumblebee para detalles sobre NVIDIA usando gráficos híbridos con el driver propietario de NVIDIA. Lea PRIME para básicamente todo lo demás (como GPUs AMD o NVIDIA con el driver nouveau).

GPU discreta totalmente apagada

Puede que quieras desactivar el procesador gráfico de alto rendimiento para ahorrar batería.

Usando BIOS/UEFI

Algunos fabricantes de portátiles ofrecen un conmutador en la BIOS o UEFI para desactivar por completo la tarjeta dedicada.

Usando reglas udev

Asegúrese de que se ha eliminado cualquier configuración del gestor de pantalla para NVIDIA.

Ponga en la lista negra los controladores nouveau creando

/etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

A continuación, cree

/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"

Reinicia y ejecuta lspci para ver si tu GPU NVIDIA sigue apareciendo en la lista.

Usando bbswitch

Con una GPU NVIDIA, esto se puede hacer de forma más segura utilizando bbswitch, que consiste en un paquete del kernel que emite automáticamente las llamadas ACPI correctas para desactivar la GPU discreta cuando no se necesita, o automáticamente en el arranque.

Nota: bbswitch no funciona con el método de gestión de energía de puertos PCI-E desde kernel 4.8. Vea Bumblebee#Broken power management with kernel 4.8 para más detalles.

Usando acpi_call

En caso contrario, y para GPUs no soportadas por bbswitch, se puede hacer lo mismo manualmente instalando el paquete acpi_call.

Sugerencia: Para kernels que no estén en los Repositorios Oficiales, el paquete acpi_call-dkms es una alternativa. Vea también DKMS.

Una vez instalado cargue el módulo del kernel:

# modprobe acpi_call

Con el módulo del kernel cargado, ejecuta el script en /usr/share/acpi_call/examples/turn_off_gpu.sh

El script recorrerá todos los buses de datos conocidos e intentará apagarlos. Obtendrá una salida similar a la siguiente:

# /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

¿Ves el "works"? Esto significa que el script ha encontrado un bus en el que se encuentra tu GPU y ahora ha apagado el chip. Para confirmarlo, el tiempo de batería restante debería haber aumentado.

Sugerencia: Si tiene problemas para hibernar o suspender el sistema después de desactivar la GPU, intente activarla de nuevo enviando la llamada acpi_call correspondiente. Véase también Archivos de servicios para suspender/reanudar.
Apagado automático de la GPU

Actualmente, el chip se volverá a encender con el siguiente reinicio. Para evitarlo utilize la carga automática de módulos:

/etc/modules-load.d/acpi_call.conf
#Load 'acpi_call.ko' at boot.
acpi_call
Durante el inicio

Para desactivar la GPU en el arranque es posible utilizar systemd-tmpfiles.

/etc/tmpfiles.d/acpi_call.conf

w /proc/acpi/call - - - - \\_SB.PCI0.PEG0.PEGP._OFF

La configuración anterior será cargada al iniciar por systemd. Lo que hace es escribir la señal OFF específica en el fichero /proc/acpi/call. Obviamente, sustituya _SB.PCI0.PEG0.PEGP._OFF por la que funcione en tu sistema (ten en cuenta que debes "escapar" la barra invertida).

Tras la inicialización del servidor X

En algunos sistemas, apagar la GPU discreta antes de inicializar el servidor X puede colgar el sistema. En estos casos, puede ser mejor desactivar la GPU después de la inicialización del servidor X, lo que es posible con algunos gestores de pantalla. En LightDM, por ejemplo, el parámetro de configuración de seat display-setup-script puede utilizarse para ejecutar un script como root que deshabilite la GPU.

System76

Algunos portátiles de System76 (como el Oryx Pro) tienen su propia y exclusiva opción de gráficos híbridos. Para hacer uso de ella, instale system76-powerAUR, habilite system76-power.service, y ejecute system76-power graphics hybrid.

Apagado completo de la GPU discreta

Primero asegúrese de que estás usando el modo de gráficos integrados ejecutando system76-power graphics integrated y reiniciando. Una vez en modo integrado, para apagar la tarjeta gráfica discreta ejecute system76-power graphics power off. Este comando no es persistente y deberá ejecutarse después de cada arranque.