Hybrid graphics (Español)
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.
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.
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.
Usando acpi_call
En caso contrario, y para GPUs no soportadas por bbswitch, se puede hacer lo mismo manualmente instalando el paquete acpi_call.
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.
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.