Re: [FUG-BR] [Off-Toppic] GCC

2008-01-06 Por tôpico Jean Everson Martina
Bom pra dar meus dois centavos.

Eu ja fiz este tipo de analise ha uns 2 anos num projeto de 
criptoanálise, onde nós tinhamos que fazer simulações de cifragem de 
2^48 vezes do AES por exemplo. Essa historia de colocar a função no meio 
do codigo economiza pelo menos 2 intruções. Tem outra opções legais, 
tais como --funrolloops, que desdobra todos os loops que tem o controle 
do numero de interações decidíveis em tempo de compilação. O tamanho do 
executavel aumenta consideravelmente, mas quando o tempo de carga é 
infimo quando comparado ao da execução, então carregar 20k ou 2M 
realmente não faz diferença. No nosso caso conseguiamos retirar mais de 
2^100 instruções executaveis de um codigo de 1500 linhas so usando as 
otimizações do GCC.
Ainda assim usando -O3 e um saco de outras opções, ainda dava pra 
otimizar qualquer coisa na mão :)


Jean Martina
   

Joao Rocha Braga Filho wrote:
 On Jan 2, 2008 10:01 AM, Ricardo Nabinger Sanchez [EMAIL PROTECTED] wrote:
   
 On Wed, 2 Jan 2008 00:23:21 -0200
 Joao Rocha Braga Filho [EMAIL PROTECTED] wrote:

 
 Alguém já olhou a geração de código de um gcc atual?
   
 Sim.

 
 Com a opção -O3, se uma função for static e só é chamada uma
 vez, ele some com ela introduzindo o código no local de chamada.
   
 static em funções diz ao compilador que ela é local àquela unidade de
 compilação (.o), e portanto o símbolo gerado não será visível.  Sendo
 

 Sim.. e eu contava com a possibilidade da função sumir, mas ele sumiu
 até mesmo  com os símbolos e integrou até mesmo as funções grandes.

   
 assim, não tem porque o compilador criar uma entrada para ele na .symtab
 se ninguém vai usar.  Em outras palavras, isto está OK.  :)

 
 E tem mais. Uma printf para só imprimir uma string é trocada por
 uma puts, e com passagem de parâmetros por registradores, e não
 por pilha. Ele faz isto em muitas outras coisas. Eu já tinha ficado
 meio assombrado com o que ele fazia a alguns anos atrás, mas o
 pessoal ainda deu mais um capricho agora.
   
 Esse e mais um monte de truques.
 

 Como a printf com passagem de parâmetros por registrador. :^)

   
 Eu descobri isto parando o compilador a etapa do assembler, com
 a opção -S. Estou usando a versão AMD64.
   
 Tem uma outra onde tu pode ver a saída de cada estágio, inclusive os de
 otimização.  Gera um montão de arquivos, alguns que não tem como
 entender sem conhecer a estrutura interna do GCC, mas interessantes
 mesmo assim.
 

 Eu aprendi assembler do PDP 11/70 assim, com a opção -S. Comecei com
 o FORTRAN, e depois, quando comecei aprender C, fiz o mesmo. Ei ainda
 usava o adb, assembler debuger. Tinha cegado ao ponto de olhar para o
 assembler e ver na minha mente o código que o gerou. Mas com o nível de
 otimização atual isto é muito difícil.

 Lá pela versão 2.x o gcc já modificava loops por conta própria, e muitas
 outras coisas. Se você fizesse um loop de 0 a 10, e a variável de controle
 não fosse usada dentro do loop, ele invertia por conta própria, pois é mais
 fácil testar se é zero do que qualquer outra coisa.

 Eu achei uma pena a AMD não ter feito o processador de 64 bits dela
 ortogonal, como os PDP 11, os VAX e os Motorola 68K. Seria muito bom
 de entender o código assembler e geraria menos código.


 João Rocha.


   
 --
 Ricardo Nabinger Sanchez   [EMAIL PROTECTED]
 Powered by FreeBSD  http://rnsanchez.wait4.org

   Left to themselves, things tend to go from bad to worse.

 -
 Histórico: http://www.fug.com.br/historico/html/freebsd/
 Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd

 



   

-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] [Off-Toppic] GCC

