Revista Tecnología

Gráficos híbridos en GNU/Linux. Nvidia + Intel, poco a poco vamos avanzando.

Publicado el 21 agosto 2017 por Gaspar Fernández Moreno @gaspar_fm

Hace 6 años escribí un post con mi indignación acerca de los gráficos híbridos. Es decir, cuando un portátil o un sobremesa tiene dos chips gráficos. Normalmente, uno malillo, que puede ser un Intel, integrado en el procesador (aunque últimamente no son tan malillos) y uno mucho mejor, que puede ser un Nvidia o ATI que, sobre todo, para el procesamiento 3D o para aplicaciones GPGPU va a funcionar mucho mejor.

La semana que viene, publico un post con una guía para instalar Bumblebee con algunos detalles sobre problemas que me he encontrado con mi hardware y cómo lo solucioné.

Resumiendo un poco. Los chips se han abaratado muchísimo, y la tendencia desde hace unos años es reducir el consumo energético de los dispositivos. Así que muchos ordenadores nuevos (sobre todo portátiles, que deberían tener la mayor autonomía posible) tienen una GPU integrada dentro de la CPU. Ese chip gráfico funciona muy bien para gráficos 2D y le puedes pedir también que pinte cosas en 3D. Hace años, la capacidad 3D era muy limitada, aunque ahora es bastante decente, pero no alucinante. Eso sí, cuando te compras un equipo, puedes hacerlo con una gráfica dedicada que puede ser una Nvidia o una ATI, marcas que han demostrado tener gráficas muy potentes. Así que, la idea es tener la GPU dedicada (llamémosle discreta, en el sentido de separada) dormida siempre que sea posible, porque nada más alimentar y tener activa esta GPU va a consumir mucha energía. Por lo tanto, sólo la encenderemos cuando vayamos a hacer algo pesado y la GPU integrada no sea suficiente, es decir, cuando estemos tirando de juegos, procesamiento 3D, etc. Porque la GPU integrada no nos va a proporcionar la calidad que necesitamos ni los fps que requerimos.

El principio de los principios

La teoría es perfecta. Es todo fantástico y maravilloso. Al principio, la implementación era por BIOS. Cuando querías utilizar la tarjeta integrada (digamos, la Intel), entrabas, elegías que querías la Intel, iniciabas el sistema operativo y cuando querías utilizar la discreta, reiniciabas, entrabas en BIOS, elegías la otra y arrancabas de nuevo. El problema es que reiniciar da una pereza tremenda. Así que al final dejas siempre encendida la discreta y listo, ya no hay ahorro de energía.

Por cierto, según he leído, aún hay BIOS actuales que te dejan activar y desactivar la tarjeta discreta. Con alguna que otra manera de hacer ahorro energético. Incluso algunas BIOS actuales te dejan elegir a qué gráfica va conectada la salida a monitor. Ya veremos cómo eso es interesante.

Nvidia Optimus

Desde 2010, Nvidia sacó una tecnología para no tener que estar reiniciando todo el tiempo y que teóricamente podías tener aplicaciones corriendo con la tarjeta Intel y al mismo tiempo en alguna ventana podría haber gráficos tirando de la GPU Nvidia que estará sólo trabajando en esa región de la pantalla y durante el tiempo que está la aplicación funcionando. Mientras, la Nvidia se desactiva y no consume corriente. Así conseguimos ahorrar energía y, si no estamos haciendo nada muy potente, la gráfica pesada no funcionará, estaremos siendo más eficientes energéticamente, el ordenador se calentará menos, los ventiladores irán más despacio y si estamos con batería, ésta durará más.

Lo malo fue la implementación inicial. Hasta en Windows daba problemas, se podía colgar al arrancar o apagar la gráfica, aunque con el tiempo lo terminaron solucionando y no va mal del todo.

Nvidia + GNU/Linux

El problema vino con GNU/Linux. Aunque teníamos el driver privativo de Nvidia, que sigue siendo el que mejor funciona. La empresa no facilitó soporte para Optimus, ni pensaban implementarlo a corto plazo (aunque la noticia es de 2011, a estas fechas, 21 de Agosto de 2017 no hay una implementación a nivel de Windows).

¿Qué hacemos? A día de hoy tenemos varias posibilidades. Tenemos el driver libre nouveau, que sigue en desarrollo activo. Pero aún queda mucho por hacer, no es lo suficientemente estable con modelos nuevos de las gráficas Nvidia o con procesadores Intel muy nuevos. Aunque, gracias al driver nouveau y a algunos módulos del kernel, nos dejarán activar o desactivar la gráfica. El problema es que tienes que tener suerte, que coincida y funcione en tu equipo y con tu configuración, además de que, aunque el driver nouveau está muy bien, y es libre, hay cosas que no funcionan y tiene un rendimiento menor, pero es capaz de conmutar entre la tarjeta integrada y la discreta.

Nvidia Prime

