acovea, flag's de optimización

¿Programas en C/C++? Pues esto te puede interesar.
Todo el mundo sabe la importación de optimizar el código. La optimización de código se consigue desde la primera a la última línea del mismo, sin embargo si lo que necesitas es todavía más optimización, el compilar gcc/g++ tiene una serie de flag's muy interesantes que permiten optimizar todavía más el código. Gracias a estos flag's, se puede aumentar el tamaño del binario final incluyendo librerías dinámicas o sacar una opcimización mayor para un tipo de procesador concreto. El problema suele ser siempre el mismo: ¿qué flag's empleo?
Hay un artículo maravilloso en Debian Administration que explican cómo emplear acovea, un potente analizador de código que te indica de forma simple cuales son las mejoras de optimización que puedes pasarle a tu código para mejorar su rendimiento.
Vamos a partir del mismo código del ejemplo y explicar paso a paso cómo optimizar los flag's de gcc para obtener un mayor rendimiento, incluso en códigos muy sencillos.
#include<stdio.h>

int main (int argc, char *argv[]) {
int i = 1, num;
int j, k;

for (num = 2; num < 32768; num++) {
   while (i <= num) {
      k = 0;
      if (num % i == 0) {
         j = 1;
         while (j <= i) {
            if (i % j == 0)
               k++;
            j++;
         }
      if (k == 2)
         printf ("%d is prime\n", i);
   }
   i++;
   }
}
return 0;
}
Primero vamos a ver qué sucede ejecutándose con una compilación normal.
shell> gcc -o ejemplo ejemplo.c
shell> time ./ejemplo
...
real 0m3.718s
user 0m3.700s
sys 0m0.008s
Y ahora que ya tenemos unos tiempos de referencia, vamos a emplear la herramienta acovea para ver cómo poder optimizar el código para nuestro procesador.
Primeramente la instalamos.
shell> apt-get install acovea
Luego, nos vamos al directorio /usr/share/libacovea/config que es donde están almacenados todos los perfiles de acovea con los que puede optimizar los flag's según la versión de nuestro procesador. En mi caso, voy a emplear gcc34_intel.acovea, con lo que lanzamos acovea tal que así,
shell> runacovea -config gcc34_intel.acovea -input ejemplo.c
Esta ejecución tardará un poco en terminar, ya que internamente está empleando muchas iteraciones y compilaciones de 'ejemplo.c' para ver cómo poder optimizarlo. Al finalizar obtendremos una salida similar a la siguiente,
Acovea completed its analysis at 2012 Oct 26 19:55:09

Optimistic options:
     -fno-cprop-registers  (1.951)
 -foptimize-sibling-calls  (1.951)
         -frerun-loop-opt  (1.537)
            -falign-loops  (1.537)
       -finline-functions  (1.951)
   -minline-all-stringops  (1.537)

Pessimistic options:
             -fforce-mem  (-1.769)
     -fmove-all-movables  (-1.769)
       -freduce-all-givs  (-1.769)
            -mfpmath=387  (-1.769)
             -march=i386  (-1.769)
             -march=i586  (-1.769)
         -march=pentium4  (-1.769)

Acovea's Best-of-the-Best:
gcc -lrt -lm -std=gnu99 -O1 -fno-merge-constants -fno-thread-jumps -fno-delayed-branch -fno-crossjumping -foptimize-sibling-calls -fcse-follow-jumps -frerun-loop-opt -fcaller-saves -fschedule-insns2 -fsched-spec -freorder-functions -falign-loops -falign-labels -falign-functions -finline-functions -frename-registers -funroll-loops -mno-push-args -maccumulate-outgoing-args -minline-all-stringops -D__NO_MATH_INLINES -mfpmath=sse -D__NO_MATH_INLINES -fno-math-errno -funsafe-math-optimizations -ffinite-math-only -finline-limit=600 -o /tmp/ACOVEA0F868709 file.c 

Acovea's Common Options:
gcc -lrt -lm -std=gnu99 -O1 -foptimize-sibling-calls -finline-functions -minline-all-stringops -o /tmp/ACOVEA61909725 file.c 

-O1:
gcc -lrt -lm -std=gnu99 -O1 -march=pentium4 -o /tmp/B013 file.c 

-O2:
gcc -lrt -lm -std=gnu99 -O2 -march=pentium4 -o /tmp/F7E6 file.c 

-O3:
gcc -lrt -lm -std=gnu99 -O3 -march=pentium4 -o /tmp/AFFD file.c 

-O3 -ffast-math:
gcc -lrt -lm -std=gnu99 -O3 -march=pentium4 -ffast-math -o /tmp/D6AA file.c

-Os:
gcc -lrt -lm -std=gnu99 -Os -march=pentium4 -o /tmp/F596 file.c 


A relative graph of fitnesses:

 Acovea's Best-of-the-Best: **************************         (179)
 Acovea's Common Options:   **************************         (181)
  -O1:                      *****************************      (191)
  -O2:                      *****************************      (193)
  -O3:                      ******************************     (197)
  -O3 -ffast-math:          *******************************    (199)
  -Os:                      ********************************** (211)

Acovea is done.


No hay comentarios :

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios