Combien de niveaux d'optimisation GCC existe-t-il?
J'ai essayé gcc -O1, gcc -O2, gcc -O3 et gcc -O4
Si j'utilise un très grand nombre, cela ne fonctionnera pas.
Cependant, j'ai essayé
gcc -O100
et il a été compilé.
Combien de niveaux d'optimisation y a-t-il?
c
optimization
gcc
compiler-construction
neuromancien
la source
la source
man gcc
sur Cygwin (12000 lignes impaires), vous pouvez rechercher-O
et trouver tout ce que les réponses ci-dessous indiquent, et plus encore.3
est le même que3
(tant qu'il neint
déborde pas ). Voyez ma réponse .-fomit-stack-pointer
changera le code généré.Réponses:
Pour être pédant, il existe 8 options -O valides différentes que vous pouvez donner à gcc, bien qu'il y en ait qui signifient la même chose.
La version originale de cette réponse indiquait qu'il y avait 7 options. GCC a depuis ajouté
-Og
pour porter le total à 8Depuis la page de manuel:
-O
(Identique à-O1
)-O0
(ne pas optimiser, la valeur par défaut si aucun niveau d'optimisation n'est spécifié)-O1
(optimiser au minimum)-O2
(optimiser davantage)-O3
(optimiser encore plus)-Ofast
(optimiser de manière très agressive au point de rompre la conformité aux normes)-Og
(Optimiser l'expérience de débogage. -Og permet des optimisations qui n'interfèrent pas avec le débogage. Cela devrait être le niveau d'optimisation de choix pour le cycle standard d'édition-compilation-débogage, offrant un niveau d'optimisation raisonnable tout en maintenant une compilation rapide et une bonne expérience de débogage. )-Os
(Optimiser pour la taille.-Os
permet à toutes les-O2
optimisations qui n'augmentent généralement pas la taille du code Il effectue également d' autres optimisations conçues pour réduire la taille du code..-Os
Désactive les options d'optimisation suivantes:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
)Il peut également y avoir des optimisations spécifiques à la plate-forme, comme le note @pauldoo, OS X a
-Oz
la source
-Oz
paramètre supplémentaire qui est "optimiser la taille de manière plus agressive que-Os
": developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/…-Og
toutes les options d'optimisation qui n'interfèrent pas avec le débogageNous allons interpréter le code source de GCC 5.1 pour voir ce qui se passe sur
-O100
, car il est pas clair sur la page de manuel.Nous conclurons que:
-O3
jusqu'àINT_MAX
est le même que-O3
, mais que , dans l'avenir pourrait facilement changer, alors ne comptez pas sur elle.INT_MAX
.-O-1
Focus sur les sous-programmes
Tout d' abord se rappeler que le GCC est juste un front-end pour
cpp
,as
,cc1
,collect2
. Un rapide./XXX --help
dit cela seulementcollect2
etcc1
prenons-O
, alors concentrons-nous sur eux.Et:
donne:
donc a
-O
été transmis à la foiscc1
etcollect2
.O en commun.opt
common.opt est un format de description d'option CLI spécifique à GCC décrit dans la documentation interne et traduit en C par opth-gen.awk et optc-gen.awk .
Il contient les lignes intéressantes suivantes:
qui spécifient toutes les
O
options. Notez comment se-O<n>
trouve dans une famille distincte de l'autreOs
,Ofast
etOg
.Lorsque nous construisons, cela génère un
options.h
fichier qui contient:En prime, pendant que nous cherchons à l'
\bO\n
intérieur,common.opt
nous remarquons les lignes:ce qui nous apprend que
--optimize
(double tiret car il commence par un tiret-optimize
sur le.opt
fichier) est un alias non documenté pour-O
lequel peut être utilisé comme--optimize=3
!Où OPT_O est utilisé
Maintenant, nous grep:
ce qui nous renvoie à deux fichiers:
Commençons par traquer
opts.c
opts.c: default_options_optimization
Tout
opts.c
les usages se produisent à l' intérieur:default_options_optimization
.Nous faisons un retour en arrière pour voir qui appelle cette fonction, et nous voyons que le seul chemin du code est:
main.c:main
toplev.c:toplev::main
opts-global.c:decode_opts
opts.c:default_options_optimization
et
main.c
est le point d'entrée decc1
. Bien!La première partie de cette fonction:
integral_argument
qui appelleatoi
la chaîne correspondant àOPT_O
pour analyser l'argument d'entréeopts->x_optimize
oùopts
est astruct gcc_opts
.struct gcc_opts
Après avoir vainement greffé, nous remarquons que ceci
struct
est également généré àoptions.h
:d'où
x_optimize
vient les lignes:présent dans
common.opt
, et queoptions.c
:on suppose donc que c'est ce qui contient tout l'état global de la configuration, et
int x_optimize
la valeur d'optimisation.255 est un maximum interne
in
opts.c:integral_argument
,atoi
est appliqué à l'argument d'entrée, de mêmeINT_MAX
qu'une limite supérieure. Et si vous mettez quelque chose de plus gros, il semble que GCC exécute un comportement C indéfini. Aie?integral_argument
encapsule également finementatoi
et rejette l'argument si un caractère n'est pas un chiffre. Les valeurs négatives échouent donc gracieusement.De retour
opts.c:default_options_optimization
, nous voyons la ligne:afin que le niveau d'optimisation soit tronqué à
255
. En lisant,opth-gen.awk
j'étais tombé sur:et sur le généré
options.h
:ce qui explique pourquoi la troncature: les options doivent également être transmises vers
cl_optimization
, qui utilise unchar
pour économiser de l'espace. Donc, 255 est en fait un maximum interne.opts.c: peut-être_default_options
De retour à
opts.c:default_options_optimization
, nous trouvonsmaybe_default_options
ce qui semble intéressant. Nous y entrons, puismaybe_default_option
nous atteignons un gros interrupteur:Il n'y a pas de
>= 4
contrôle, ce qui indique que3
c'est le plus grand possible.Ensuite, nous recherchons la définition de
OPT_LEVELS_3_PLUS
incommon-target.h
:Ha! C'est un indicateur fort qu'il n'y a que 3 niveaux.
opts.c: default_options_table
opt_levels
est si intéressant, que nous grepOPT_LEVELS_3_PLUS
, et tombons suropts.c:default_options_table
:c'est donc là que le
-On
mappage d'optimisation spécifique mentionné dans la documentation est codé. Agréable!Assurez-vous qu'il n'y a plus d'utilisations pour x_optimize
L'utilisation principale de
x_optimize
était de définir d'autres options d'optimisation spécifiques telles-fdefer_pop
que décrites dans la page de manuel. Y en a-t-il plus?Nous
grep
, et en trouver quelques autres. Le nombre est petit, et après une inspection manuelle, nous voyons que chaque utilisation ne fait qu'au plus unx_optimize >= 3
, donc notre conclusion est valable.lto-wrapper.c
Nous passons maintenant à la deuxième occurrence de
OPT_O
, qui était enlto-wrapper.c
.LTO signifie Link Time Optimization, qui, comme son nom l'indique, aura besoin d'une
-O
option et sera lié àcollec2
(qui est essentiellement un éditeur de liens).En fait, la première ligne de
lto-wrapper.c
dit:Dans ce fichier, les
OPT_O
occurrences semblent ne normaliser que la valeur deO
pour la transmettre, donc ça devrait aller.la source
Sept niveaux distincts:
-O0
(par défaut): aucune optimisation.-O
ou-O1
(même chose): Optimiser, mais ne passez pas trop de temps.-O2
: Optimiser plus agressivement-O3
: Optimiser le plus agressivement-Ofast
: Équivalent à-O3 -ffast-math
.-ffast-math
déclenche des optimisations en virgule flottante non conformes aux normes. Cela permet au compilateur de prétendre que les nombres à virgule flottante sont infiniment précis, et que l'algèbre sur eux suit les règles standard de l'algèbre des nombres réels. Il indique également au compilateur de dire au matériel de vider les dénormalités à zéro et de traiter les dénormalités comme zéro, au moins sur certains processeurs, y compris x86 et x86-64. Les dénormalités déclenchent un chemin lent sur de nombreux FPU, et donc les traiter comme zéro (ce qui ne déclenche pas le chemin lent) peut être une grande victoire en termes de performances.-Os
: Optimiser pour la taille du code. Cela peut en fait améliorer la vitesse dans certains cas, en raison d'un meilleur comportement I-cache.-Og
: Optimisez, mais n'interférez pas avec le débogage. Cela permet des performances non gênantes pour les versions de débogage et est destiné à remplacer les-O0
versions de débogage.Il existe également d'autres options qui ne sont activées par aucune de celles-ci et qui doivent être activées séparément. Il est également possible d'utiliser une option d'optimisation, mais de désactiver des indicateurs spécifiques activés par cette optimisation.
Pour plus d'informations, consultez le site Web de GCC.
la source
-O100
compile-t-il alors?Quatre (0-3): voir le manuel GCC 4.4.2 . Tout ce qui est supérieur est juste -O3, mais à un moment donné, vous dépasserez la limite de taille variable.
la source
atoi
un comportement indéfini, suivi d'une255
limite interne.