Esse exercício vai ser dividido em partes e, ao final delas, vocês devem ser capazes de:
Atenção: Todos os arquivos que você precisa para essa atividade estão disponíveis em /home/staff/rodolfo/mc723/download.
Uma plataforma virtual é um software capaz de simular um hardware com um bom nível de detalhes. Geralmente não é necessário modificar programas que rodam nesta plataforma virtual para executá-los numa plataforma real (hardware). Alguns componentes existentes em plataformas reais não aparecem nas versões virtuais para não afetar o desempenho. Outros componentes aparecem com versões bastante simplificadas. Entranto, dificilmente o software que está executando nesta plataforam virtual deve ser capaz de notar esta diferença. Como exemplos destes componentes que podem aparecer de forma diferente temos: caches (que pode não existir), periféricos (que podem apenas emular o que deveriam fazer), etc.
Vocês usarão, neste exercício, o pacote ARP (ArchC Reference Plataform) para gerenciar plataformas. Ele será exatamente o mesmo pacote que vocês utilizarão durante o semestre para realizar os demais experimentos. A ARP nada mais é que um conjunto de Makefiles e uma estrutura de diretórios para facilitar o desenvolvimento de projetos maiores. Cada diretório tem um conteúdo específico:
Pegue a plataforma de exemplo (arp-rodolfo.tgz), descompacte-a e navegue pelos diretórios observando o conteúdo de cada um deles. Embora exista uma versão da ARP descompactada no meu homedir, vocês devem começar com a versão vazia indicada acima. Para executar a plataforma, basta utilizar os comandos:
make
make run
O primeiro comando compila a plataforma e o segundo executa. Se for necessário compilar o programa, você deve utilizar o compilador instalado em /l/archc/compilers/bin da máquina xaveco (o compilador está apenas nela, você pode executar os programas compilados em qualquer outra máquina, mas os compiladores para MIPS estão apenas na xaveco). Para facilitade, inclua o caminho anterior no PATH antes de executar os dois comandos acima.
Ao final da
execução, o simulador indicará quantas instruções por segundo ele
conseguiu executar. Anote este número. O que acha desta velocidade?
Será que tem como melhorar? Se seu computador for muito rápido, faça
uma modificação básica no programa (comente no relatório) de forma a
gastar mais tempo.
Uma métrica importante na
execução de programas em simuladores é o slowdown factor,
que indica a perda de desempenho ao
executar um programa num simulador em relação à execução num sistema
real. Execute o programa, no seu computador, sem o simulador, e com o
simulador. Indique no seu relatório quantas vezes mais lenta foi a
execução no simulador. Atenção: compare o tempo que o simulador anuncia
com o tempo medido pela linha de comando. Qual é o correto? Por que?
Você colocou as
otimizações corretas/necessárias? Indique no seu relatório quais
otimizações, onde colocou e o resultado obtido.
Você consegue executar outro
programa? Faça um programa (bem simples) e coloque para executar nesta
plataforma. A velocidade de simulação é similar? Qual o slowdown factor?
Dica: Você pode ver o conteúdo, em assembly, do seu programa
utilizando o software objdump. No caso do mips, a versão
mips-elf-objdump (a opção -d lista as instruções do programa)
O simulador gerado anteriormente foi projetado em ArchC. Estes processadores podem ser utilizados tanto em plataformas quanto em modo isolado. Quando uma plataforma é bem simples, é preferível ter o processador isolado. Pegue o arquivo mips1-v0.7.8.tgz, que contém o modelo do MIPS (praticamente idêntico ao que você utilizou anteriormente, e execute o mesmo programa da Parte 1. Para isto, você deve descompactar o arquivo, utilizar o ArchC para gerar o modelo em SystemC, compilar o modelo e executá-lo. Tanto ArchC quanto SystemC estão instalados em /home/staff/rodolfo/mc723, basta utilizá-los.
acsim mips1.ac -abi
make -f Makefile.archc
mips1.x --load=<nome do programa que você quer executar> <parâmetros para o programa>
Atualize o PATH convenientemente antes de executar estes comandos.
Qual foi o desempenho da simulação agora? A diferença é muito grande? Qual o slowdown factor?
Você colocou as
otimizações corretas/necessárias? Indique no seu relatório quais
otimizações, onde colocou e o resultado obtido.
Este resultado ficou consistente com o da Parte 1? Compare a complexidade dos dois sistemas e os respectivos slowdown factors.
Desafio opcional valendo bônus na nota: Pegue todos os componentes necessários para esta simulação, recompile-os utilizando as melhores otimizações possíveis para gerar o simulador mais rápido possível. Meça o tempo de execução do programa JPEG coder em instruções por segundo (conforme mostrado no final do relatório da execução (não utilize o comando time). Todos deverão utilizar a máquina ssh.students.ic.unicamp.br. O melhor desempenho sem modificar o código fonte do ArchC ganhará um bônus. O melhor desempenho modificando pouco do código do ArchC também ganhará um bônus (pouco = pouquíssimas linhas). Um mesmo aluno pode ganhar bônus dobrado se fizer os dois melhores resultados. Os 3 melhores resultados de cada categoria terão que fazer uma demonstração de suas modificações numa das aulas. O programa a ser utilizado está disponível dentro do pacote mibench-mips1.tgz, dentro do diretório consumer/jpeg/bin (arquivo cjpeg). Utilizar como entrada o input_large. Veja maiores instruções de uso diretamente no diretório do programa. Os arquivos já estão compilados, você deve utilizar a versão compilada disponível. Cheque se a resposta gerada é válida.
Esta parte é a meta principal do exercício. Você deve documentar as
informações importantes no seu relatório. Para isto você precisará
escolher um programa do pacote MiBench para executar. O pacote inteiro,
compilado para MIPS, está no meu homedir do IC-3. Reserve o seu pacote
e a versão do teste nesta planilha.
Você deve editar o código da plataforma da Parte 1 para que, ao final da simulação, ela imprima o número de acessos de leitura e escrita (separadamente) feitos na memória.
Você deve editar o código da Parte 2 para que, ao final da
simulação, ela imprima o número de vezes que as instruções add, lw e sw
foram executadas. Não conte as variações, apenas estas instruções.
Dicas: