# sobre cflags

## thorero

Voi a reinstalar gentoo y tngo unas dudas, quiero exprimir al maximo la optimizacion, e visto estas cflags para Athlon XP 2000

CFLAGS="-march=athlon-xp -m3dnow -msse -mfpmath=sse -mmmx -O3 

-pipe -fforce-addr -fomit-frame-pointer -funroll-loops -frerun-cse-after-loop

-frerun-loop-opt -falign-functions=4 -maccumulate-outgoing-args -ffast-math

-fprefetch-loop-arrays"

CXXFLAGS="${CFLAGS}"

Irian bien en mi 1600?

----------

## Boohbah

Para mi Athlon XP 2600+, uso

CFLAGS="-march=athlon-xp -O3 -pipe"

and it's reasonably stable

----------

## jBilbo

-O2 más rápido que -O3

http://article.gmane.org/gmane.linux.gentoo.user/52619

había también otra referencia en la gwn, si la encuentro ya la pondré.

----------

## ork2por

mucha info, pruebas, experiencias en: http://www.pcmasmas.com.ar/viewtopic.php?t=12126

----------

## jBilbo

Otro post sobre flags:

https://forums.gentoo.org/viewtopic.php?p=662787

----------

## anvesaka

Algunas aclaraciones que algunos no tienen claro (yo tampoco las tenía antes):

-march=lo-que-sea ya elige el juego de instrucciones adecuado para el procesador lo-que-sea. Es decir, poniendo por ejemplo -march=athlon, no necesitas ninguna opción más que empiece por "m". Ponerlas es redundancia y confunde a la vista. No es necesario poner -mmmx -m3dnow, etc.

-O3 puede ser más lento en un buen número de casos. En general es poco efectivo o incluso más lento con programas grandes en el lenguaje C. Si un programador estima que una función tiene que ser o no ser "inline", lo hará él mejor que nosotros. No somos nosotros quienes tenemos que forzar al compilador a compilarlo casi todo "inline". En C++ sin embargo el -O3 es más efectivo, pero aun así tampoco lo es tanto. Con el procesador Athlon en concreto, y a diferencia del Pentium, las optimizaciones por llamadas a funciones no tienen sentido. Este procesador es muy rápido en este aspecto y hacer una función inline lo único que conseguirá es probablemente hacer el programa maś pesado en consumo de memoria y otros recursos (como la velocidad de carga).

-Las (posibles) optimizaciones que no se incluyen en -O2 u -O3 son por algo. Estas son:

-funroll-loops -funroll-all-loops -ffloat-store 

-fprefetch-loop-arrays -fmove-all-movables -freduce-all-givs -fno-inline -funit-at-a-time -fpeel-loops -ftracer -fnew-ra -funswitch-loops

En general, la activación de alguna de estas opciones mejorará alguna parte del código, pero perjudicará más a otras, haciendo el programa más lento o bien con alguna característica de menos. Por ejemplo, y por nombrar una, -funroll-loops hace que algunos tipos muy concretos de loops vayan más rápido, pero hará ocupar más memoria y hará que otros dejen de estar 100% optimizados por la forma en que tiene que manejar los registros. Yo recomiendo no poner estos flags en el make.conf. Si algún programador considera que son positivos para su programa ya se habrá ocupado de incorporarlos sin necesidad de consultarte, no te preocupes.

-fomit-frame-pointer puede incrementar de forma considerable la velocidad de algunos programas, y en otros no se notará. Pero ya sabrás que si tienes intención de programar no se te debe ocurrir poner este flag, o de lo contrario serás totalmente incapaz de depurar tus programas. Si no eres programador, puedes activarla sin peligro.

-falign-functions=4 ya viene incluida en -mcpu=athlon y por lo tanto en -march=athlon. No es necesaria incluirla.

-ffast-math hace las instrucciones matemáticas más rápidas, lo cual mejora la velocidad de proceso del video, la música, los juegos, etc. GCC advierte de que este flag puede traer problemas, pero si el programa está bien escrito no habrá problema. Si algún programa multimedia  (o juego) se te cuelga habiendo sido compilado con este flag, prueba a compilarlo sin él.

Con todo esto, las flags que recomiento para un Athlon-XP son:

-O2 -march=athlon-xp -fomit-frame-pointer -ffast-math

No son necesarias más. Si pones más, te arriesgas a obtener el resultado contrario al esperado y hacer el sistema más pesado.

Espero haber podido ayudar un poco.  :Smile: 

Saludos.

----------

## Stolz

javuchi77, sinceramente, la mejor explicacion que he leido, se agradece. Yo tenia entendido que el -03 era mejor, pero por lo que dices no siempre es mejor, y cuando lo es, no se nota tanto la diferencia, asi es voy a cambiar mi -03 por -02.

Aun asi tengo unas dudas, si el -03 por lo general es mejor para aplicaciones C, y el -02 para C++... ¿Que tipo de programas son los que mas usamos? Porque segun tengo entendido el nucleo esta escrito en C, pero los entornos de ventanas en C++. ¿Cual nos conviene? (Menudo dilema  :Smile: )

y por ultimo, de tanto cambiar el make.conf ya no me acuerdo si lo predeterminado que venia nada mas instalar era -02 o -03 ¿Alguien me lo recuerda?

Saludos.

----------

## jBilbo

Buena explicación javuchi77. Mis flags son parecidas a las tuyas:

"-march=pentium3 -O2 -pipe -fomit-frame-pointer"

Para los que quieran toda la info posible sobre los flags, aquí un link de la fuente oficial, el manual de gcc (en inglés):

http://gcc.gnu.org/onlinedocs/gcc-3.3.2/gcc/Optimize-Options.html#Optimize%20Options

