Combien de GCC niveaux d'optimisation sont là?
Combien de GCC niveaux d'optimisation sont là?
J'ai essayé de gcc -O1, gcc-O2, gcc-O3, et gcc-O4
Si j'utilise un très grand nombre, il ne fonctionnera pas.
Cependant, j'ai essayé
gcc -O100
et compilé.
Combien de niveaux d'optimisation sont là?
- TFM est de 15 000 lignes de long et n'a pas beaucoup à dire à propos de
-O
🙂 - Qui FM regardez-vous? Même avec
man gcc
sur Cygwin (12000 lignes impaires) vous pouvez rechercher-O
et trouvez tout les réponses ci-dessous l'état, et puis certains. - après la lecture de la source, je suis en désaccord avec vous: rien de plus grand
3
est le même que3
(tant qu'il n'a pasint
débordement). Voir ma réponse. - En fait, GCC a beaucoup d'autres indicateurs pour affiner les optimisations.
-fomit-stack-pointer
va changer le code généré.
Vous devez vous connecter pour publier un commentaire.
Être pédant, il y a 8 différents valide -O options que vous pouvez donner à gcc, mais il ya certains qui signifient la même chose.
La version originale de cette réponse a déclaré qu'il y avait 7 options. GCC a depuis ajouté
-Og
pour porter le total à 8De la l'homme page:
-O
(Le même que-O1
)-O0
(ne pas faire de l'optimisation, la valeur par défaut si aucune optimisation n'est pas précisé)-O1
(optimiser de façon minimale)-O2
(optimiser plus)-O3
(optimiser encore plus)-Ofast
(optimiser de façon très agressive au point de rupture de conformité au standard)-Og
(Optimiser l'expérience de débogage. -Og permet des optimisations qui n'interfèrent pas avec le débogage. Il devrait être leniveau d'optimisation de choix pour la standard édition-compilation-debug cycle, offrant un niveau raisonnable d'optimisation
tout en maintenant la compilation rapide et une bonne expérience de débogage.)
-Os
(Optimiser pour la taille.-Os
permet à tous les-O2
optimisations qui ne sont généralement pas augmenter la taille du code. Il effectue également d'autres optimisationsconçu pour réduire la taille du code.
-Os
désactive la suite à l'optimisation des drapeaux:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
)Il peut également être une plate-forme optimisations spécifiques, comme @pauldoo notes, OS X a
-Oz
-Oz
de réglage qui est "optimiser pour la taille de façon plus agressive que-Os
": developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/...-Og
, qui est de toutes les options d'optimisation qui n'interfèrent pas avec le débogageNous allons interpréter le code source du CCAG 5.1 pour voir ce qui se passe sur
-O100
car il n'est pas clair sur la page de man.Nous concluons que:
-O3
jusqu'àINT_MAX
est le même que-O3
, mais qui pourraient facilement changer dans le futur, donc ne comptez pas sur elle.INT_MAX
.-O-1
Se concentrer sur des sous-programmes
D'abord rappeler que GCC est juste un front-end pour
cpp
,as
,cc1
,collect2
. Un rapide./XXX --help
dit que seulcollect2
etcc1
prendre-O
, nous allons donc nous concentrer sur eux.Et:
donne:
donc
-O
a été transmis aux deuxcc1
etcollect2
.O en commun.opter
commun.opt est un GCC spécifiques CLI description de l'option de format décrit dans la les éléments internes de la documentation traduits et C par opth-gen.awk et cifo-gen.awk.
Il contient les lignes intéressantes:
qui précisent tous les
O
options. Notez comment-O<n>
est dans une famille séparée de l'autreOs
,Ofast
etOg
.Lorsque nous construisons, ce qui génère une
options.h
fichier qui contient:Comme un bonus, alors que nous sommes grepping pour
\bO\n
à l'intérieur decommon.opt
on remarque les lignes:qui nous apprend que
--optimize
(double dash, car il commence par un tiret-optimize
sur le.opt
fichier) est un sans-papiers alias pour-O
qui peut être utilisé comme--optimize=3
!Où OPT_O est utilisé
Maintenant, nous grep:
qui nous renvoie à deux fichiers:
Commençons d'abord par la piste vers le bas
opts.c
opte.c:default_options_optimization
Tous
opts.c
usages se produisent à l'intérieur:default_options_optimization
.Nous grep revenir en arrière pour voir qui appelle cette fonction, et nous voyons que le seul chemin d'accès du code:
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
. Bon!La première partie de cette fonction:
integral_argument
qui appelleatoi
sur la chaîne de caractères correspondant àOPT_O
pour analyser l'argument d'entréeopts->x_optimize
oùopts
est unstruct gcc_opts
.struct gcc_opts
Après grepping en vain, nous remarquons que cette
struct
est également généré àoptions.h
:où
x_optimize
vient de l'lignes:présents dans
common.opt
, et queoptions.c
:donc on suppose que c'est ce que contient l'intégralité de la configuration globale de l'état, et
int x_optimize
est l'optimisation de la valeur.255 interne est un maximum
dans
opts.c:integral_argument
,atoi
est appliqué à l'entrée de l'argument, de sorteINT_MAX
est une limite supérieure. Et si vous mettez quelque chose de plus, il semble que la GCC s'exécute C un comportement indéterminé. Ouch?integral_argument
aussi finement enveloppementsatoi
et rejette l'argument si aucun caractère n'est pas un chiffre. Si négatif valeurs ne sont pas gracieusement.Retour à
opts.c:default_options_optimization
, nous voyons la ligne:de sorte que le niveau d'optimisation est tronqué à
255
. Lors de la lecture deopth-gen.awk
j'étais venu dans:et sur le
options.h
:ce qui explique pourquoi la troncature: les options doivent également être transmis à
cl_optimization
, qui utilise unchar
pour économiser de l'espace. Donc 255 interne est un maximum de la réalité.opte.c:maybe_default_options
Retour à
opts.c:default_options_optimization
, nous croisonsmaybe_default_options
qui semble intéressant. Nous y entrons, et puismaybe_default_option
où nous arrivons à un grand changement:Il n'y a pas
>= 4
contrôles, ce qui indique que3
est le plus grand possible.Puis on recherche la définition de
OPT_LEVELS_3_PLUS
danscommon-target.h
:Ha! C'est un indicateur fort que il y a que 3 niveaux.
opte.c:default_options_table
opt_levels
est si intéressant, que nous grepOPT_LEVELS_3_PLUS
, et viennent à traversopts.c:default_options_table
:c'est donc là que le
-On
spécifiques d'optimisation de la cartographie mentionné dans les docs sont codées. Nice!Assurer qu'il n'y a pas plus d'utilisations pour les x_optimize
L'usage principal de
x_optimize
était de définir d'autres options d'optimisation comme-fdefer_pop
comme indiqué sur la page de man. Sont plus là?Nous
grep
, et de trouver un peu plus. Le nombre est petit, et lors de l'inspection manuelle, nous voyons que chaque utilisation seulement à plus d'unx_optimize >= 3
, de sorte que notre conclusion est titulaire d'.lto-wrapper.c
Maintenant, nous allons pour la deuxième occurrence de
OPT_O
, qui était danslto-wrapper.c
.LTO moyens de Liaison à l'Optimisation du Temps, qui, comme son nom l'indique va avoir besoin d'un
-O
option, et est liée àcollec2
(qui est en fait un éditeur de liens).En fait, la première ligne de
lto-wrapper.c
dit:Dans ce fichier, le
OPT_O
occurrences semble être la seule à normaliser la valeur deO
pour passer de l'avant, de sorte que nous devrions être bien.Sept niveaux distincts:
-O0
(par défaut): Pas d'optimisation.-O
ou-O1
(même chose): Optimiser, mais ne passez pas trop de temps.-O2
: Optimiser de façon plus agressive-O3
: Optimiser le plus agressif-Ofast
: Équivalent à-O3 -ffast-math
.-ffast-math
déclencheurs non-conforme aux normes virgule flottante optimisations. Cela permet au compilateur de faire semblant que les nombres à virgule flottante sont infiniment précis, et que l'algèbre sur eux suit les règles standard de nombre réel de l'algèbre. Il indique également le compilateur à dire le matériel de chasse denormals à zéro et de traiter denormals à zéro, au moins sur certains processeurs, y compris les x86 et x86-64. Denormals déclencher une voie lente sur plusieurs Unités, et ainsi de les traiter comme zéro (qui ne déclenche pas la voie lente) peut être une grande performance de gagner.-Os
: Optimiser pour la taille du code. Cela peut effectivement améliorer la vitesse, dans certains cas, en raison d'une meilleure I-comportement du cache.-Og
: Optimiser, mais ne pas interférer avec le débogage. Cette mesure de non-performance embarrassante pour les versions de débogage et est destiné à remplacer-O0
pour les versions de débogage.Il y a aussi d'autres options qui ne sont pas activés par l'un de ces, et doit être activée séparément. Il est aussi possible d'utiliser une option d'optimisation, mais de les désactiver des indicateurs spécifiques activée par cette optimisation.
Pour plus d'informations, voir le site web de GCC.
-O100
compiler alors?Quatre (0-3): Voir la GCC 4.4.2 manuel. Rien de plus juste-O3, mais à un certain moment vous permettra de dépassement de la limite de taille variable.
atoi
un comportement indéfini, suivie par une255
limite interne.