2008-01-06 Por tôpico Joao Rocha Braga Filho
On Jan 6, 2008 10:13 AM, Jean Everson Martina [EMAIL PROTECTED] wrote:
 Bom pra dar meus dois centavos.

 Eu ja fiz este tipo de analise ha uns 2 anos num projeto de
 criptoanálise, onde nós tinhamos que fazer simulações de cifragem de
 2^48 vezes do AES por exemplo. Essa historia de colocar a função no meio
 do codigo economiza pelo menos 2 intruções. Tem outra opções legais,
 tais como --funrolloops, que desdobra todos os loops que tem o controle
 do numero de interações decidíveis em tempo de compilação. O tamanho do
 executavel aumenta consideravelmente, mas quando o tempo de carga é
 infimo quando comparado ao da execução, então carregar 20k ou 2M
 realmente não faz diferença. No nosso caso conseguiamos retirar mais de
 2^100 instruções executaveis de um codigo de 1500 linhas so usando as
 otimizações do GCC.
 Ainda assim usando -O3 e um saco de outras opções, ainda dava pra
 otimizar qualquer coisa na mão :)

Acredito que sim. Como acredito que nas versões atuais possa ter menos
coisa que possa ser otimizada à mão.

E por mais engraçado que pareça, tem vezes que um loop desenrolado
(unrolloops) pode ser mais lento que um não desenrolado, pois o desempenho
na execução do programa não depende só de quantas instruções ele executa,
mas também de onde elas vem. POr exemplo, o processador Pentium 4 tem
uma cache de 12 K de instuções já decodificadas. Grandes extensões de
código podem implicar em muito acesso à memória, ou à caches secundárias.

Mas loops desenrolados também eliminam instruções de teste e mecanismos
de predição de jumps. Talvez cada caso seja um caso.

Sim... Já brinquei muito com otimização de programas, e, em geral, os meus
programas consomem muito pouca CPU e memória.


João Rocha.




 Jean Martina



 Joao Rocha Braga Filho wrote:
  On Jan 2, 2008 10:01 AM, Ricardo Nabinger Sanchez [EMAIL PROTECTED] wrote:
 
  On Wed, 2 Jan 2008 00:23:21 -0200
  Joao Rocha Braga Filho [EMAIL PROTECTED] wrote:
 
 
  Alguém já olhou a geração de código de um gcc atual?
 
  Sim.
 
 
  Com a opção -O3, se uma função for static e só é chamada uma
  vez, ele some com ela introduzindo o código no local de chamada.
 
  static em funções diz ao compilador que ela é local àquela unidade de
  compilação (.o), e portanto o símbolo gerado não será visível.  Sendo
 
 
  Sim.. e eu contava com a possibilidade da função sumir, mas ele sumiu
  até mesmo  com os símbolos e integrou até mesmo as funções grandes.
 
 
  assim, não tem porque o compilador criar uma entrada para ele na .symtab
  se ninguém vai usar.  Em outras palavras, isto está OK.  :)
 
 
  E tem mais. Uma printf para só imprimir uma string é trocada por
  uma puts, e com passagem de parâmetros por registradores, e não
  por pilha. Ele faz isto em muitas outras coisas. Eu já tinha ficado
  meio assombrado com o que ele fazia a alguns anos atrás, mas o
  pessoal ainda deu mais um capricho agora.
 
  Esse e mais um monte de truques.
 
 
  Como a printf com passagem de parâmetros por registrador. :^)
 
 
  Eu descobri isto parando o compilador a etapa do assembler, com
  a opção -S. Estou usando a versão AMD64.
 
  Tem uma outra onde tu pode ver a saída de cada estágio, inclusive os de
  otimização.  Gera um montão de arquivos, alguns que não tem como
  entender sem conhecer a estrutura interna do GCC, mas interessantes
  mesmo assim.
 
 
  Eu aprendi assembler do PDP 11/70 assim, com a opção -S. Comecei com
  o FORTRAN, e depois, quando comecei aprender C, fiz o mesmo. Ei ainda
  usava o adb, assembler debuger. Tinha cegado ao ponto de olhar para o
  assembler e ver na minha mente o código que o gerou. Mas com o nível de
  otimização atual isto é muito difícil.
 
  Lá pela versão 2.x o gcc já modificava loops por conta própria, e muitas
  outras coisas. Se você fizesse um loop de 0 a 10, e a variável de controle
  não fosse usada dentro do loop, ele invertia por conta própria, pois é mais
  fácil testar se é zero do que qualquer outra coisa.
 
  Eu achei uma pena a AMD não ter feito o processador de 64 bits dela
  ortogonal, como os PDP 11, os VAX e os Motorola 68K. Seria muito bom
  de entender o código assembler e geraria menos código.
 
 
  João Rocha.
 
 
 
  --
  Ricardo Nabinger Sanchez   [EMAIL PROTECTED]
  Powered by FreeBSD  http://rnsanchez.wait4.org
 