En cuanto a lo de C vs C++, pues si usas KDE usas más C++ que C. Si por el contrario usas Gnome, usas más C.

Independientemente de esto, creo que es mejor optar por -O2.

----------

## anvesaka

 *Stolz wrote:*   

> javuchi77Aun asi tengo unas dudas, si el -03 por lo general es mejor para aplicaciones C, y el -02 para C++... ¿Que tipo de programas son los que mas usamos? Porque segun tengo entendido el nucleo esta escrito en C, pero los entornos de ventanas en C++. ¿Cual nos conviene? (Menudo dilema )
> 
> 

 

Es al contrario de como dices.  :Smile: 

El -O3 es más apropiado para C++. Si queremos incluirlo, podemos hacer que CXXFLAGS sea igual que CFLAGS pero cambiando el -O2 por el -O3. De esta manera le estamos diciendo al portage que compile con -O3 para C++ y con -O2 para C. La forma de hacerlo es poner estas líneas en el make.conf (quitando las anteriores y poniendo el procesador que tengamos en lugar del athlon, por supuesto):

```

CFLAGS="-march=athlon-xp -O2 -fomit-frame-pointer -ffast-math -pipe"

CXXFLAGS="-march=athlon-xp -O3 -fomit-frame-pointer -ffast-math -pipe"

```

El motivo por el cual -O3 es más efectivo en C++ que en C se debe a la forma en la que usualmente están diseñados los programas en C++: pequeñas funciones (en relidad miembros de clases) que son llamadas muchas veces. Por ejemplo, la función de un miembro de una clase X puede ser poner un valor en una variable privada. Este código es muy corto y se repite en muchas ocasiones a lo largo de un programa típico de C++, así que las optimizaciones por funciones inline (que son las que activa -O3) pueden ser positivas. En C es rarísimo que este tipo de funciones exista y por lo tanto -O3 puede ser innecesario e incluso hasta negativo.

De todas formas esto es siempre una lotería. Incluso en el probable caso de que la optimización por funciones inline sea beneficioso para un programa en C++, invariablemente el programa que necesite de tal optimización es un programa que no ha sido pensado para ser muy eficiente y por lo tanto irá lento de todas formas. Y eso si no hablamos de mostrencos como el Mozilla o el OpenOffice que encima se niegan a aceptar el -O3 te pongas como te pongas...

- Programas típicos que usan C son: el kernel, GTK, Gnome, XMMS, mplayer, opengl, casi todos los servidores (como apache), todas las librerías principales del sistema y en general seguramente más del 80% del sistema.

- Programas típicos que usan C++ son: Mozilla, todos los programas de KDE, algunos de Gnome (creo recordar que el Nautilus es uno de ellos), OpenOffice, etc.

Como puedes comprobar, son los programas realizados en C++ los que suelen ser más pesados y menos optimizados.  :Smile:  (En el OpenOffice, por cierto, esto se agrava sobremanera porque además de ser una aplicación mastodóntica, de decenas de "megas", está tan mal escrita que las CFLAGS le afectan mucho y no es posible utilizar las optimizaciones que el GCC nos brinda). Yo soy de la opinión de que el C++, el Java, la programación orientada a objeto, etc, nos está haciendo volver al pasado... el oowriter (el procesador de textos del OpenOffice) van tan rápido en un 2000 como el Abiword en un 200.... y el konkeror o el nautilus va más lento en un 2000 que el Norton Comander en un 486... pero en fin, no deja de ser una opinión.  :Wink:  ¡Por esto no hay mejor optimización que saber elegir el programa correcto! Este es el mejor consejo que puedo darte...

 *Quote:*   

> 
> 
> y por ultimo, de tanto cambiar el make.conf ya no me acuerdo si lo predeterminado que venia nada mas instalar era -02 o -03 ¿Alguien me lo recuerda?
> 
> Saludos.

 

De serie viene sin CFLAGS (tiene esa linea comentada), por lo que coje las que son por defecto del GCC, es decir -O0 y -march=i386. No obstante ante la ausencia de CFLAGS algunos paquetes pondran la suya propia por defecto, generalmente es simplemente -O2, a secas, sin -march, lo cual equivale a -march=i386 en el caso del PC.

Saludos.Last edited by anvesaka on Sat Nov 29, 2003 9:22 pm; edited 1 time in total

----------

## thorero

buena explicacion de ambos

----------

## jonash

 *javuchi77 wrote:*   

> 
> 
> ```
> 
> CFLAGS="-march=athlon-xp -O2 -fomit-frame-pointer -ffast-math -pipe"
> ...

 

Si se usa CPPFLAGS, se debe comentar la linea CXXFLAGS?¿

----------

## anvesaka

 *jonash wrote:*   

> 
> 
> Si se usa CPPFLAGS, se debe comentar la linea CXXFLAGS?¿

 

La verdad es que ahora que lo dices, he cometido yo un error y no es CPPFLAGS sinó CXXFLAGS. Lo corrijo del anterior mensaje.

Saludos.

----------

## jonash

fale, gracias por la aclaracion, vamos a cambiarlo

----------

## cnyx

Hola, yo tengo las flags como javuchi77 y cuando estoy compilando algo me dice lo siguiente:

```

g++: unrecognized option `-03'
```

no da error ni nada, sigue adelante pero quisiera saber porque pasa esto.

saludos

----------

## jBilbo

 *cnyx wrote:*   

> Hola, yo tengo las flags como javuchi77 y cuando estoy compilando algo me dice lo siguiente:
> 
> ```
> 
> g++: unrecognized option `-03'
> ...

 

Porque es menos o 3, no menos zero 3...   :Very Happy:  (fíjate en o de letra, no de zero de numero  :Razz: )

----------

## cnyx

ok, mil gracias jeje. que cagada jajaja.

saludos

----------

