domingo, 27 de mayo de 2018

Configurar gráficos híbridos en Linux Ubuntu 18.04/20.04 LTS con PRIME

PRIME es la tecnología usada para administrar gráficos híbridos en Linux.
Como es de saber, los gráficos híbridos (anteriormente llamados gráficos intercambiables) sin MUX de Hardware (Modo dinámico) se administran en Windows a través de los perfiles de aplicación de "AMD Enduro" y "Nvidia Optimus" bajo el "Software de gestión gráfica". Pero, ¿Qué ocurre en Linux? ¿La gestión gráfica es la misma? ¿Qué drivers utilizar? ¿Cómo verificar si el dGPU está en funcionamiento? Si desean saber la respuesta, continúen la lectura.
NOTA: Esta publicación es válida para portátiles con gráficos híbridos equipados con un dGPU AMD o Nvidia, comúnmente llamados "AMD Enduro" o "Nvidia Optimus".
NOTA: No confundir "PRIME" con "Nvidia Prime", este último funciona únicamente con dGPUs Nvidia y bajo "Drivers Propietarios".
ADVERTENCIA: El rendimiento del dGPU Nvidia con PRIME es inferior (en algunos casos) al iGPU Intel. Si no desean utilizar PRIME, entonces pueden usar en su lugar Bumblebee o Nvidia Prime, pero tengan en cuenta que la guía expuesta no se aplicará a dichas alternativas.
ADVERTENCIA: Esta publicación es exclusiva para portátiles que carecen de un MUX de Hardware para conmutar GPUs.
ADVERTENCIA: Esta publicación requiere exclusivamente los "Drivers Open-Source" (Drivers Mesa incluidos en el kernel de Linux). Si desean seguir esta guía, entonces instalar un "Driver Open-Source" como: "nouveau", "amdgpu", "radeon", "intel", etc (Mesa).

Antes de empezar, trataré que esta publicación sea de fácil comprensión, pero también se necesitan ciertos requisitos para aplicarla y entenderla:

Requisitos de lectura
  1. Notebooks con Modo Fijo y Dinámico AMD
  2. Limitaciones de AMD Enduro
  3. Configurar Aplicaciones en AMD Enduro
Requisitos de software (Dependencias):
  1. mesa-utils
Comandos para instalar las dependencias:
  1. mesa-utils ("sudo apt-get install mesa-utils")
Con todo aclarado, empecemos.
La mayoría de portátiles actuales cuentan con gráficos híbridos, es decir, una combinación de un iGPU (generalmente Intel o AMD) mas un dGPU (generalmente AMD o Nvidia). El problema surge cuando deseamos utilizar nuestro dGPU con cierta aplicación de renderizado 3D y nos damos cuenta que no poseemos un "Software de gestión gráfica" como en Windows para realizar el trabajo.
Desde versiones anteriores de Linux, existen los "Drivers Open-Source" y los "Drivers Propietarios", los primeros son de código abierto y los segundos son exclusivos de los fabricantes (En este caso: AMD y Nvidia). Los Drivers Open-Source están incluidos por defecto en el sistema operativo, por lo que con una simple instrucción serán capaces de utilizar el dGPU.

Equipo de prueba:
  • HP Pavilion G4-2082la
  • Dual Boot: Windows 10 Build 1803 + Kubuntu 18.04 LTS
  • Intel HD 3000 + AMD Radeon HD 7670M
NOTA: Los "Driver Privativos" como los de Nvidia (en su estado actual) no se rigen como propone "Nvidia Optimus", por el contrario, se requiere un reinicio o cierre de sesión para ejecutar un solo GPU: iGPU o dGPU. De esta manera, no es posible utilizar ambos GPUs (iGPU para el escritorio y dGPU para renderizar). (El reinicio del sistema para cambiar de un GPU a otro, fue solucionado con el Kernel 4.18)

