¿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
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.
The post LTO: qué es y cómo utilizarlo en Gentoo appeared first on Desde Linux.
Continúar leyendo...
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.
The post LTO: qué es y cómo utilizarlo en Gentoo appeared first on Desde Linux.
Continúar leyendo...