¿Cuántos niveles de optimización de GCC hay?
Probé gcc -O1, gcc -O2, gcc -O3 y gcc -O4
Si utilizo un número realmente grande, no funcionará.
Sin embargo, he intentado
gcc -O100
y compiló.
¿Cuántos niveles de optimización hay?
c
optimization
gcc
compiler-construction
neuromante
fuente
fuente
man gcc
Cygwin (12000 líneas impares) puede buscar-O
y encontrar todo lo que indican las respuestas a continuación, y más.3
es igual que3
(siempre que no seint
desborde). Mira mi respuesta .-fomit-stack-pointer
cambiará el código generado.Respuestas:
Para ser pedante, hay 8 opciones -O válidas diferentes que puedes darle a gcc, aunque hay algunas que significan lo mismo.
La versión original de esta respuesta indicó que había 7 opciones. Desde entonces, GCC ha agregado
-Og
para llevar el total a 8Desde la página del manual:
-O
(Igual que-O1
)-O0
(no realizar optimización, el valor predeterminado si no se especifica ningún nivel de optimización)-O1
(optimizar mínimamente)-O2
(optimizar más)-O3
(optimizar aún más)-Ofast
(optimice de forma muy agresiva hasta el punto de romper el cumplimiento estándar)-Og
(Optimice la experiencia de depuración. -Og habilita optimizaciones que no interfieren con la depuración. Debería ser el nivel de optimización elegido para el ciclo estándar de edición-compilación-depuración, ofreciendo un nivel razonable de optimización mientras se mantiene una compilación rápida y una buena experiencia de depuración. )-Os
(. Optimizar para el tamaño-Os
permite que todas las-O2
optimizaciones que típicamente no aumentan el tamaño del código También realiza optimizaciones adicionales diseñadas para reducir el tamaño del código..-Os
Desactiva los siguientes parámetros de optimización:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
)También puede haber optimizaciones específicas de la plataforma, como señala @pauldoo, OS X tiene
-Oz
fuente
-Oz
configuración adicional que es "optimizar el tamaño de forma más agresiva que-Os
": developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/…-Og
opciones de optimización que no interfieren con la depuraciónVamos a interpretar el código fuente de GCC 5.1 para ver lo que ocurre en
-O100
ya que no está claro en la página del manual.Concluiremos que:
-O3
hastaINT_MAX
es lo mismo que-O3
, pero eso podría cambiar fácilmente en el futuro, así que no confíe en él.INT_MAX
.-O-1
Centrarse en subprogramas
En primer lugar, recuerde que GCC es sólo un front-end para
cpp
,as
,cc1
,collect2
. Un rápido./XXX --help
dice eso solocollect2
ycc1
toma-O
, así que centrémonos en ellos.Y:
da:
por lo que
-O
se reenvió a amboscc1
ycollect2
.O en common.opt
common.opt es un formato de descripción de opción CLI específico de GCC descrito en la documentación interna y traducido a C por opth-gen.awk y optc-gen.awk .
Contiene las siguientes líneas interesantes:
que especifican todas las
O
opciones. Tenga-O<n>
en cuenta cómo está en una familia separada de la otraOs
,Ofast
yOg
.Cuando construimos, esto genera un
options.h
archivo que contiene:Como beneficio adicional, mientras buscamos
\bO\n
dentrocommon.opt
, notamos las líneas:lo que nos enseña que
--optimize
(doble guión porque comienza con un guión-optimize
en el.opt
archivo) es un alias indocumentado para el-O
cual se puede usar como--optimize=3
!Donde se usa OPT_O
Ahora hacemos grep:
que nos apunta a dos archivos:
Primero busquemos
opts.c
opts.c: optimización_opciones_predeterminadas
Todos los
opts.c
usos suceden en el interior:default_options_optimization
.Hacemos grep backtrack para ver quién llama a esta función, y vemos que la única ruta de código es:
main.c:main
toplev.c:toplev::main
opts-global.c:decode_opts
opts.c:default_options_optimization
y
main.c
es el punto de entrada decc1
. ¡Bueno!La primera parte de esta función:
integral_argument
que llamaatoi
a la cadena correspondiente aOPT_O
para analizar el argumento de entradaopts->x_optimize
dondeopts
está astruct gcc_opts
.struct gcc_opts
Después de hacer grepping en vano, notamos que esto
struct
también se genera enoptions.h
:de donde
x_optimize
viene de las lineas:presente en
common.opt
, y queoptions.c
:por lo que suponemos que esto es lo que contiene todo el estado global de la configuración y
int x_optimize
es el valor de optimización.255 es un máximo interno
in
opts.c:integral_argument
,atoi
se aplica al argumento de entrada, por lo queINT_MAX
es un límite superior. Y si pones algo más grande, parece que GCC ejecuta un comportamiento indefinido de C. ¿Ay?integral_argument
también envuelveatoi
y rechaza el argumento si algún carácter no es un dígito. Así que los valores negativos fallan con gracia.De vuelta a
opts.c:default_options_optimization
, vemos la línea:de modo que el nivel de optimización se trunca a
255
. Mientras leíaopth-gen.awk
me encontré con:y sobre el generado
options.h
:lo que explica por qué el truncamiento: las opciones también deben reenviarse a
cl_optimization
, que usa achar
para ahorrar espacio. Entonces 255 es un máximo interno en realidad.opts.c: maybe_default_options
Volviendo a
opts.c:default_options_optimization
, nos encontramos con lomaybe_default_options
que suena interesante. Lo ingresamos, y luegomaybe_default_option
donde llegamos a un gran interruptor:No hay
>= 4
cheques, lo que indica que3
es el más grande posible.Luego buscamos la definición de
OPT_LEVELS_3_PLUS
encommon-target.h
:¡Decir ah! Este es un fuerte indicador de que solo hay 3 niveles.
opts.c: tabla_opciones_predeterminadas
opt_levels
es tan interesante, que hacemos grepOPT_LEVELS_3_PLUS
y encontramosopts.c:default_options_table
:por lo que aquí es donde
-On
se codifica el mapeo de optimización específico mencionado en los documentos. ¡Agradable!Asegúrese de que no haya más usos para x_optimize
El uso principal de
x_optimize
fue establecer otras opciones de optimización específicas-fdefer_pop
como se documenta en la página de manual. ¿Hay más?Nosotros
grep
, y encontramos algunos más. El número es pequeño y, tras una inspección manual, vemos que cada uso solo hace como máximo ax_optimize >= 3
, por lo que nuestra conclusión es válida.lto-wrapper.c
Ahora vamos a la segunda aparición de
OPT_O
, que estaba enlto-wrapper.c
.LTO significa Optimización de tiempo de enlace, que, como su nombre indica, necesitará una
-O
opción y estará vinculadacollec2
(que es básicamente un enlazador).De hecho, la primera línea de
lto-wrapper.c
dice:En este archivo, las
OPT_O
ocurrencias parecen solo normalizar el valor deO
para pasarlo hacia adelante, así que deberíamos estar bien.fuente
Siete niveles distintos:
-O0
(predeterminado): sin optimización.-O
o-O1
(lo mismo): Optimiza, pero no dediques demasiado tiempo.-O2
: Optimice de forma más agresiva-O3
: Optimice de forma más agresiva-Ofast
: Equivalente a-O3 -ffast-math
.-ffast-math
activa optimizaciones de punto flotante que no cumplen con los estándares. Esto permite al compilador pretender que los números de coma flotante son infinitamente precisos y que el álgebra en ellos sigue las reglas estándar del álgebra de números reales. También le dice al compilador que le diga al hardware que descargue los desnormales a cero y trate los desnormales como cero, al menos en algunos procesadores, incluidos x86 y x86-64. Los desnormales desencadenan una ruta lenta en muchas FPU, por lo que tratarlos como cero (que no desencadena la ruta lenta) puede ser una gran ganancia de rendimiento.-Os
: Optimice el tamaño del código. En realidad, esto puede mejorar la velocidad en algunos casos, debido a un mejor comportamiento de I-cache.-Og
: Optimice, pero no interfiera con la depuración. Esto permite un rendimiento no embarazoso para las compilaciones de depuración y está destinado a reemplazar las-O0
compilaciones de depuración.También hay otras opciones que no están habilitadas por ninguno de estos y deben habilitarse por separado. También es posible utilizar una opción de optimización, pero deshabilitar indicadores específicos habilitados por esta optimización.
Para obtener más información, consulte el sitio web de GCC.
fuente
-O100
compila entonces?Cuatro (0-3): consulte el manual de GCC 4.4.2 . Cualquier valor superior es solo -O3, pero en algún momento sobrepasará el límite de tamaño variable.
fuente
atoi
un comportamiento indefinido, seguido de un255
límite interno.