Compilando GNU / Linux com otimização -O3

18

Dizem que a compilação de ferramentas GNU e kernel Linux com a -O3opção de otimização gcc produzirá bugs estranhos e descolados. É verdade? Alguém já tentou ou é apenas uma farsa?

uray
fonte
Curiosamente, também -O0não é suportado! stackoverflow.com/questions/29151235/…
Ciro Santilli escreveu:

Respostas:

8

É usado no Gentoo, e eu não notei nada incomum.

izaac
fonte
8
No entanto, observe que -O3 é frequentemente filtrado por ebuilds.
Maciej Piechotka
17

-O3 tem várias desvantagens:

  1. Primeiro de tudo, muitas vezes produz código mais lento que -O2ou -Os. Às vezes, ele produz código mais longo devido ao desenrolar do loop, que pode ser mais lento devido ao desempenho pior do cache do código.
  2. Como foi dito, às vezes produz código errado. Pode ser devido a erro na otimização ou erro no código (como ignorar o aliasing estrito). Como o código do kernel às vezes é e às vezes precisa ser 'inteligente', eu diria que é possível que algum desenvolvedor do kernel tenha cometido algum erro. Eu experimentei vários problemas estranhos, como travar os utilitários do espaço do usuário, quando compilei o kernel com o gcc 4.5, que naquele momento era estável. Eu ainda uso o gcc 4.4 para o kernel e vários utilitários de espaço de usuário selecionados devido a vários bugs. O mesmo pode se aplicar -O3.
  3. Eu não acho que ele oferece muitos benefícios para o kernel do Linux. O kernel não faz cálculos pesados ​​e, em alguns locais, é otimizado com montagem. -O3O sinalizador não alterará o custo da alternância de contexto ou a velocidade da E / S. Não acho que algo como uma aceleração <0,1% do desempenho geral valha a pena.
Maciej Piechotka
fonte
6
O Linux é compilado com -fno-strict-aliasing, pois Linus acha que o gcc está sendo estúpido e excessivamente restritivo, pois faz coisas estúpidas, como tratar valores como diferentes, mesmo que obviamente não sejam (por exemplo, obviamente). Veja). consulte mail-archive.com/[email protected]/msg01647.html
Spudd86
@ Spudd86: Ele quis dizer que eles obviamente não são para ser humano lendo código ou para compilador? Como eu disse - o Kernel às vezes precisa fazer coisas inteligentes que os programas do espaço do usuário não devem fazer. O que faz sentido para o espaço do usuário (otimização pesada em algumas áreas) pode não fazer sentido para o kernel (maior quantidade de código inteligente + gargalo em lugares diferentes).
Maciej Piechotka 31/10/10
11
Não, o que ele disse também se aplica ao espaço do usuário.
Spudd86
11
@ Spudd86: Não concordo com isso então. Tornar o compilador 'inteligente o suficiente' para detectar coisas 'óbvias' não é trivial. Portanto, a única maneira possível é: a) produzir apenas código (er) lento (o que é inaceitável para alguns casos de uso em, digamos, HPC) e / ou forçar os programadores a otimizar manualmente o código; b) tornar as regras mais rígidas para permitir 'estúpido' compilador para otimizar - rota seguida pelo padrão C.
Maciej Piechotka
6

Observe que grandes partes da cadeia de ferramentas (em particular a glibc) não compilam se você alterar os níveis de otimização. O sistema de compilação está configurado para ignorar suas preferências -O para essas seções na maioria das distribuições sãs.

Simplificando, certas funcionalidades fundamentais da biblioteca e do sistema operacional dependem do código que está realmente fazendo o que diz, e não do que seria mais rápido em muitos casos. -fgcse-after-reload em particular (ativado por -O3) pode causar problemas estranhos.

user455
fonte
5

Nos últimos 10 anos, eu tenho executado vários sistemas Gentoo com mais de 1000 pacotes usando -O3 -march=nativeglobalmente e ainda não encontrei nenhum desses problemas míticos de estabilidade que -O3deveriam ter. Os benchmarks de aplicativos intensivos de CPU (como aplicativos de matemática / ciências) mostram consistentemente -O3produzir código mais rápido, afinal, seria inútil se não o fizessem. De qualquer maneira, para a maioria dos aplicativos de desktop CFLAGS, não importa tanto, pois eles são vinculados à IO, mas isso importa muito para as coisas do lado do servidor vinculadas à CPU.

Mark Pariente
fonte
3

-O3 usa otimizações agressivas que só são seguras se certas suposições sobre o uso de registros, como os quadros de pilha forem interagidos e a reentrada de funções forem verdadeiras, e não é garantido que essas suposições sejam verdadeiras em alguns códigos como o kernel, especialmente quando a montagem em linha é usado (como em algumas partes de nível muito baixo do kernel e de seus módulos de driver).

David Spillett
fonte
Sem mencionar que nem sempre mais rápido é, você realmente tem que vir para cima com benchmarks e testá-lo vs -O2saber o tempo ou não fere ou ajuda
Spudd86
0

Embora você possa usar o -O3 e outros botões de otimização na maioria dos aplicativos (e isso pode resultar em melhorias de velocidade), hesitaria em usar esses ajustes no próprio kernel ou na cadeia de ferramentas necessária para construí-lo (compilador, binutils, etc.)

Pense nisso: um ganho de 5% no desempenho dos subsistemas raid e ext3 vale a pena travar o sistema ou potencial perda de dados e / ou corrupção?

Ajuste todos os botões desejados para a porta do Quake que você está reproduzindo ou os codecs de áudio / vídeo que você usa para copiar sua coleção de DVD para arquivos divx. Você provavelmente verá uma melhoria. Apenas não mexa com o kernel, a menos que você tenha tempo a perder e dados que pode suportar perder.

Geoff Fritz
fonte
3
Não estou perguntando se vale a pena ou não, seguro ou não, ou por que não devemos fazer isso, o que estou perguntando é o fato, ele realmente produz bugs em aplicações reais ?, já ocorreu? faz isso provou assim ..
Uray