Exercício 2 - Compilando, executando, depurando e algo mais...

Informações Gerais

Objetivos

Algumas coisas serão muito importantes nesta disciplina e, principalmente, na sua carreira em computação. Você deve saber compilar bem um programa, executá-lo de forma prática e automatizada, depurá-lo, saber qual parte dele é mais lenta e ter noções de paralelização.

Antes de começar

Este laboratório está baseado em ferramentas GNU que já estão instaladas em Linux mas que podem ser instaladas em Windows e Macs também.

Você deve responder estas perguntas:

  1. Como especificar as otimizações que um compilador deve utilizar num programa?
  2. Quais otimizações são importantes para o processador que você está utilizando?
  3. Qual a diferença entre um Makefile e um script?
  4. O que é "depurar um programa"?
  5. Como executar o GDB?
  6. Como utilizar um ambiente gráfico com o GDB?
  7. Como descobrir a parte que é mais executada de um programa?
  8. Como utilizar o gprof?
  9. Como fazer com que um programa tire proveito de multiprocessamento de forma escalável?

Ao final, você deve ser capaz de utilizar estas ferramentas e também diferenciar alternativas de ganho de desempenho obtidas por algoritmos e também por ferramentas.


Atividade

Um dos primeiros compressores/descompressores de MP3 criados é chamado de dist10, você deve encontrar um arquivo com nome dist10.tar.gz na internet e baixá-lo (nos testes abaixo, foque apenas nos arquivos dentro da pasta lsf/encoder). Para testes, utilize um arquivo .wav grande, como este (você pode utilizar outros se quiser).

Agora siga as atividades abaixo, anotando as informações e decisões que você precisará tomar para fazer seu relatório ao final.

Para fazer a próxima atividade você deve entender dos aplicativos configure e make.

Compile o programa sem nenhuma opção extra de compilação extra. Quanto tempo ele gasta para codificar o arquivo? Veja se o valor muda utilizando, separadamente, cada uma das otimizações -O0, -O1, -O2 -O3 (letra O maiúscula seguida de um número). Qual delas deu o melhor tempo? Existem outras otimizações que você pode aplicar no processador atual, consulte o manual do gcc por otimizações da categoria -mtune e veja quais se aplicam ao seu processador. Para que elas servem? O tempo melhorou?

Agora é hora de tentar entender um pouco o programa (mas não totalmente). Utilize o GDB para depurar seu programa. Muitas vezes, a interface em modo texto do GDB dificulta a depuração, recomendo que vocês utilizem um visualizador gráfico para o GDB. Um bom visualizador é o DDD (basta executar ddd na linha de comando). Alguns comandos interessantes do GDB que você deve saber utilizar: breakpoint, watchpoint, print, display, run, set args e help. Utilize o GDB para executar algumas partes do programa e tentar entender o fluxo de informações nele. Lembre-se que o foco é entender melhor o uso do GDB.

Em qual parte seu programa gasta mais tempo? use o gprof para descobrir (veja o manual do gprof ou os tutoriais 1 e/ou 2). Indique as duas funções que mais gastam tempo no seu programa no relatório.

Desafio: Se você tiver que paralelizar alguma parte do código, qual parte você escolheria? Como paralelizar de forma escalável o código? Eu sugiro utilizar OpenMP, veja uma breve apresentação, um tutorialo site oficial, uso pelo GCC e implementação GNU do for. Meça o tempo do programa paralelizado. O resultado foi o esperado? Comente.

Como melhorar ainda mais o desempenho deste programa?

Entrega

Enviar um relatório de apenas 1 página, descrevendo a atividade realizada, os arquivos de entrada e os computadores utilizados. O relatório deve conter uma tabela e/ou gráfico com a comparação de desempenho. Analisar e comentar o resultado.