Recompilar para optimizar
[ Sistemas operativos / Linux ]



He oído que con el compilador que viene con las distribuciones de Linux se pueden optimizar los ejecutables para procesadores Pentium y superiores. ¿Cómo se hace? ¿Puedo recompilar los programas que ya tengo instalados aprovechando que tengo el CD con las fuentes?
Manuel Gracia



Efectivamente, el compilador gcc permite elegir para qué procesador optimizar el código, por ejemplo para un Athlon o para un vetusto 486. Por un lado está la opción -mcpu, que optimiza el código para un procesador concreto, pero sin recurrir a sus instrucciones particulares, de modo que el ejecutable seguirá funcionando con otros procesadores. Esta opción la usan la mayoría de las distribuciones para optimizar sus paquetes para Pentium Pro/Pentium II o superiores, pero sin que dejen de funcionar a la gente que tenga un viejo 386, 486 o Pentium.

La otra opción es -march, que genera instrucciones para el procesador que se le indique, por lo que la optimización es mayor pero a costa de que el ejecutable no sea válido en procesadores inferiores. Así, un ejecutable compilado con -march=athlon sólo funcionará en los Athlon de AMD, mientras que otro compilado con -march=i686 funcionará en Pentium Pro/II/III/IV y Athlon. Siempre que se use -march, el compilador asume también las optimizaciones.

Los procesadores reconocidos son los siguientes: i386, i486, i586, pentium, k6, i686, pentiumpro y athlon. Son sinónimos i586 y pentium, así como i686 y pentiumpro, que se usan para Pentium Pro, Celeron, Pentium II, III y 4. De este modo, si tenemos un Duron y queremos optimizar un ejecutable para nuestro procesador, lo compilaremos con -mcpu=athlon si queremos que también se pueda usar en otros procesadores y -march=athlon si sólo lo vamos a usar en el nuestro.

Las optimizaciones para K6 y Athlon sólo están presentes desde la reciente versión 3.0 de gcc. También se pueden usar en el gcc incluido en Red Hat 7.x y derivados, dado que se trata de una versión preliminar de gcc 3.0. Todavía hay unos pocos programas que no compilan con gcc 3.0, entre ellos el propio kernel. En algunos programas puede que veamos optimizaciones de tipo -m386, -m486, -m586 y -mpentiumpro. Es otra notación (desfasada) equivalente -mcpu.

¿Cómo recompilar un programa del que tenemos el código fuente para que use las instrucciones propias de nuestro procesador? La forma más sencilla es añadir la opción -march a la variable de entorno CFLAGS que se usa en los ficheros Makefile. Para ello habría que editar cada Makefile, buscar la variable y añadir la opción. En la mayoría de los programas sin embargo no tendremos que editar ningún Makefile. Son todos aquellos generados con autoconf, caracterizados porque se usa primero configure para crear ficheros Makefile adecuados a nuestro sistema y preferencias, luego make para compilar y finalmente make install para instalar. En todos ellos basta con hacer export CFLAGS=-march=athlon antes de invocar configure. Podemos ver más opciones de optimización a añadir a CFLAGS en las páginas info de gcc, dentro de la sección "Invoking GCC". Con el kernel no hay que tocar ninguna opción de optimización: ya se aplican todas las que se pueden.

Otro caso interesante es el de los RPM. Se puede reconstruir un paquete binario RPM a partir del SRPM (RPM de las fuentes) ejecutando rpm --rebuild nombrepaquete.rpm. El resultado lo obtendremos en /usr/src/redhat/RPMS/, dentro del directorio correspondiente al procesador (i386, i486, i586, i686 o athlon). Sin embargo, por defecto se genera con -march=i386 y -mcpu=i686, a fin de que el paquete funcione en el mayor número posible de máquinas.

Para que se ejecute con -march utilizando la arquitectura del procesador de la máquina donde estemos compilando (por ejemplo i686) deberemos modificar el fichero /usr/lib/rpm/rpmrc y sustituir una línea. Para nuestro ejemplo, esta línea es la que pone buildarchtranslate: i686: i386, que está diciendo que si la arquitectura de la máquina es i686 que se olvide y considere que es i386. Hay que modificarla para que sea buildarchtranslate: i686: i686. El paquete RPM recompilado lo podemos instalar para que sustituya al actual mediante rpm -i --replacepkgs paquete.rpm.

Construir los RPM con -march=k6 es ligeramente más complicado, pues esta arquitectura no aparece en rpmrc. En estos procesadores el sistema identifica "i586", por lo que la línea a añadir a .rpmrc deberá ser buildarchtranslate: i586: k6. También concatenaremos al fichero esta línea: optflags: k6 -O2 -march=k6. Finalmente, hay que crear el directorio k6 bajo /usr/src/redhat/RPMS, dado que ahí es donde se generará el fichero .rpm.






Anterior         Siguiente         





© 2002 VNU Business Publications España. Queda terminantemente prohibida su reproducción total o parcial por cualquier medio sin el permiso explicito y por escrito del propietario del copyright.