medicina - ¿Cuál es la diferencia entre los indicadores-O3 y(-O2+que man gcc dice que-O3 agrega a-O2)?
gcc wikipedia (2)
Las páginas de manual pueden estar desactualizadas, pero puede encontrar listas reales para O2 y O3.
Para obtener la lista completa ( casi , marque "actualización") de las opciones de optimización de -f
que realmente se usan, le sugiero que use la función -fverbose-asm -save-temps
(o -fverbose-asm -S
) - hay una lista completa en parte superior del archivo asm (* .s).
Para gcc-4.6.0 obtuve x (la diferencia entre O2 y O3) para ser:
-fgcse-after-reload
-finline-functions
-fipa-cp-clone
-fpredictive-commoning
-ftree-loop-distribute-patterns
-ftree-vectorize
-funswitch-loops
Otra fuente de información para su pregunta son las fuentes de GCC (archivo gcc/opts.c
y posiblemente gcc/common.opt
) como gcc-4.6.0:
/* -O3 optimizations. */
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
/* Inlining of functions reducing size is a good idea with -Os
regardless of them being declared inline. */
{ OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
También verifiqué, hace gcc check -On
en otros archivos (búsqueda del símbolo x_optimize
para x_optimize
).
El único uso adicional de n
en la opción -On
es guardar el valor en la macro __OPTIMIZE__
. Por lo tanto, algunos encabezados pueden comportarse de manera diferente para el valor de esta macro igual a 2 o 3.
ACTUALIZACIÓN: Hay preguntas al respecto en GCC WIKI :
- " ¿Es -O1 (-O2, -O3 u -Os) equivalente a las opciones de optimización individual? "
No. Primero, las opciones de optimización individuales (-f *) no habilitan la optimización, se requiere una opción -Os o -Ox con x> 0. En segundo lugar, los indicadores -Ox permiten muchas optimizaciones que no están controladas por ninguna opción individual -f *. No hay planes para agregar opciones individuales para controlar todas estas optimizaciones.
- " ¿Qué indicadores específicos están habilitados por -O1 (-O2, -O3 u -Os)? "
Varía según la plataforma y la versión de GCC. Puede hacer que GCC le diga qué indicadores habilita al hacer esto:
touch empty.c
gcc -O1 -S -fverbose-asm empty.c
cat empty.s
Recientemente recibí un informe de error sobre un programa que no se compila con el conmutador -O3 (consulte https://github.com/cschwan/sage-on-gentoo/issues/66 ). En particular, el problema es que la compilación se bloquea en un cierto punto. El problema se resuelve compilando con -O2 (soy consciente del hecho de que los programas compilados con -O3 pueden estar rotos, pero no sabía que -O3 puede colgar el compilador). Si desea reproducir el problema ejecute
wget http://perso.ens-lyon.fr/xavier.pujol/fplll/libfplll-3.0.12.tar.gz
tar -xf libfplll-3.0.12.tar.gz
cd libfplll-3.0.12
./configure CXXFLAGS="-O3"
make
Me pregunté por qué -O3 cuelga el compilador y así traté de localizar el problema. Primero, traté de averiguar la diferencia entre -O2 entre -O3. La página del manual de Gcc indica que -O3 habilita los conmutadores de -O2 y los siguientes (llamémoslos x
):
-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload
-ftree-vectorize -fipa-cp-clone
Lo verifiqué comparando la salida de gcc cuando se invoca con -Q -O2 --help=optimizers
y -Q -O3 --help=optimizers
. Luego planeé eliminar selectivamente los interruptores para encontrar el que causa el problema. Sin embargo, la compilación funciona bien con -O2 y los interruptores adicionales de arriba, así que concluyo
-O3 != -O2 x
Ahora mi pregunta : ¿Alguien sabe si hay una diferencia adicional entre -O2 y -O3 (sin documentar?), ¿Alguien ha experimentado un comportamiento similar? ¿Es esto quizás un error del compilador?
Si su compilador se cuelga, entonces sí, lo consideraría un error del compilador. Los compiladores también tienen errores.
(Incluso si el compilador utilizado para compilar su compilador tiene errores, se podría introducir un error en el nuevo compilador - gcc toma algunos pasos para evitarlo al realizar un arranque por etapas).
También podrían ser otras cosas, por ejemplo, la optimización realizada solo toma mucho más tiempo, o el aumento del nivel de optimización hace que se use más memoria, y su sistema comienza a deshacerse de la basura.