LTO: qué es y cómo utilizarlo en Gentoo

¿Que es LTO?

LTO es el acrónimo de Link Time Optimization. Es una operación en la cual el compilador retrasa las optimizaciones al momento del enlace de los archivos fuente, permitiéndole ver todos los archivos que forman un solo ejecutable como un solo fichero, y de esta manera aplicar optimizaciones de una manera mas efectiva.

Para mas información: la wiki de GCC.

Para ver los beneficios e inconvenientes de LTO: Benchmarks de Phoronix

Cosas a tener en cuenta

  • Es inestable , puede causar problemas en algunos paquetes.
  • Algunos paquetes fallarán en su compilación (se hablará de como solucionar esto mas adelante).
  • Es recomendable usar el enlazador Gold.
  • Usa siempre la última versión de GCC.

Gold, además de soportar características avanzadas que lo hacen mas atractivo a la hora de usar LTO, es mas rápido que GNU ld, especialmente cuando se trata de programas grandes, donde puede llegar a ser 5 veces mas rápido. Para usarlo, ejecutar:

binutils-config --linker ld.gold


Usando LTO: método recomendado

En lugar de activar LTO globalmente (lo cual puede causar problemas) es mejor activarlo en los paquetes que queramos. De esta manera, solo los paquetes que quieres que se beneficien de LTO son compilados con esta optimización, o cual evita los tiempos de compilación mas lentos en los programas que no se benefician del mismo. Esto se puede conseguir de la siguiente manera:

En el directorio /etc/portage/env, creamos el archivo LTO.conf y le añadimos las siguientes líneas:

CFLAGS="${CFLAGS} -flto=5" #pon en -flto los hilos  de tu CPU + 1
CXXFLAGS="${CXXFLAGS} -flto=5" #igual que arriba
LDFLAGS="${LDFLAGS} -fuse-linker-plugin" #solo si usas Gold, es mejor.

Así, para usar LTO en un paquete, únicamente tenemos que poner su nombre (el nombre completo, www-client/firefox, en lugar de firefox) en el archivo package.env, junto con LTO.conf a su derecha. Abajo un ejemplo:

app-emulation/wine LTO.conf
www-client/firefox LTO.conf
sys-devel/gcc LTO.conf
kde-base/kdelibs LTO.conf

Ahora solo tenemos que compilar los paquetes que queremos que usen LTO.


Usando LTO globalmente (no recomendado)

En lugar de aplicar LTO paquete por paquete, también podemos aplicarlo globalmente (que es lo que yo utilizo). Para aplicarlo, los pasos a seguir son:

Editamos el archivo /etc/portage/make.conf y añadimos lo siguiente (son las mismas líneas del archivo LTO.conf):

CFLAGS="${CFLAGS} -flto=5" #pon en -flto los hilos  de tu CPU + 1
CXXFLAGS="${CXXFLAGS} -flto=5" #igual que arriba
LDFLAGS="${LDFLAGS} -fuse-linker-plugin" #solo si usas Gold, es mejor.

A su vez, creamos el archivo /etc/portage/env/no-LTO.conf y añadimos las siguientes líneas:

CFLAGS="${CFLAGS} -fno-lto -fno-use-linker-plugin"
CXXFLAGS="${CXXFLAGS} -fno-lto -fno-use-linker-plugin"
LDFLAGS="${LDFLAGS} -fno-lto -fno-use-linker-plugin"

Y en el archivo package.env pondremos los paquetes cuya compilación falle con LTO. He aquí mi package.env (nótese que utilizo nolto.conf en lugar de no-LTO.conf).

También debemos añadir LTO a la variable USE de make.conf, esto es necesario porque los desarrolladores de Gentoo están (lentamente) añadiendo parches opcionales para el uso de esta optimización en algunos paquetes.

Hecho esto, procedamos a recompilar todos los paquetes del sistema:

emerge -e @world @system --keep-going &> errores

Al usar –keep-going, le estamos diciendo a Portage que ignore los errores, mientras que &> redirige la salida de todos los fallos a un fichero llamado errores, usa este archivo para ver cuales paquetes fallan en su compilación y añade los a la lista de package.env.

El &>  nos privará de toda salida, si queremos ver la salida del proceso, debemos usar (como root) este comando:

tail -f /var/log/emerge.log

Y eso es todo, espero no haber dejado ninguna duda, si eso me animaré y escribiré algún articulo sobre OpenMP y/o Graphite.


3 comentarios

  1.   msx dijo

    Gentoo, meh…
    Vayamos a lo importante: Graphite!

    1.    x11tete11x dijo

      El estúpido y ssensual Graphite xD, esa cosa subnormal que revienta tu sistema xD, recuerdo que la última vez que lo usé, bastaba con hacer un for que itere 50 veces haciendo “notify-send KDE<3" para que en la iteracion numero 50, reventara el entorno al carajo jajajajaja, eso si, andaba a los re pedos xD

    2.    roader dijo

      Yo ya dije que igual me animaba y hacia uno de Graphite . Pero de todos modos , Graphite (y cualquier otra optimización ) funciona mejor con LTO . Ademas , al contrario que LTO , Graphite y OpenMP tienen un problema . No todos los programas se ven beneficiados del mismo , y en los que no se ven beneficiados , el rendimiento disminuye , Por lo que en este caso es mejor usarlo solo para unos pocos paquetes .

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *