Linhas Verticais

um blog sobre musica, arte, programação e outras coisas.

Gprof salva mais uma vez o dia ! junho 30, 2007

Filed under: astronomia,astronomy,programação — rangelfisica @ 9:43 pm

ngc_.pngm104.png

Esta imagem é um resultado do meu modelo de emissão em radio de galaxias espirais, eu estava querendo mesmo fazer uma galaxia sintética parecida com a galaxia do sombrero(M104), eu sei, esta diferente, mas é uma imagem apenas ilustrativa da saída do programa que estou desenvolvendo no doutorado, mas o relato de hoje é mais sobre programação e menos de astronomia.

Como bom programador eu faço uso do gdb e do gprof, fiquei viciado nestas coisas graças ao turbodebugger e turboprofile. Nesta ultima semana resolvi reescrever o core do programa da minha pesquisa sobre galaxias em C, o original estava em fortran, até que é simples, mas não pode ser linkado de forma tão trasparente com python quanto o C. Após alguns testes da nova versão notei uma lerdeza anormal, mesmo o algoritmo sendo um calculo de equação de transporte radioativo ao longo de uma galaxia inteira resolvi investigar. Para minha surpresa uma única função estava consumindo 38% do tempo de execução, era uma rotina simples que apenas calculava uma gaussiana, sim algo como f(x,s)=A*exp(-(x*x)/(2*s*s) ); a causa disso era o alto numero de chamadas: 203498400 vezes ! sendo que a resolução da imagem final é de apenas 120×40 pixels, aqui esta a saída do gprof:

53.12 95.97 95.97 4840 19.83 37.31 temperatura_brilho
38.97 166.37 70.40 203498400 0.00 0.00 gaussian
2.26 170.46 4.09 2415160 0.00 0.00 get_cylind
1.97 174.02 3.57 4241766 0.00 0.00 spiral
1.90 177.45 3.43 2415160 0.00 0.00 geometry_trasform_y
0.49 178.34 0.88 2415160 0.00 0.00 geometry_trasform_x
0.42 179.09 0.75 2155494 0.00 0.00 velocity

Cada coluna significa uma estatistica da função, as mais importantes para mim são: a primeira é a porcentgem de tempo do programa que esta função usa; a terceira, é o tempo que a função utiliza sem considerar as chamadas que ela faz para outras funções e a quarta que é o numero de vezes que esta função foi chamada.

Para saber o tempo total que o programa levou para se executar é melhor usar o comando time.

tempo total: 1m19.512s

Medidas a serem tomadas neste caso: como se tratava de uma gassiana, e seu valor é desprezível para altos valores de x ( 8 vezes a largura da gaussiana está de bom gosto), verificar se o resto da conta que ela esta multiplicando é zero, sim parece besteira mas calcular a função em uma equação do tipo f(x)=a1*a2*a3*gaussiana(x-x0) onde a1, a2 ou a3 é zero é perda de tempo, um simples IF antes pode poupar muito tempo de processamento. Tornar a função inline poderia ajudar se o problema fosse um numero alto de chamadas, mas neste caso o ganho não seria tão bom assim, realizada algumas mudanças simples, voltamos a execução:

65.45 30.50 30.50 4840 6.30 9.62 temperatura_brilho
9.53 34.94 4.44 13326369 0.00 0.00 gaussian
9.17 39.21 4.27 2415160 0.00 0.00 get_cylind
8.15 43.01 3.80 4241766 0.00 0.00 spiral
1.98 43.93 0.92 2415160 0.00 0.00 geometry_trasform_y
1.67 44.71 0.78 2155494 0.00 0.00 velocity

tempo total: 0m12.340s

Sim, parece surreal que a inclusão de duas linhas tornou o programa 10 vezes mais rápido! executar a versão otimizada pelo gcc (O3) reduz o tempo para 9 segundos, porem eu não confio no ozônio, prefiro o bom e velho oxigênio (O2).

Para que todo esse trabalho em reduzir o tempo de execução em 1 minuto? simples, o modelo testa um conjunto enorme de parâmetros e faz ajustes interativos, são os algoritmos de AI mais complicados que eu já coloquei as mãos! o programa é chamado uma quantidade enorme de vezes, com isso o tempo para ajustar o modelo à galaxias observadas é de “apenas” 4 dias de uso de uso continuo de CPU, reduzir a execução de 1 minuto para 12 segundos significa reduzir estes 4 dias para 1 ou 2 dias, salvando uns 3 dias de processamento. Agora percebe por que o gprof salvou o dia.

 

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s