¿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 gccCygwin (12000 líneas impares) puede buscar-Oy encontrar todo lo que indican las respuestas a continuación, y más.3es igual que3(siempre que no seintdesborde). Mira mi respuesta .-fomit-stack-pointercambiará 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
-Ogpara 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-Ospermite que todas las-O2optimizaciones 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..-OsDesactiva 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
-Ozfuente
-Ozconfiguración adicional que es "optimizar el tamaño de forma más agresiva que-Os": developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/…-Ogopciones 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
-O100ya que no está claro en la página del manual.Concluiremos que:
-O3hastaINT_MAXes lo mismo que-O3, pero eso podría cambiar fácilmente en el futuro, así que no confíe en él.INT_MAX.-O-1Centrarse en subprogramas
En primer lugar, recuerde que GCC es sólo un front-end para
cpp,as,cc1,collect2. Un rápido./XXX --helpdice eso solocollect2ycc1toma-O, así que centrémonos en ellos.Y:
da:
por lo que
-Ose reenvió a amboscc1ycollect2.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
Oopciones. Tenga-O<n>en cuenta cómo está en una familia separada de la otraOs,OfastyOg.Cuando construimos, esto genera un
options.harchivo que contiene:Como beneficio adicional, mientras buscamos
\bO\ndentrocommon.opt, notamos las líneas:lo que nos enseña que
--optimize(doble guión porque comienza con un guión-optimizeen el.optarchivo) es un alias indocumentado para el-Ocual se puede usar como--optimize=3!Donde se usa OPT_O
Ahora hacemos grep:
que nos apunta a dos archivos:
Primero busquemos
opts.copts.c: optimización_opciones_predeterminadas
Todos los
opts.cusos 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:maintoplev.c:toplev::mainopts-global.c:decode_optsopts.c:default_options_optimizationy
main.ces el punto de entrada decc1. ¡Bueno!La primera parte de esta función:
integral_argumentque llamaatoia la cadena correspondiente aOPT_Opara analizar el argumento de entradaopts->x_optimizedondeoptsestá astruct gcc_opts.struct gcc_opts
Después de hacer grepping en vano, notamos que esto
structtambién se genera enoptions.h:de donde
x_optimizeviene 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_optimizees el valor de optimización.255 es un máximo interno
in
opts.c:integral_argument,atoise aplica al argumento de entrada, por lo queINT_MAXes un límite superior. Y si pones algo más grande, parece que GCC ejecuta un comportamiento indefinido de C. ¿Ay?integral_argumenttambién envuelveatoiy 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.awkme 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 acharpara 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_optionsque suena interesante. Lo ingresamos, y luegomaybe_default_optiondonde llegamos a un gran interruptor:No hay
>= 4cheques, lo que indica que3es el más grande posible.Luego buscamos la definición de
OPT_LEVELS_3_PLUSencommon-target.h:¡Decir ah! Este es un fuerte indicador de que solo hay 3 niveles.
opts.c: tabla_opciones_predeterminadas
opt_levelses tan interesante, que hacemos grepOPT_LEVELS_3_PLUSy encontramosopts.c:default_options_table:por lo que aquí es donde
-Onse 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_optimizefue establecer otras opciones de optimización específicas-fdefer_popcomo 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
-Oopción y estará vinculadacollec2(que es básicamente un enlazador).De hecho, la primera línea de
lto-wrapper.cdice:En este archivo, las
OPT_Oocurrencias parecen solo normalizar el valor deOpara pasarlo hacia adelante, así que deberíamos estar bien.fuente
Siete niveles distintos:
-O0(predeterminado): sin optimización.-Oo-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-mathactiva 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-O0compilaciones 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
-O100compila 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
atoiun comportamiento indefinido, seguido de un255límite interno.