Exercício 6 - Plataforma Multicore

Informações Gerais

Dicas sobre o Exercício

Motivação

Objetivos

Esse exercício vai ser dividido em partes e, ao final delas, vocês devem ser capazes de:

Contextualização

Atenção: Como sempre, todos os arquivos que você precisa para essa atividade estão disponíveis em /home/staff/rodolfo/mc723/download.

Parte 1 - Criando uma plataforma multicore

A descrição desta parte é bem simples: pegue a plataforma do exercício anterior e faça com que ela funcione com dois processadores. Para isto, crie uma nova plataforma com o nome dual_mips e monte o resto da estrutura necessária, conforme os passos a seguir.

Utilize como base os resultados do exercício 4 com o periférico de Lock, sem os periféricos de operações aritméticas de ponto flutuante. Como você já testou este código no exercício 4, provavelmente não vai encontrar nenhum problema até aqui (este é o código da primeira execução do programa da multiplicação de matrizes, apenas renomeie os arquivos necessários para ter outra plataforma como indicado acima).

Instancie dois processadores no arquivo main.cpp. Conecte estes dois processadores no roteador. Você terá que criar outra porta similar à target_export. Isto deveria ser suficiente para seu simulador começar a executar, só que ele tentará executar duas vezes exatamente o mesmo programa, o que não é a meta deste exercício. Três passos serão necessários para separar o fluxo de execução, são eles: fazer com que todos os processadores comecem da mesma forma, fornecer uma pilha diferente para cada processador e separar o fluxo de execução.

Para iniciar todos os processadores da mesma forma, o único cuidado que você deve ter é com a chamada ao método init dentro de main.cpp. Este método recebe os parâmetros da linha de comando mas, pela forma como foi implementado, remove o primeiro parâmetro da listagem. Assim, se você passar as mesmas variáveis para todos os processadores, cada um receberá um parâmetro a menos que o anterior. Sugestão: monte as linhas de comando já no main.cpp da forma correta ou duplique todos os parâmetros antes de chamar o método init.

Cada thread de execução precisa de uma pilha separada, senão o comportamento do programa em execução será incoerente. Para fornecer uma pilha diferente para cada thread, existem duas alternativas simples: inserir um código em assembly inline no início do programa. Certifique-se de ter cada processador com um endereço de pilha diferente (recomendo 32Kb ou 64Kb por pilha). Se for utilizar assembly inline, separe o fluxo de execução antes, conforme descrito no parágrafo seguinte. Uma outra alternativa é editar o arquivo mips1_syscall.cpp, no momento em que ele inicia o registrador $SP, e definir um valor inicial diferente a cada passagem por esta linha de código. Assim você garante a escalabilidade completa, sem precisar se preocupar com o número de processadores nem com código assembly inline.

Separar a execução de cada thread. Você deve utilizar o periférico de lock, definido e implementado no exercício 4, para gerenciar o controle de concorrência em uma posição de memória e realizar uma atividade diferente a cada vez que aquele trecho for executado. Lembre-se dos exemplos de código do exercício 4. Sugiro que você implemente as funções: AcquireGlobalLock, ReleaseGlobalLock, AcquireLock e ReleaseLock. As duas primeiras trabalham com o lock global em hardware e as outras duas com locks baseados em variáveis locais. Para implementar estas últimas duas, você deve obter o lock global antes e fazer as alterações nestas variáveis. Assim, com apenas um lock global você consegue ter tantos locks locais quanto necessário.

Descreva suas decisões de projeto. Estarei disponível no laboratório para discutir as possíveis decisões de projeto e como implementá-las.

Crie um programa, por mais simples que seja, que tira proveito de sua plataforma paralela. Qual o desempenho do simulador?

Parte 2 - Escalabilidade

Quão escalável é sua plataforma? Você consegue fazer uma versão de 4 cores? 8 cores? Faça-as e execute seu programa. Avalie o desempenho do simulador.

Prepare a versão de 8 cores para entrega.

Entrega

O código desta atividade terá que ser entregue. Envie o relatório pelo Susy e guarde o código na sua área até que eu solicite. Enviar um relatório de apenas 1 página descrevendo a atividade realizada e os resultados obtidos.