Re: [FUG-BR] [Off-Toppic] GCC
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
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
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
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
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
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