I. ¿Por qué realizar esta guía para Ubuntu 18.04 LTS?
Seré breve. Antes de Ubuntu 14.04 LTS la gestión gráfica era complicada, pero no imposible, además estaba el hecho que en ese entonces los portátiles empezaban a no incluir un MUX de Hardware para la conmutación. Si recordamos un poco la historia, este tipo de portátiles supuso un gran cambio y al inicio no funcionaban correctamente en Windows; entonces imaginen cómo de grande fue el problema para utilizar el dGPU en las distintas distribuciones de Linux.
Posteriormente, se incluyó PRIME (una tecnología para administrar los gráficos híbridos sin MUX de Hardware, únicamente para Drivers Open-Source), esto supuso una gran mejora, claro que aún tiene sus defectos, pero es muy funcional.
Y el por qué esta guía es para Ubuntu 18.04 LTS, simplemente porque es la última distribución de Ubuntu (al momento de redactar este artículo) y nada impide su aplicación a cualquier versión superior a la 14.04 LTS.

II. ¿Cómo saber si Ubuntu reconoce los GPUs?
Para los amantes de la terminal (si, usaremos de ahora en adelante la terminal), iniciaremos con los códigos a partir de aquí:
[1]. Abrir un terminal.
[2]. Escribir el siguiente comando:
  1. xrandr --listproviders
Iniciamos con la primera captura de un terminal.
Observamos que "Provider 0" se llama "modesetting" y el "Provider 1" tiene por nombre "TURKS @pci:0000:01:00.0".
El nombre "modesetting" es otra forma de decir "Intel" y "TURKS @pci:0000:01:00.0" es otra forma de decir "radeon".
Si aparecen 2 proveedores, entonces el sistema detectó ambos GPUs.

III. ¿Cómo configurar los gráficos híbridos?
Recordando las limitaciones de "AMD Enduro" y "Nvidia Optimus":
  1. El iGPU o APU es el GPU principal, todas las salidas de pantalla son conducidas por gráficos integrados (el dGPU complementa al iGPU).
  2. El dGPU se encargará del renderizado y copiará la información al iGPU para que la muestre en la salida (pantalla).
  3. El dGPU se encontrará apagado cuando no se realice ninguna tarea de renderizado.
NOTA: Si bien es cierto que la pantalla es controlada por el iGPU, esto se aplica al 100% con la pantalla del portátil, pero no necesariamente con una pantalla conectada por HDMI o DisplayPort. La gran mayoría de laptops no soportan esta característica, pero en las que sí, el dGPU tiene control exclusivo de la pantalla HDMI/DisplayPort no solo en AMD Enduro, si no en Nvidia Optimus a través de conexiones físicas.

Teniendo en cuenta estos datos, realizaremos lo siguiente:
[1]. Abrir un terminal.
[2]. Escribir los siguientes comandos:
  1. glxinfo | grep "OpenGL renderer"
  2. DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
El prefijo "DRI_PRIME=1" permite renderizar en el dGPU.
NOTA: Según la captura, ambos GPUs poseen Drivers Open-Source.
Como se observa, los dos códigos utilizados sólo se diferencian en un prefijo: DRI_PRIME=1

Entonces:
  1. Si deseamos renderizar una aplicación en el iGPU, usar DRI_PRIME=0 como prefijo u omitirlo.
  2. Si deseamos renderizar una aplicación en el dGPU, usar DRI_PRIME=1 como prefijo.

Como primer ejemplo, configuraremos un juego de Steam nativo para Linux:
[1]. Abrir Steam.
[2]. Ingresar a las "Propiedades" del juego.
[3]. Clic en "DEFINIR PARÁMETROS DE LANZAMIENTO"
[4]. Ingresar el siguiente comando como prefijo:
  1. DRI_PRIME=1 %command%
Configurando Left 4 Dead 2 Steam nativo de Linux.
[5]. Aceptamos y cerramos la ventana "Propiedades".
[6]. Ejecutamos el juego normalmente.
Left 4 Dead 2 Steam nativo para Linux. Existen caídas de FPS, pero aún así es jugable una vez se estabiliza.
NOTA: Tal como "MSI Afterburner" en Windows, estoy utilizando "GALLIUM_HUD" en Linux para monitorizar la actividad de mi equipo en tiempo real y así demostrar que se utiliza el dGPU. En el caso de ustedes, no verán los gráficos a no ser que activen GALLIUM_HUD.
NOTA: GALLIUM_HUD está incluido con los Driver Open-Source.

