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.
Este Exercício é dividido em várias partes e a meta mais importante é que você entenda as ferramentas indicadas ou similares. Estas ferramentas serão utilizadas nas próximas atividades da disciplina.
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). O encoder precisa do arquivo no
formato AIFF, para isto, utilize o comando "sox heavydrum.wav
heavydrum.aiff" para fazer a conversão.
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.
Inclua no seu relatório, respostas simples para as perguntas:
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? Descreva seus resultados sempre em relação ao mais
lento. Atenção: A opção O3 nem sempre será melhor. Meça o tempo de
compilação das opções e o tempo de execução e veja as diferenças (indique no relatório
tempo vai utilizar em cada caso: real, user ou system?)
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. Procure por tutoriais no Google se preferir. Aqui estão 4 sugestões: 1, 2, 3 e 4.
Você deve saber:
Utilizando o arquivo de exemplo fornecido como entrada, utilize o
depurador para descobrir o valor do vetor off, ao final da décima
primeira execução da função window_subband. Coloque a resposta no seu relatório.
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 (opcional): Se
você tiver que paralelizar alguma parte de um programa, 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.
Para ganhar um bônus na nota, ache alguma parte do programa ImageMagick
que possa ser paralelizada, paralelize, gere um patch e submeta como
contribuição para o site. Se você olhar a lista dos autores dos patches
de OpenMP, verá nomes de vários ex-alunos de minhas disciplinas.