Nvidia sacó Prime. Puede conmutar entre la tarjeta discreta y la integrada, es decir, entre Nvidia e Intel, pero funcionará a nivel de sistema, para toda la pantalla. Y si queremos cambiar entre una y otra tarjeta tendremos, mínimo, que cerrar la sesión y volvera a abrirla para cambiar el driver que controla la pantalla, el sistema OpenGL, etc. El problema no es sólo de Nvidia, es cómo está planteado Xorg, porque hace mas de 25 años, supongo que no se imaginaron que en el futuro se iba a hacer esto. Por si fuera poco, algunas veces el módulo de Nvidia no se lleva bien con algunas tarjetas, o, por algún problema la gestión de energía no va bien cuando haces el cambio... por lo que al final, resulta más seguro reiniciar el ordenador. Aunque el problema no es sólo Prime, o reiniciar, es cómo están enchufadas las gráficas. Esto puede ser complicado, el caso es que una de las configuraciones más utilizadas es que la gráfica discreta está conectada a la interna y ésta a la salida; hay más elementos en la ecuación, lo importante es que cuando la tarjeta discreta está activa hay opciones de monitor que no funcionan (además, los nombres de las pantallas son muy raros... HDMI-1-1, HDMI-1-2...). Mi principal problema surgió con la rotación de pantalla. Nvidia soporta rotación, Intel soporta rotación, pero cuando están las dos juntas, no hay rotación de pantalla. Por otro lado, al final terminas siempre utilizando la tarjeta discreta (porque para eso te la has comprado) y no ahorramos energía.

Luego tenemos el proyecto Bumblebee. Lo malo es que hay forks, de varias personas, guías contradictorias y características que van y vienen. Lo de las guías contradictorias no es problema de quién las escribe, la semana que viene publico yo una, es porque al tener características que van y vienen, configuraciones que dejan de servir y máquinas que no siempre son compatibles con según qué cosas, al final toca probar y, tirar mucho de terminal, y arrancar el ordenador totalmente a oscuras y rehacer configuraciones... Y hablaremos un poco más de él.

Usar solo la Intel

Bueno, es una opción. Ignoramos por completo que tenemos la tarjeta Intel y, utilizando el módulo del kernel que mejor nos funcione: bbswitch o vga_switcheroo. Desactivamos la tarjeta discreta para siempre. Aunque claro, tu ordenador tiene una tarjeta discreta que va a estar muerta de risa todo el tiempo, y da pena no utilizarla.

Podríamos, por ejemplo, cargar el módulo de nvidia y activar la tarjeta discreta a mano cuando queramos hacer algún procesamiento GPGPU, utilizando CUDA u OpenCL. Aunque algunos programas, antes de utilizar estas tecnologías, preguntan al servidor X qué tarjeta tienes y, claro, el servidor X les va a decir que tienes una Intel y no van a hacer uso del driver de Nvidia. Otros programas mejor hechos sí que detectan que tenemos una nvidia, el módulo funcionando y hacen el procesamiento GPGPU sin problema. Una vez hecho esto, puedes desactivar la tarjeta discreta y listo.

Bumblebee, supuestamente, nos trae el mundo maravilloso de Optimus a GNU/Linux. Aunque tampoco es tan maravilloso, es una solución muy válida para nuestros equipos, por el momento, mientras Nvidia saca un mejor soporte de Optimus, mientras nouveau alcanza un rendimiento y estabilidad mayor o mientras las GPU de Intel alcanzan mayor nivel.
El principal problema que veo es la falta de manteinimiento y versiones. La última versión es de 2013, aunque hay algún cambio menor de mantenimiento o para la distribución de 2015. Parece que el equipo no se mueve, pero luego se ve movimiento en la wiki de Github o algún proyecto asociado.

Otro problema es el rendimiento de los gráficos. Aunque va bastante bien, lo que hace Bumblebee es automatizar la activación/desactivación de la tarjeta discreta e iniciar una sesión X invisible con dicha tarjeta y luego comunica toda la información de la aplicación a la sesión actual. Esto es, además de la generación de gráficos, implica un transporte que, a veces trae también compresión y descompresión, etc, por lo que al final puede haber pérdida de fotogramas por segundo y un poco más de uso de CPU cuando tenemos aplicaciones abiertas utilizando la GPU discreta.

Al final, este proyecto nos permite tener una sesión iniciada con la tarjeta integrada, con lo que la CPU no se calienta tanto que teniendo la GPU discreta encendida y nos permite iniciarla cuando iniciamos un programa que la necesita. Tenemos que ejecutar el programa de forma especial, podemos conigurar accesos directos a los programas para que se ejecuten utilizando la tarjeta discreta pero es incómodo. Además, al estar utilizando principalmente la gráfica integrada no tendremos problemas a la hora de rotar el monitor.

Con Bumblebee, también podríamos solucionar el problema de los programas que hacen uso de CUDA y no detectan bien la tarjeta, diciéndoles que se ejecuten con la tarjeta discreta.

La semana que viene...

La semana que viene publicaré la guía de cómo configuré Bumblebee en mi portátil, con muchos consejos de configuración, métodos para transportar la imagen y detalles de lo que me he ido encontrando.

También podría interesarte...


Volver a la Portada de Logo Paperblog