sábado, 3 de maio de 2008

Dica: compilação otimizada no GCC

.
Estou testando a NetBeans IDE, trabalhando com um projeto de redes neurais em C pro doutorado. Esbarrei no parâmetro "-O2" (letra Ó maiúscula), que seria para forçar o gcc a fazer uma otimização no código compilado. Resolvi então medir o tempo de processamento sem e com este parâmetro.

Minha rede neural tem 3 camadas (incluindo a de entrada), 2 neuronios de entrada, 2 na camada escondida e 1 de saida. Botei a bicha pra aprender o velho e bom XOR com backpropagation, num total de 200000 épocas de treinamento.

Coloquei o seguinte código respectivamente no início e no fim do main() para calcular o tempo de processamento:

struct timeb ini, fim;
ftime(&ini);

.... todo o processamento ...

ftime(&fim);
printf("\n%f\n", ((double) fim.time + ((double) fim.millitm * 0.001)) - ((double) ini.time + ((double) ini.millitm * 0.001)));

Compilei o programa sem o parâmetro de otimização:

gcc -o rna rnapi2.c -lm

... e ele levou 48.220000 segundos de execução.

Já compilando com o parâmetro de otimização,

gcc -O2 -o rna rnapi2.c -lm

... fantásticos 20.003000 !!

Um segundo teste gerou os tempos 54 contra 19. Aliás, dá pra notar a velocidade diferente na própria exibição de mensagens no terminal (meu programa exibe, a cada época, o erro médio do conjunto de treinamento, ou seja, joga 200000 linhas na tela...).

Vou estudar mais um pouco esse parâmetro, ver as limitações em termos de arquitetura de processadores e outros detalhes. Nesse meio tempo, comentários dos experts no assunto são bem vindos!!

Abraços!
Carlão

4 comentários:

Gesil disse...

Oi Carlão.
Testa tb o -O3. E, se tiver um tempinho a mais, testa o compilador da Intel, que é gratuito para Linux e tem uns tempos bem melhores que o gcc.
Abraço,
Gesil

Carlos José disse...

Oi Gesil,
Cheguei a testar o O3, mas tive uns resultados tão loucos (numa hora, mais de 50 segundos, noutra, menos de 20!!!!) que parei e deixei pra testar com calma depois (o Dr. Ado fica no meu pé, não deixa eu pensar em nada além... RISOS).
Baixei o compilador da Intel, mas também vai ficar "pra hora do cafezinho" (risos), pois o bicho é complicado pacas pra instalar.
Abraços!
Carlão

Gesil disse...

É.. O -O3 nem sempre funciona... É a tal otimização genérica-agressiva.
O intel dá trabalho mas rende bem, viu?
Abraço,
Gesil

Pablo disse...

Eu não sou muito indicado pra falar sobre isso, malmente eu sei os parâmetros certos pra passar pro gcc [sem ser o basicão] mas nesse tutorial do site do morimoto http://www.guiadohardware.net/dicas/apt-build.html

ele mostra o uso do apt-build, que ajuda a compilar projetos [aqueles no formato default no linux configure;make;make install] e tbm tem a opções de optimizações, Ele até faz um comentário falando da opção 3 [sem entrar em detalhes]

Mas o bom do apt-build é que fica fácil de manter os pacotes compilados no linux..."O apt-build é um excelente programa que além de facilitar o processo de compilação, deixa o seu sistema limpo e sem “programas perdidos” oriundos de compilações. Tudo roda com ótima performance, sem termos que nos preocupar com instalações de libs e dependências e o gerenciador de pacotes do Debian continua controlando o sistema tornando-o além de seguro e rápido, confiável." David Dias

Abraços