Left to themselves, things tend to go from bad to worse.
 
  -
  Histórico: http://www.fug.com.br/historico/html/freebsd/
  Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
 
 
 
 
 
 

 -
 Histórico: http://www.fug.com.br/historico/html/freebsd/
 Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd




-- 
Sempre se apanha mais com as menores besteiras. Experiência própria.

[EMAIL PROTECTED]
[EMAIL PROTECTED]
http://www.goffredo.eti.br
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] [Off-Toppic] GCC

2008-01-02 Por tôpico Joao Rocha Braga Filho
On Jan 2, 2008 2:48 AM, Nenhum_de_Nos [EMAIL PROTECTED] wrote:
 On Jan 1, 2008 11:23 PM, Joao Rocha Braga Filho [EMAIL PROTECTED] wrote:
  Alguém já olhou a geração de código de um gcc atual?
 
  Com a opção -O3, se uma função for static e só é chamada uma
  vez, ele some com ela introduzindo o código no local de chamada.
 
  E tem mais. Uma printf para só imprimir uma string é trocada por
  uma puts, e com passagem de parâmetros por registradores, e não
  por pilha. Ele faz isto em muitas outras coisas. Eu já tinha ficado
  meio assombrado com o que ele fazia a alguns anos atrás, mas o
  pessoal ainda deu mais um capricho agora.
 
  Eu descobri isto parando o compilador a etapa do assembler, com
  a opção -S. Estou usando a versão AMD64.

 rapaz, nunca fui de ficar olhando estas coisas, só lia a respeito. e
 sempre, sempre li todos mandando correr de -O3 ...

 acho que nunca vi alguém falar bem dela ...

Eu sempre usei sem problemas. Pode ter tido uma versão que teve algum
bug. A uns 10 aos atrás tinha até -O6, mas acho que eliminaram alguns
níveis.

Eu já tinha visto este compilador fazer algumas coisas incríveis, tanto é
que falei que ele estava vivo e era inteligente. mas as que vi desta vez
colocam ele em outro patamar.


João Rocha.




 --
 We will call you cygnus,
 The God of balance you shall be
 -
 Histórico: http://www.fug.com.br/historico/html/freebsd/
 Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd




-- 
Sempre se apanha mais com as menores besteiras. Experiência própria.

[EMAIL PROTECTED]
[EMAIL PROTECTED]
http://www.goffredo.eti.br
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] [Off-Toppic] GCC

2008-01-02 Por tôpico Joao Rocha Braga Filho
On Jan 2, 2008 10:01 AM, Ricardo Nabinger Sanchez [EMAIL PROTECTED] wrote:
 On Wed, 2 Jan 2008 00:23:21 -0200
 Joao Rocha Braga Filho [EMAIL PROTECTED] wrote:

  Alguém já olhou a geração de código de um gcc atual?

 Sim.

 
  Com a opção -O3, se uma função for static e só é chamada uma
  vez, ele some com ela introduzindo o código no local de chamada.

 static em funções diz ao compilador que ela é local àquela unidade de
 compilação (.o), e portanto o símbolo gerado não será visível.  Sendo

Sim.. e eu contava com a possibilidade da função sumir, mas ele sumiu
até mesmo  com os símbolos e integrou até mesmo as funções grandes.

 assim, não tem porque o compilador criar uma entrada para ele na .symtab
 se ninguém vai usar.  Em outras palavras, isto está OK.  :)

 
  E tem mais. Uma printf para só imprimir uma string é trocada por
  uma puts, e com passagem de parâmetros por registradores, e não
  por pilha. Ele faz isto em muitas outras coisas. Eu já tinha ficado
  meio assombrado com o que ele fazia a alguns anos atrás, mas o
  pessoal ainda deu mais um capricho agora.

 Esse e mais um monte de truques.

