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 Amarante, Professor 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é Pereira 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 Amarante, Professor 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 Barboza Cardoso 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