A medição de performance do homem pobre…

Ok, “comi mosca” no último post… Não considerei o problema dos caches e outros, como page misses, por exemplo… Existem outros problemas que não foram considerados: A otimização feita pelo compilador é um deles…

Quando você cria funções no mesmo módulo (no mesmo arquivo .c), o compilador tende a colocar essas funções in-line. Ou seja, não há uma chamada e um retorno da função. A função é incorporada no código de quem a chamou! Se você quiser fazer pequenos programas de teste, como o que fiz anteriormente, deve compilar usando a chave -fno-inline, para evitar esse efeito, ou desabilitar as otimizações com a chave -O0. Só que isso lhe dará a performance de código não-otimizado, que não serve para nada (em minha opinião).

Pode ficar ainda melhor se além de usar -fno-inline, você ciar um módulo separado com as funções sob teste e não usar otimizações em tempo de linkagem. Assim, você teria um código em mat4.c e outro, com a função main(), com as chamadas das funções e o uso das macros START_CYCLE_COUNTSTOP_CYCLE_COUNT, chamado main.c, por exemplo.

Mais um detalhe: Faça várias medições… lembre-se que você está trabalhando com um ambiente multirhreaded. As medições nunca são absolutamente precisas. Um pouco de estatística é impressindível para que as medições façam algum sentido. Por exemplo, no código do post anterior, você pode conseguir medições onde Multiply4x4Matrices_SSE() seja mais lenta que Multiply4x4Matrices(). Mas, em média, a primeira é cerca de 40 ciclos mais rápida que a segunda. Faça umas 10 medições e tire a média. Deve-se, também, executar cada função sob teste diversas vezes e dividir a contagem de ciclos pelo número de chamadas. Mas, não faça chamadas demais: Isso afeta o cache!

Se suas rotinas fazem uso maciço de dados há necessidade de considerar, também, os efeitos de cache missespage misses. Nisso as macros START_CYCLE_COUNTSTOP_CYCLE_COUNT não lhes serão úteis… Você pode usar um programa como VTune para tentar fazer mais sentido de medições (pena que o VTune não seja gratuito!). Outros utilitários podem te ajudar, embora sejam menos precisos, como o gprof (impreciso… não conta ciclos, mas tempo!) e o perf (que é tão bom quanto o VTune, mas é preciso saber usá-lo!).

Eis um resumo:

  1. Desabilite funções in-line no mesmo módulo com -fno-inline;
  2. Coloque as funções sob teste em outro módulo (arquivo .c);
  3. Meça os ciclos de multiplas chamadas às funções sob teste;
  4. Faça várias medidas e tire uma média;
  5. Cuidado com os efeitos de cache e páginas.
Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

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