Como a printf com passagem de parâmetros por registrador. :^)


 
  Eu descobri isto parando o compilador a etapa do assembler, com
  a opção -S. Estou usando a versão AMD64.

 Tem uma outra onde tu pode ver a saída de cada estágio, inclusive os de
 otimização.  Gera um montão de arquivos, alguns que não tem como
 entender sem conhecer a estrutura interna do GCC, mas interessantes
 mesmo assim.

Eu aprendi assembler do PDP 11/70 assim, com a opção -S. Comecei com
o FORTRAN, e depois, quando comecei aprender C, fiz o mesmo. Ei ainda
usava o adb, assembler debuger. Tinha cegado ao ponto de olhar para o
assembler e ver na minha mente o código que o gerou. Mas com o nível de
otimização atual isto é muito difícil.

Lá pela versão 2.x o gcc já modificava loops por conta própria, e muitas
outras coisas. Se você fizesse um loop de 0 a 10, e a variável de controle
não fosse usada dentro do loop, ele invertia por conta própria, pois é mais
fácil testar se é zero do que qualquer outra coisa.

Eu achei uma pena a AMD não ter feito o processador de 64 bits dela
ortogonal, como os PDP 11, os VAX e os Motorola 68K. Seria muito bom
de entender o código assembler e geraria menos código.


João Rocha.




 --
 Ricardo Nabinger Sanchez   [EMAIL PROTECTED]
 Powered by FreeBSD  http://rnsanchez.wait4.org

   Left to themselves, things tend to go from bad to worse.

 -
 Histórico: http://www.fug.com.br/historico/html/freebsd/
 Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd




-- 
Sempre se apanha mais com as menores besteiras. Experiência própria.

[EMAIL PROTECTED]
[EMAIL PROTECTED]
http://www.goffredo.eti.br
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


[FUG-BR] [Off-Toppic] GCC

2008-01-01 Por tôpico Joao Rocha Braga Filho
Alguém já olhou a geração de código de um gcc atual?

Com a opção -O3, se uma função for static e só é chamada uma
vez, ele some com ela introduzindo o código no local de chamada.

E tem mais. Uma printf para só imprimir uma string é trocada por
uma puts, e com passagem de parâmetros por registradores, e não
por pilha. Ele faz isto em muitas outras coisas. Eu já tinha ficado
meio assombrado com o que ele fazia a alguns anos atrás, mas o
pessoal ainda deu mais um capricho agora.

Eu descobri isto parando o compilador a etapa do assembler, com
a opção -S. Estou usando a versão AMD64.


João Rocha.


-- 
Sempre se apanha mais com as menores besteiras. Experiência própria.

[EMAIL PROTECTED]
[EMAIL PROTECTED]
http://www.goffredo.eti.br
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] [Off-Toppic] GCC

2008-01-01 Por tôpico Nenhum_de_Nos
On Jan 1, 2008 11:23 PM, Joao Rocha Braga Filho [EMAIL PROTECTED] wrote:
 Alguém já olhou a geração de código de um gcc atual?

 Com a opção -O3, se uma função for static e só é chamada uma
 vez, ele some com ela introduzindo o código no local de chamada.

 E tem mais. Uma printf para só imprimir uma string é trocada por
 uma puts, e com passagem de parâmetros por registradores, e não
 por pilha. Ele faz isto em muitas outras coisas. Eu já tinha ficado
 meio assombrado com o que ele fazia a alguns anos atrás, mas o
 pessoal ainda deu mais um capricho agora.

 Eu descobri isto parando o compilador a etapa do assembler, com
 a opção -S. Estou usando a versão AMD64.

rapaz, nunca fui de ficar olhando estas coisas, só lia a respeito. e
sempre, sempre li todos mandando correr de -O3 ...

acho que nunca vi alguém falar bem dela ...


-- 
We will call you cygnus,
The God of balance you shall be
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd