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.
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:
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.
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 tutorial, o 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?