Al compilar un programa podemos indicar al compilador (normalmente gcc) una serie de opciones para que genere código optimizado para nuestro procesador. De esta forma podemos indicar al compilador que genere código optimizado para Pentium III (por ejemplo) que será mucho más eficiente que si no indicamos nada.
Un ejemplo de estas optimizaciones es la distribución Mandrake(1) que tiene todos los paquetes optimizados para 586 o superior, obteniendo una mejora de velocidad aproximada de un 30%
Esto también tiene el problema que si compilamos para una arquitectura en concreto no podemos ejecutar ese programa en una máquina inferior, por ejemplo, no podemos instalar una distribución Mandrake en un 386
Aclarado esto, paso a explicar que la mayoría de distribuciones traen paquetes (rpm o deb) compilados para 386. El objetivo de este artículo es lograr construir paquetes optimizados para nuestra arquitectura
RPM
Aquí no hace falta que explique nada, el amigo Gorka Olaizola escribió hace mucho tiempo un mini-howto para generar paquetes rpm
El howto lo podemos encontrar en la página personal de Gorka(2) (la versión 1.1 es más completa), aunque me suena haberlo visto también por el Insflug(3)
DEB
DISCLAIMER: El procedimiento descrito aquí es meramente intuitivo ya que básicamente he intentado trasladar la idea de compilar un rpm y desconozco si es la forma correcta de realizarlo, como mínimo puedo asegurar que compila y se ejecuta 😉
En primer lugar leer el howto escrito para rpm ya que es la fuente de inspiración y hay algunos conceptos que se explican en él que yo no voy a tratar
Debemos bajar las fuentes del paquete que queremos compilar, para esto debemos tener en el fichero /etc/apt/sources.list una línea con la siguiente pinta:
deb-src ftp:/ftp.xx.debian.org/debian/ stable main non-free contrib
Donde xx es el mirror de debian que empleemos (es, fi, uk…) y stable se puede cambiar por testing o unstable.
Si el paquete es non-US el procedimiento es el mismo pero referenciando a un servidor non-US
Después del apt-get update de rigor haremos un apt-get source nombre_del_paquete en mi caso voy a emplear el paquete hello, que es un paquete para hacer pruebas
Una vez que hemos bajado el paquete tendremos un directorio hello-x.xx y tres ficheros hello-x.xx (.diff.gz, .dsc y .orig.tar.gz), a nosotros nos interesa el fichero hello-x.xx/debian/rules, por lo que usando nuestro editor favorito lo abrimos
Ahora viene la parte interesante, se trata de añadir a la variable CFLAGS o CXXFLAGS los paramétros de compilación de nuestra máquina. Para hacer esto debemos localizar la sección build: y añadir al make o al configure estas variables
En el paquete hello el fichero rules original tiene esta pinta
package=hello
build:
$(checkdir)
./configure –prefix=/usr
$(MAKE) CFLAGS=-O2 LDFLAGS=
touch build
…
Por ejemplo voy a compilar para un Pentium de forma que el fichero rules me quedará así:
package=hello
build:
$(checkdir)
./configure –prefix=/usr
$(MAKE) CFLAGS=”-O2 -fomit-frame-pointer \
-mpreferred-stack-boundary=2 -march=i586″ -LDFLAGS=
touch build
…
Por último solo nos falta generar el paquete .deb correspondiente, para esto haremos nos iremos al directorio hello-x.xx y escribiremos dpkg-buildpackage después hacemos un cd .. y encontraremos el paquete hello-x.xx
Notas Finales
Parámetros de optimización
Los parámetros de optimización que se emplean son los mismos que usa el kernel 2.4.x.
La lista es la siguiente
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i486
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=k6
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=4
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
-O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i586
Por último, si alguien conoce mejores parámetros de optimización agradecería me los comunicaseLista de enlaces de este artículo:
Este post ha sido traido de forma automatica desde https://web.archive.org/web/20140625063149/http:/bulma.net/body.phtml?nIdNoticia=1025 por un robot nigromante, si crees que puede mejorarse, por favor, contactanos.