Publicado el 30 de Marzo del 2018
440 visualizaciones desde el 30 de Marzo del 2018
240,0 KB
8 paginas
Creado hace 14a (19/10/2009)
Documentación Gentoo Linux -- Guía de Compila...
http://www.gentoo.org/doc/es/gcc-optimization.xml
Imprimir
Actualizado 19 de
octubre, 2009
Sumario: Esta guía
proporciona una
introducción a la
compilación
optimizada usando
CFLAGS y CXXFLAGS
seguras y sanas. Al
tiempo que se
describe la teoria
detrás de la
optimización en
general.
Joshua Saddler
Autor
John Christian
Stoddart
Traductor
Federico Díaz
Traductor
Sergio D. Rodríguez
Inclan
Traductor
José María Alonso
Traductor
Donate to support our
development efforts.
Guía de Compilación Optimizada
Contenido: 1. Introducción
1. Introducción
¿Qué son CFLAGS y CXXFLAGS?
CFLAGS y CXXFLAGS son variables de entorno usadas para decirle a la
Colección de Compiladores GNU, gcc, que tipo de parámetros usar
cuando compila código fuente. Las CFLAGS son para código escrito en
C, mientras que CXXFLAGS son para código escrito en C++.
Pueden usarse para disminuir la cantidad de mensajes de depuración
para un programa, aumentar los niveles de aviso de errores, y por
supuesto, optimizar el código producido. El Cuaderno de GNU gcc
mantiene una completa lista de opciones disponibles y sus propósitos.
¿Cómo se usan?
CFLAGS y CXXFLAGS pueden ser usados de dos maneras. La primera,
pueden usarse por programa con los Makefiles generados por
automake.
Sin embargo, esto no debería usarse cuando instalamos paquetes
encontrados en el árbol del Portage. En su lugar, establezca sus
CFLAGS y CXXFLAGS en /etc/make.conf. De esta manera todos los
paquetes se compilaran con las opciones que especifique.
Listado de Código 1.1: CFLAGS en /etc/make.conf
CFLAGS="-march=athlon64 -O2 -pipe"
CXXFLAGS="${CFLAGS}"
Como puede ver, CXXFLAGS se establece para usar todas las opciones
presentes en CFLAGS. Esto es lo que deseara casi seguro. No debería
necesitar especificar opciones adicionales en CXXFLAGS nunca.
Conceptos generales
Mientras CFLAGS y CXXFLAGS pueden ser muy efectivos tomando el
código fuente para producir binarios pequeños y/o rápidos, también
pueden deteriorar la función de su código, inflar su tamaño, relentizar
su ejecución, o incluso causar errores de compilación.
1 de 8
19/11/09 21:57
Documentación Gentoo Linux -- Guía de Compila...
http://www.gentoo.org/doc/es/gcc-optimization.xml
CFLAGS no es una solución mágica; no hará que su sistema corra más
rápido o sus binarios sean más pequeños automáticamente. Añadir más
y más parámetros en un intento de optimización (o "rizar") su sistema
es una receta segura para el fallo. Hay un punto en el cual
permanecerá dando vueltas.
A pesar de la jactancia que pueden encontrar en Internet, unas
variables CFLAGS y CXXFLAGS agresivas están más cerca de dañar sus
programas que de hacerles algún bien. Recuerde que la razón para la
cual existen los parámetros en primer lugar es porque están diseñadas
para usarse en sitios específicos para propósitos específicos. ¡Sólo
porque una CFLAG particular sea buena para un fragmento de código
no significa que esté diseñada para compilar todo lo que quiera instalar
en su máquina¡.
¿Preparado?
Ahora que está advertido de algunos de los riesgos involucrados,
echemos un vistazo a algo sano, optimizaciones seguras para su
ordenador. Esto le será útil y lo agradecerán los desarrolladores la
próxima vez que reporte un problema en Bugzilla. (Los desarrolladores
suelen pedir que recompile un paquete con los CFLAGS mínimos para
ver si el problema persiste. Recuerde que los parámetros agresivos
pueden arruinar el código.)
2. Optimizando
Lo básico
La meta detrás de usar CFLAGS y CXXFLAGS es crear código
específico para su sistema; debería funcionar perfectamente mientra es
ligero y rápido, si es posible. Algunas veces estás condiciones son
mutuamente excluyentes, pero nosotros jugaremos con combinaciones
que sabemos que funcionan bien. Idealmente, las mejores están
disponibles para cada arquitectura de CPU. Mencionaremos más
adelante los parámetros agresivos para que se sepa con cuales tener
cuidado. No discutiremos cada opción listada en el manual de gcc (hay
cientos), pero hablaremos de las básicas, los más comunes.
Nota: Si no está seguro qué hace el parámetro, revise el capítulo relevante en
el manual de gcc y si aún continúa atascado, pruebe Google, o revise las listas
de correo de gcc.
-march
La primera y más importante opción es -march. Esta le dice al
compilador que código debería producirse para su arquitectura de
procesador (o arch); dice que debería producir código para un cierto
tipo de CPU. Diferentes CPUs tienen diferentes características, soportan
diferentes conjunto de instrucciones y tienen diferentes formas de
ejecutar código. El parámetro -march mandará al compilador producir
código específico para su CPU, tomando en cuenta todas sus
capacidades, características, conjuntos de instrucciones, caprichos y
demás.
2 de 8
19/11/09 21:57
Documentación Gentoo Linux -- Guía de Compila...
http://www.gentoo.org/doc/es/gcc-optimization.xml
A pesar que la variable CHOST en /etc/make.conf especifica la
arquitectura general usada, -march también se usa para que sus
programas sean optimizados para su procesador específico. Las
arquitecturas x86 y x86-64 (entre otras) también deberían hacer uso
del parámetro -march.
¿Qué tipo de CPU tiene? Para averiguar, ejecute el siguiente comando:
Listado de Código 2.1: Examinando la información de la CPU
$ cat /proc/cpuinfo
Ahora veamos -march en acción. Este ejemplo es para un viejo
Pentium III:
Listado de Código 2.2: /etc/make.conf: Pentium III
CFLAGS="-march=pentium3"
CXXFLAGS="${CFLAGS}"
Aquí hay otro para una CPU de 64-bit AMD:
Listado de Código 2.3: /etc/make.conf: AMD:64
CFLAGS="-march=athlon64"
CXXFLAGS="${CFLAGS}"
Si todavía no está seguro qué tipo de CPU tiene, tal vez quiera usar la
opción -march=native. Al usarla, GCC detectará el procesador y
automáticamente usará las opciones apropiadas.Sin embargo, no use
esta opción si la intención es ¡compilar paquetes para un CPU
diferente!
De manera que, si está compilando paquetes en una computadora,
pero piensa ejecutarlos en una computadora diferente (usando, por
ejemplo, una computadora rápida para construir paquetes para una
máquina más vieja y lenta), entonces no use la opción -march=native.
La palabra "native" significa que el código producido podrá ejecutarse
solamente en ese tipo de CPU. Las aplicaciones construidas con
-march=native en un CPU AMD Athlon 64 CPU no podrán ejecutarse en
un CPU VIA C3 más antiguo.
También están disponibles los parámetros -mcpu y -mtune. Cada uno
de ellos sólo se usará cuando no haya otra opción -march disponible.
Ciertas arquitecturas de procesador pueden requerir -mtune o incluso
de -mcpu. Desgraciadamente, el comportamiento de gcc no es muy
consistente con la manera que cada parámetro se comporta de una
arquitectura a la otra.
En CPUs x86 y x86-64, -mcpu generará código epecífico para esta CPU
usando todas sus instrucciones disponibles y el ABI correcto; no tendrá
compatibilidad hacia atrás para CPUs antiguas/diferentes. Si no
necesita ejecutar código en otro sitio que en el sistema que está
corriendo Gentoo, continue para usar -march. Sólo debería considerar
usar -mtune cuando necesite generar código para CPUs antiguas como
3 de 8
19/11/09 21:57
Documentación Gentoo Linux -- Guía de Compila...
http://www.gentoo.org/doc/es/gcc-optimization.xml
i386 e i486. -mtune produce un código más genérico que -march;
aunque afinará el código para cierto CPU, no tendrá en cuenta los
conjuntos de instrucciones disponibles y ABI. No use -mcpu en sistemas
x86 o x86-64, ya que está obsoleto para estas arquitecturas.
Sólo CPUs no x86/x86-64 (como Sparc, Alpha y PowerPC) pueden
requerir -mtune o -mcpu en lugar de -march. En estas arquitecturas,
-mtune/-mcpu algunas veces se comportará como -march en
(x86/x86-64) ... pero con un nombre distinto. De nuevo, el
comportamiento de gcc y los nombres de los parámetros no es
consistente entre arquitecturas, así que asegúrese de revisar el manual
de gcc para determinar cual de ellos se ajusta a su sistema.
Nota: Para más sugerencias de configuraciones de -march/-mtune/ -mcpu, por
favor lea el capítulo 5 de la Guía de Instalación de Gentoo apropiada a su
arquitectura. También, lea el manual de gcc listado en la página opciones
específicas por arquitectura, con explicaciones más detalladas sobre las
diferencias entre -march, -mcpu, y -mtune.
-O
Lo siguiente es la variable -O. Controla el total de niveles de
optimización. Hace que la compilación de código tome algo más de
tiempo, y puede tomar mucha más memoria, especialmente al
incrementar el nivel de optimización.
Hay cinco configuraciones para -O: -O0, -O1, -O2, -O3 y -Os. Debería
usar solamente una de ellas en /etc/make.conf.
Con la excepción de -O0, la configuración de -O activa varios
parámetros adicionales, así que asegúrese de leer el capítulo del
manual de gcc en opciones de optimización para aprender cuales
parámetros se activan en cada nivel -O, así como algunas explicaciones
sobre lo que hacen.
Examinemos cada nivel de optimización:
-O0: Este nivel (la letra "O" seguida de un cero) desconecta por
completo la optimización y es el predeterminado si no se
especifica ningún nivel -O en CFLAGS o CXXFLAGS. El código no
será optimizado. Esto, normalmente, no es lo que se desea.
-O1: Este es el nivel de optimización más básico. El compilador
intentará producir un código rápido y pequeño sin tomar mucho
tiempo de compilación. Es bastante básico, pero conseguirá
acabar el trabajo siempre.
-O2: Un paso por encima de -O1. Este es el nivel recomendado
de optimización, a no ser que tenga necesidades especiales. -O2
activará unos pocos parámetros añadidos a los que se activan con
-O1. Con -O2, el compilador intentará aumentar el rendimiento
del código sin comprometer el tamaño y sin tomar mucho más
tiempo de compilación.
-O3: Este es el más alto nivel de optimización posible, y también
el más arriesgado. Tomará muchísimo tiempo compilar su código
con esta opción, y de
Comentarios de: Guia de Compilacion Optimizada de Gentoo (0)
No hay comentarios