Quantos GCC níveis de otimização existem?
Tentei gcc -O1, gcc -O2, gcc -O3 e gcc -O4
Se eu usar um número muito grande, não funcionará.
No entanto, eu tentei
gcc -O100
e compilado.
Quantos níveis de otimização existem?
c
optimization
gcc
compiler-construction
neuromancer
fonte
fonte
man gcc
Cygwin (12.000 linhas ímpares), você pode pesquisar-O
e encontrar tudo o que as respostas abaixo afirmam e muito mais.3
é igual a3
(desde que nãoint
transborde). Veja minha resposta .-fomit-stack-pointer
irá alterar o código gerado.Respostas:
Para ser pedante, existem 8 opções -O válidas diferentes que você pode dar ao gcc, embora haja algumas que significam a mesma coisa.
A versão original desta resposta afirmava que havia 7 opções. Desde então, o GCC aumentou
-Og
para trazer o total para 8A partir da página do homem:
-O
(O mesmo que-O1
)-O0
(sem otimização, o padrão se nenhum nível de otimização for especificado)-O1
(otimizar minimamente)-O2
(otimizar mais)-O3
(otimizar ainda mais)-Ofast
(otimizar muito agressivamente ao ponto de quebrar a conformidade padrão)-Og
(Otimize a experiência de depuração. -Og permite otimizações que não interferem na depuração. Deve ser o nível de otimização de escolha para o ciclo padrão de edição-compilação-depuração, oferecendo um nível razoável de otimização, mantendo a compilação rápida e uma boa experiência de depuração. )-Os
(Otimizar para tamanho.-Os
Ativa todas as-O2
otimizações que normalmente não aumentam o tamanho do código. Também executa otimizações adicionais projetadas para reduzir o tamanho do código.-Os
Desativa os seguintes sinalizadores de otimização:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
)Também pode haver otimizações específicas da plataforma, como @pauldoo observa, o OS X tem
-Oz
fonte
-Oz
configuração adicional que é "otimizar para o tamanho de forma mais agressiva do que-Os
": developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/…-Og
, que são todas as opções de otimização que não interferem na depuraçãoVamos interpretar o código-fonte do GCC 5.1 para ver o que acontece,
-O100
pois não está claro na página do manual.Devemos concluir que:
-O3
atéINT_MAX
é igual-O3
, mas isso pode mudar facilmente no futuro, então não confie nisso.INT_MAX
.-O-1
Foco em subprogramas
Primeiro lembre-se que GCC é apenas um-front-end para
cpp
,as
,cc1
,collect2
. Um rápido./XXX --help
diz isso apenascollect2
ecc1
pegue-O
, então vamos nos concentrar neles.E:
dá:
então
-O
foi encaminhado para amboscc1
ecollect2
.O em comum.opt
common.opt é um formato de descrição de opção CLI específico do GCC descrito na documentação interna e traduzido para C por opth-gen.awk e optc-gen.awk .
Ele contém as seguintes linhas interessantes:
que especificam todas as
O
opções. Observe como-O<n>
está em uma família separada da outraOs
,Ofast
eOg
.Quando construímos, isso gera um
options.h
arquivo que contém:Como um bônus, enquanto procuramos por
\bO\n
dentrocommon.opt
, notamos as linhas:que nos ensina que
--optimize
(traço duplo porque começa com um traço-optimize
no.opt
arquivo) é um apelido não documentado para o-O
qual pode ser usado como--optimize=3
!Onde OPT_O é usado
Agora nós grep:
que nos aponta para dois arquivos:
Vamos primeiro rastrear
opts.c
opts.c: default_options_optimization
Todos os
opts.c
usos acontecer dentro:default_options_optimization
.Retrocedemos para ver quem chama esta função e vemos que o único caminho de código é:
main.c:main
toplev.c:toplev::main
opts-global.c:decode_opts
opts.c:default_options_optimization
e
main.c
é o ponto de entrada decc1
. Boa!A primeira parte desta função:
integral_argument
que chamaatoi
a string correspondente aOPT_O
para analisar o argumento de entradaopts->x_optimize
ondeopts
é astruct gcc_opts
.struct gcc_opts
Depois de fazer grep em vão, notamos que isso
struct
também é gerado emoptions.h
:de onde
x_optimize
vem as linhas:presente em
common.opt
, e queoptions.c
:então achamos que é isso que contém todo o estado global da configuração, e
int x_optimize
é o valor de otimização.255 é um máximo interno
in
opts.c:integral_argument
,atoi
é aplicado ao argumento de entrada, assimINT_MAX
como um limite superior. E se você colocar algo maior, parece que o GCC executa um comportamento C indefinido. Ai?integral_argument
também envolveatoi
e rejeita o argumento se algum caractere não for um dígito. Portanto, os valores negativos falham normalmente.Voltar para
opts.c:default_options_optimization
, vemos a linha:para que o nível de otimização seja truncado para
255
. Durante a leituraopth-gen.awk
, descobri:e no gerado
options.h
:o que explica por que o truncamento: as opções também devem ser encaminhadas para
cl_optimization
, que usa umchar
para economizar espaço. Portanto, 255 é um máximo interno, na verdade.opts.c: Maybe_default_options
Voltar para
opts.c:default_options_optimization
, encontramos omaybe_default_options
que parece interessante. Nós entramos nele, e entãomaybe_default_option
chegamos a uma grande mudança:Não há
>= 4
verificações, o que indica que3
é o maior possível.Em seguida, procuramos a definição de
OPT_LEVELS_3_PLUS
emcommon-target.h
:Ha! Este é um forte indicador de que existem apenas 3 níveis.
opts.c: default_options_table
opt_levels
é tão interessante que vimosOPT_LEVELS_3_PLUS
e encontramosopts.c:default_options_table
:portanto, é aqui que o
-On
mapeamento de otimização específico mencionado na documentação é codificado. Agradável!Certifique-se de que não haja mais usos para x_optimize
O principal uso de
x_optimize
era definir outras opções de otimização específicas, como-fdefer_pop
documentado na página do manual. Existem mais?Nós
grep
, e encontraremos mais alguns. O número é pequeno e, após inspeção manual, vemos que todo uso faz apenas no máximo ax_optimize >= 3
, portanto, nossa conclusão se mantém.lto-wrapper.c
Agora vamos para a segunda ocorrência de
OPT_O
, que foi emlto-wrapper.c
.LTO significa Link Time Optimization, que como o nome sugere vai precisar de uma
-O
opção e será vinculadocollec2
(que é basicamente um linker).Na verdade, a primeira linha de
lto-wrapper.c
diz:Neste arquivo, as
OPT_O
ocorrências parecem apenas normalizar o valor deO
para repassá-lo, então devemos ficar bem.fonte
Sete níveis distintos:
-O0
(padrão): Sem otimização.-O
ou-O1
(mesma coisa): Otimize, mas não gaste muito tempo.-O2
: Otimize de forma mais agressiva-O3
: Otimize de forma mais agressiva-Ofast
: Equivalente a-O3 -ffast-math
.-ffast-math
dispara otimizações de ponto flutuante não compatíveis com os padrões. Isso permite ao compilador fingir que os números de ponto flutuante são infinitamente precisos e que a álgebra sobre eles segue as regras padrão da álgebra de números reais. Também diz ao compilador para dizer ao hardware para liberar os denormais para zero e tratar os denormais como zero, pelo menos em alguns processadores, incluindo x86 e x86-64. Os denormais acionam um caminho lento em muitas FPUs e, portanto, tratá-los como zero (o que não aciona o caminho lento) pode ser uma grande vitória de desempenho.-Os
: Otimize para o tamanho do código. Isso pode realmente melhorar a velocidade em alguns casos, devido ao melhor comportamento do I-cache.-Og
: Otimiza, mas não interfere na depuração. Isso permite um desempenho não constrangedor para compilações de depuração e destina-se a substituir-O0
para compilações de depuração.Existem também outras opções que não são habilitadas por nenhum deles e devem ser habilitadas separadamente. Também é possível usar uma opção de otimização, mas desabilitar sinalizadores específicos habilitados por esta otimização.
Para obter mais informações, consulte o site do GCC.
fonte
-O100
compila?Quatro (0-3): Consulte o manual GCC 4.4.2 . Qualquer coisa maior é apenas -O3, mas em algum ponto você irá estourar o limite de tamanho variável.
fonte
atoi
um comportamento indefinido, seguido por um255
limite interno.