Como segundo ejemplo, configuraremos un juego de Windows utilizando Wine:
[1]. Abrir un terminal.
[2]. Ingresar a la ubicación del ejecutable del juego.
[3]. Escribir el siguiente prefijo seguido de la instrucción deseada:
  1. DRI_PRIME=1
Iniciando portal2.exe nativo de Windows con Wine en un terminal.
[4]. Presionar [ENTER] para ejecutar la instrucción.
Ejecutando portal2.exe nativo de Windows con Wine.
 
Como tercer ejemplo, configuraremos una aplicación desde su lanzador:
[1]. Abrir las propiedades de lanzamiento.
Lanzador de KDE Plasma.
[2]. Escribir el siguiente prefijo:
  1. env DRI_PRIME=1
Propiedades de lanzamiento de Steam.
[3]. Clic en Aceptar.
NOTA: En el caso de "Steam", al aplicar "DRI_PRIME=1", todos los juegos del catálogo se ejecutarán en el dGPU (no es necesario configurar cada juego dentro de la aplicación).
 
Como podemos observar, utilizar el dGPU en Linux es posible y muy fácil de realizar en la actualidad.

Como bonus, les comparto dos vídeos donde se visualiza la detección de la gráfica dedicada (utilizando Tomb Raider 2013 y Age of Empires II HD) al usar DRI_PRIME=1:

Configurar juegos wine Steam en el dGPU (Gráfica dedicada) en Linux

Configurar juegos wine no-steam en la gráfica dedicada y verificar con Monitor PRIME APP Indicator

.

IV. ¿Cómo verificar el estado de los gráficos híbridos sin programas?
Para realizar esta acción usaremos el comando "vga_switcheroo" integrado en el kernel. Este comando también nos permite conmutar GPUs si se cuenta con un MUX de Hardware.
Ahora, abriremos un terminal para verificar si el dGPU está en funcionamiento, para realizar las pruebas se utilizará Left 4 Dead 2 (versión Steam para Linux).

[1]. Sin Softwares de renderizado en ejecución, abrir un terminal y escribir el comando:
  1. sudo cat /sys/kernel/debug/vgaswitcheroo/switch
Este es mi escritorio, ahora dependo menos de Windows.
La salida mostrada posee el siguiente formato:
-Un número:
       0: GPU 0.
       1: GPU 1.
-Una cadena de texto:
       DIS: GPU discreta (AMD o Nvidia).
       IGD: GPU integrada (Intel o AMD).
       DIS-Audio: Dispositivo de audio exportado por el dGPU transmitido por HDMI.
-Un signo:
       '+': Dispositivo conectado a la salida de pantalla.
       ' ' : Dispositivo no conectado a la salida de pantalla.
-Un estado de energía:
       OFF: Dispositivo apagado.
       ON: Dispositivo encendido.
       DynOff: Dispositivo apagado, pero se encenderá cuando sea necesario.
       DynPwr: Dispositivo encendido, pero se apagará cuando no sea necesario.
-El PCI-ID del dispositivo:
       0000:01:00.0: ID del dGPU.
       0000:00:02.0: ID del iGPU.

Del gráfico observamos que el iGPU se encuentra encendido y conectado físicamente a la pantalla, en cambio el dGPU está apagado dinámicamente porque no lo hemos llamado con la orden DRI_PRIME=1.

Ahora, si ingresamos a Left 4 Dead 2 con DRI_PRIME=1 y volvemos a ingresar el comando anterior:
Left 4 Dead 2 nativo de Linux Steam. Ejecutándose en el dGPU.
Observamos que el dGPU se encuentra en el estado "DynPwr", en otras palabras se está utilizando para renderizar Lef 4 Dead 2, pero no controla la pantalla como se espera de "AMD Enduro" y "Nvidia Optimus".
Entonces, al igual que en Windows, si cerramos la aplicación de renderizado, por consiguiente el dGPU debería apagarse. Esto lo podemos verificar volviendo a introducir el comando anterior.

