G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!
Optimizando GCC
Por Jpiszcz
Traducción al español por Erick López Carreón
el día 14 de marzo 2003, para La Gaceta de Linux

Tengo un CPU Pentium 3 a 866MHZ. Después de leer hace unos días el artículo de freshmeat acerca de optimizar GCC me quede pensando. Así que me hice la siguiente pregunta: ¿Qué tan rápido podría GCC compilar el núcleo si GCC mismo estuviera optimizado? Elegí medir los tiempos de compilación del núcleo, debido a que creo que es una buena referencia, y muchas otras personas también hacen lo mismo para medir el desempeño del sistema. Tambien, en un momento u otro, la mayoría de los usuarios de Linux tienen que dar el paso y compilar el núcleo, asi que pensé que medir algo como esto sería útil, y además algo que daría a la gente una idea general de que tanto toma comilar un núcleo sin usar optimizaciones. Así que mi prueba se compone de lo siguiente:

  1. Ejecutar 10 compilaciones del núcleo y calcular su tiempo promedio.
  2. El núcleo en custión es el último núcleo estable de Linux.
  3. El GCC usado en esta prueba el el último gcc estable.

Con un complador no optimizado, (configure;make;make install)
Promedio de 10 'make bzImage':
TIEMPO: 12.42 minutos (762 segundos)

Con un compilador optimizado, específicamente usé:

-O3 -pipe -fomit-frame-pointer -funroll-loops -march=pentium3 -mcpu=pentium3
-mfpmath=sse -mmmx -msse
En caso de que se pregunte como hacer esto, está en el FAQ del tarball de gcc. Usé la siguiente línea:
   ./configure ; make BOOT_CFLAGS="optimization flags" bootstrap ; make install
Promedio de 10 'make bzImage'
TIEMPO: 9.31 minutos (571 segundos)

Compilé prácticamente todo lo que ejecuto en mi caja Linux. Utilice un administrador de paquetes llamado relink para manejar todos mis paquetes instalados.

Optimizando solo el compilador: Ofrece un incremento de velocidad de : 33% (o 3:11 minutos, 191 segundos mas rápido). Esto no parece ser mucho, pero para compilar programas grandes, puede reducir significativamente el tiempo de compilación, haciendo que construir QT & Mozilla sea más rápido :) La prueba actúal consiste en lo siguiente:

cd /usr/src/Linux

for i in `seq 1 10`

do

  make dep

  make clean

  /usr/bin/time bzImage 2>> /home/war/log

done
En caso de que se pregunte acerca del tiempo que tardo cada construcción y que tanto fue utilizado el CPU, aquí está:
Sin optimización (GCC-3.2.2 estándar):

   720.88user 34.54system 12:43.97elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k

   719.06user 35.69system 12:42.09elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   719.14user 34.37system 12:39.64elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   720.52user 36.42system 12:46.68elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k

   721.07user 33.86system 12:41.59elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   718.95user 35.65system 12:41.31elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   721.83user 36.26system 12:51.54elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k

   720.29user 34.18system 12:40.63elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   719.14user 34.80system 12:39.19elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   721.16user 33.88system 12:41.93elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k


Compilador optimizado(GCC-3.2.2 c/ "-O3 -pipe -fomit-frame-pointer -funroll-loops
-march=pentium3 -mcpu=pentium3 -mfpmath=sse -mmmx -msse")

   532.09user 33.62system 9:32.76elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k

   531.57user 32.92system 9:29.25elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   532.99user 33.12system 9:31.18elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   532.58user 33.16system 9:30.57elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   533.18user 32.96system 9:31.34elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   534.01user 32.21system 9:32.50elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k

   532.59user 33.41system 9:31.56elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   532.76user 33.68system 9:32.01elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   534.19user 32.54system 9:31.92elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k

   534.11user 32.76system 9:32.40elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
Nota: Me di cuenta de que algunas optimizaciones, más específicamente (-fomit-frame-pointer) pueden no ser buenas carcaterísticas a optimizar, especialmente para la depuración. Sin embargo, mi meta es aumentar el desempeño del compilador sin preocuparme por la depuración.

 


Copyright © 2003, Jpiszcz. Licencia de copia http://www.linuxgazette.com/copying.html
Publicado en el número 88 de Linux Gazette, marzo 2003