NOTA: La administración de energía de PRIME se encarga de apagar automáticamente el dGPU si ninguna aplicación lo utiliza. El tiempo para el apagado es de 5 s.
NOTA: Si se minimiza la aplicación o se superpone una ventana, entonces el dGPU funcionará a menor frecuencia para ahorrar energía, trayendo la consecuencia de reducir los FPS tal como en la captura anterior. Esto es debido a que la aplicación se encuentra en segundo plano y características de ahorro energético de PRIME.
Para finalizar, recomiendo la lectura de las siguientes publicaciones donde continúo explicando sobre GALLIUM_HUD (su personalización) y el método con interfaz gráfica para configurar y verificar los gráficos híbridos:
1. "Monitorizar gráficos híbridos en Linux Ubuntu 18.04 con GALLIUM HUD".
2. "Verificar el estado y configurar gráficos híbridos en Linux Ubuntu 18.04 LTS con PRIME (Método gráfico)".

Y es todo por hoy, ahora ya pueden gestionar sus GPUs en Linux Ubuntu.

REFERENCIAS:
1. "PRIME - ArchLinux.org".
2. "Nvidia Optimus - freedesktop.org".
3. "Como Manejar Gráficos Intercambiables en GNU/Linux".
4. "GALLIUM_HUD: FRAPS-LIKE FPS OVERLAY FOR LINUX".

Palabras finales
Hola a todos, aquí quantum-phy en otra publicación.
¿Cuanto tiempo a pasado? ¿Un mes?, ¿más tiempo, no recuerdo? :D. 
Primeramente me disculpo por la ausencia, estoy muy ocupado con el trabajo y demás actividades de la vida cotidiana; pero, eso no quiere decir que estoy sin hacer nada relacionado con la informática.
Como el disco duro de mi laptop HP está muriendo, decidí actualizar mi Linux Ubuntu 14.04 LTS a las versión 18.04 LTS antes de que pase lo peor :(. Estuve probando las Daily-Build y Betas, su interfaz gráfica me gustó, pero no me impresionó como Ubuntu GNOME. Además, se eliminó el escalado fraccionario, en otras palabras, mi nueva laptop DELL 7567 no visualizaría de buena manera la interfaz gráfica (o todos los elementos gráficos son exageradamente grandes o son extremadamente pequeños), así que investigando llegué a dos caminos (existen más), Ubuntu MATE 18.04 LTS o Kubuntu 18.04 LTS, me decidí por Kubuntu porque MATE ya lo había utilizado y también porque mi primer Linux fue SUSE (ahora se llama OpenSUSE). La interfaz Plasma me parece espectacular, además tuve que personalizarlo muy poco e incluye muchas librerías necesarias para mi trabajo.

Respecto al tema, siempre quise publicar en el Foro HP algo respecto a Linux con gráficos híbridos, pero al no ser necesario, nunca surgió la oportunidad. Un dato muy importante, para los usuarios que intentaron de todo y no pueden utilizar el dGPU de sus portátiles (dGPU AMD (8xxxM / R7 M2xx / R7 M3xx / R7 M4xx) no se usa correctamente), sería perfecto que prueben PRIME en Ubuntu. Entonces, si el dGPU sigue sin ser utilizado, es un problema físico de la placa madre y no un problema de software.

Finalmente, no piensen que configurar el dGPU en Linux siempre fue fácil, existe mucha historia de por medio, tuve que vivir esa época con el portátil de un compañero con MUX de Hardware, instalamos el Catalyst propietario y varias veces se bloqueaba el sistema, lo mismo con Nvidia, pero al final encontramos la solución después de tanto investigar.

Bien, pues ahora saben cómo configurar sus aplicaciones en Linux y también por las capturas que pueden instalar Office y ejecutar juegos de Windows xD. Además, pueden monitorizar la actividad del dGPU con GALLIUM_HUD disponible únicamente con los drivers Open-Source.

Espero que esta información sea de ayuda.
Un saludo.

Estado

=======================================
Recomiendo este post donde se recopila mucho contenido útil y en español para jugar en Linux.
-¿Jugar en Linux?, están locos estos pingüinos

[Linux] ¿Fidelity FX Super Resolution (FSR) en cualquier juego?
- Pruebas en el canal de YouTube

[Linux] GalliumToggle publicado en GitHub.
=======================================

quantum-phy (NestorBase11)

Videos Destacados

Entradas recientes