Engenharia e Ciência da Computação

Propaganda
Prova 1 – Engenharia Elétrica
Arquitetura de Computadores
Prof. Celso A. Saibel Santos
Nome:____________________________________________ Data: ____________________
1. (1.5) A frequência do clock é uma das variáveis utilizadas em projetos de arquiteturas de computadores, em
particular, dos processadores. Explique por que a mudança no tempo de ciclo de uma arquitetura não implica,
necessariamente, em aumento imediato de desempenho.
2. (1.0) Considere o código de uma mesma aplicação em linguagem de alto-nível compilado para duas arquiteturas,
uma RISC e outra CISC. Poderia se dizer que o código compilado para RISC sempre terá sempre mais bytes que o
compilado para CISC? Explique sua resposta com argumentos convincentes.
3. Um certo benchmark foi realizado com 97.789 operações de ponto flutuante,
conforme a tabela ao lado. O mesmo benchmark foi executado em um
processador embarcado, após um processo de compilação com a otimização
ativada. O processador embarcado é baseado em um modelo processador RISC
que inclui unidades funcionais de ponto flutuante. Entretanto, o processador
embarcado atualmente em uso não inclui o ponto flutuante por questões de custo,
consumo de energia e também, por não haver necessidade de ponto flutuante para
as aplicações destino. O compilador permite que as instruções de ponto flutuante
sejam calculadas com as unidades de hardware ou com rotinas de software,
dependendo das opções escolhidas para o compilador.
Operações em ponto flutuante
Operação
Contagem
Soma
Subtração
41007
4114
Multiplicação
36610
Divisão
10700
Conversão Int para PF
3003
Comparação
2355
TOTAL
97789
O benchmark demorou 1,08 segundo no processador RISC original e 13,6 segundos usando o software em sua versão
embarcada (sem otimizações do compilador). Suponha que o CPI usando o processador RISC original fosse medido
como 10 e o CPI da versão embarcada do processador fosse medido como 6.
a. (1.0) Qual o número total de instruções executadas em ambas as execuções do benchmark?
b. (1.0) Qual o valor MIPS para ambas as execuções?
c. (1.0) Em média, quantas instruções de inteiros são necessárias para implementar a execução de uma operação em
ponto flutuante usando rotinas em software?
4. (2.0) Escreva os códigos em linguagem de máquina para computar a expressão X=(A + B × C)/(A − B × C)
para as duas arquiteturas com instruções em linguagem de máquina disponíveis e formas de endereçamento para
operações aritméticas conforme a tabela a seguir. Em seguida, determine o no de bytes de instruções buscados na
memória e o no de bytes de dados trocados entre a memória e a CPU.
Forma de Endereçamento
Registrador-Memória
Registrador
OBSERVAÇÕES:
1. Considere possíveis otimizações no código
Load R1,M
Load R1,M
2. M é um endereço de memória 16 bits
Store R1,M
Store R1,M
3. Ri é um registrador de 4 bits
Add R3,R2,M
Add R3,R2,R1
4. Os opcodes possuem 8 bits
Sub R3,R2,M
Sub R3,R2,R1
Mult R3,R2,M
Mult R3,R2,R1
5. As instruções devem ter comprimentos múltiplos
de 4 bits
Div R3,R2,M
Div R3,R2,R1
6. Note que a linguagem não é MIPS
5. Considere que o código em C da função int Qx(int) a seguir foi compilado para MIPS.
int Qx (int i) {
(... lógica em C ...);
}
Código MIPS compilado:
Qx:
li $t1, 32
li $s0, 0
li $s1, 32
add $s0, $s0, $a0
L1: addiu $s0, $s0, 1
sub $s1, $t1, $s0
bne $s0, $t1, L1
jr $ra
• A variável i foi armazenada em $a0 e que os resultados gerados pela
função Qx estarão em $s0 e $s1, valores literais (variáveis) no espaço
de memória global.
• As instruções li e addiu correspondem, respectivamente, a um load
imediato (constante) e um add imediato sem sinal (constante positiva).
(a) (1.5) O que faz exatamente essa sequência de código em Qx? Dica: O
código MIPS foi gerado a partir da compilação de um código escrito
em C. Use instruções em C para auxiliar sua resposta.
(b) (1.0) Quais os valores finais armazenados em $s0 e $s1? Especifique
os valores em função do parâmetro i da função Qx.
Prova 2 – Ciência e Engenharia Computação
Arquitetura de Computadores
Prof. Celso A. Saibel Santos
Nome:____________________________________________ Data: ____________________
1. (6.0) Considere a arquitetura básica de uma CPU monociclo conforme esquema abaixo:
1,3ns
1,3ns
0 M
U
1 X
D
S1
S2
1ns
2,5ns
1,5ns
2,5ns
0 M
U
1 X
A
0 M
U
1 X
C
0 M
U
1 X
B
Suponha que a seguinte sequência de instruções deve ser executada nesta arquitetura:
Endereço
1000:0000
1000:0004
1000:0008
Instrução
sub $s0,$s1,$s2
sw $s0,64($t0)
sw $s1,0($t0)
Observações
Os registradores $t0-$t7 são numerados de 8 a 15 (temporários) e os de $s0$s7 de 16 a 23 (valores salvos/armazenados).
O opcode de sw é 101011 e o de sub é o 000000, com os bits [5-0] 100010.
(a) (2.0) Acrescente os caminhos de dados e sinais de controle que forem necessários para o funcionamento da
instrução slt $s1, $s2, $s3 (significado: if ($s2<$s3) $s1=1; else $s1=0;). Mostre e explique
as modificações na arquitetura da CPU anterior.
Existem várias soluções para a questão. Vamos apresentar duas:
a.1) Na primeira solução, a ULA foi implementada para executar a instrução slt $s1, $s2, $s3. A função
slt é definida como:
000 … 001 se A < B, i.e. if A – B < 0
A slt B =
000 … 000 se A ≥ B, i.e. if A – B ≥ 0
Neste caso, precisamos apenas conectar a saída da ULA (Resultado) ao registrador destino ($s1) na via de
dados. Todos os bits do valor Resultado serão “0”, exceto o último (bit mais significativo) que terá como valor
o sinal de A – B. Assim, não há modificações no circuito e o controle MemparaReg será “1” no
multiplexador MUXB para permitir a escrita de Resultado em $s1.
a.2) Na outra solução, a ULA trata a execução da instrução slt $s1, $s2, $s3 como uma subtração (sub),
supondo que a operação slt não foi implementada. Se a saída da ULA tiver um valor negativo após a
execução, então o bit mais significativo (MSB) do resultado estaria “setado” (valor=1) e, portanto, $s2-$s3<0
(ou seja, $s2<$s3) fazendo com que $s1=1. Se o MSB do resultado for 0, o resultado é positivo, então
$s1=0. Assim, bastaria usar o bit mais significativo de Resultado para se definir o valor do bit menos
significativo de $s1. Ou seja, $s1 será:
31
0
30
0
29
0
28
0
…
…
2
0
1
0
0
Resultado_31
(b) (1.5) Calcule o tempo de execução total para as três instruções anteriores na CPU monociclo dada. Lembre-se
de calcular inicialmente o valor do clock (fixo) para resolver a questão.
O valor do clock é definido como sendo aquele necessário para a execução da instrução mais lenta, em nosso
caso, a instrução lw. Assim, o valor do período de clock deve ser, no mínimo, de 8,5 ns. Supondo uma
instrução lw rd, imediato(rs)
Tempo de busca da instrução na memória de instruções: 2,5 ns
Tempo de acesso ao registrador de base no banco de registradores: 1 ns
Tempo de execução da operação na ULA para cálculo do endereço: 1,5 ns
Tempo de execução da leitura do dado na memória de dados: 2,5 ns
Tempo de escrita do dado no banco de registradores: 1 ns
Tempo total = período de clock = 8,5 ns
Assim, o tempo total de execução é de 25,5 ns, equivalente a 3 clocks, 1 para cada instrução.
OBS: Considera-se que o pulso de clock é instantâneo para efeitos práticos, isto é, assim que o pulso é emitido,
todos os sinais dependentes dele mudam de valor instantaneamente.
(c) (2.5) Para essas mesmas 3 instruções, mostre no gráfico abaixo em que instantes devem ser emitidos os sinais
pela parte de controle da CPU e os sinais de clock de forma que as instruções sejam realizadas corretamente.
sub <10>
add <10>
add <10>
clock
ULAOp
ULAFonte
LerMem
EscReg
EscMem
FontePC
MemParaReg
RegDest
0ns
5ns
2. (3.0) Considere a arquitetura de uma CPU Multiciclo conforme ilustrado a seguir. Quais os valores (bits) e
ordem cronológica dos clocks envolvidos e de todos os sinais acionados na máquina de estados do controle da
CPU para execução de uma instrução tipo R? Considere que os sinais de habilitação são ativados com nível 1
(isto é, se EscReg=1, o banco de registradores está habilitado para a escrita de um valor). Considere ainda que
ULAOp={soma→00; subtração→01; depende de funct (tipo R)→10}.
jump[31-0]
3. (1.0) Discuta a afirmação: Já que a instrução jump não usa registradores, nem computa valores para definir o
desvio, ela poderia, em tese, estar concluída já no segundo estágio da execução multiciclo. Isso poderia ser feito?
Explique.
Sim, poderia. O endereço do salto é um operador imediato na instrução, fazendo com que não seja necessário usar
a ULA para calcular o endereço do desvio. Por outro lado, um tratamento específico para a instrução jump, que não
é tão frequente nos códigos de aplicação acarretaria um aumento da complexidade da lógica de decodificação, indo
de encontro ao conceito RISC de fazer mais rápido o que é mais frequente. Dessa maneira, a execução das
instruções do tipo jump também acaba sendo feita em 3 estágios de forma a manter inalterado o estágio de
decodificação para todas as instruções.
4. (EXTRA 20% a mais na nota)
a. (10%) Explique com argumentos convincentes, as afirmações: (i) “Não há overflow quando se soma um
número positivo com um negativo” e (ii) “Não há overflow se os sinais são os mesmos numa subtração”.
b. (10%) Considere a representação a seguir para uma implementação “otimizada” do algoritmo de
multiplicação de inteiros binários. Mostre a evolução passo-a-passo da multiplicação de
0000011001000000 * 0000000000101000 (isto é, 1600 * 40 =64000) usando o esquema apresentado
Start
Product0 = 1
1. Test
Product0
Produ ct0 = 0
1a. Add multiplicand to the left half of
the product and place the resul t in
the left half of the Product register
2. Shift the Product register right 1 bit
Multiplic and
16 bits
16nd repetition?
No: < 1 6 repetitions
16-bit A LU
Yes: 16 repeti tions
Done
P roduct
32 bits
S hift right
Write
C ontrol
tes t
Prova 3 – Ciência e Engenharia da Computação
Arquitetura de Computadores
Prof. Celso A. Saibel Santos
Nome:____________________________________________ Data: ____________________
1. (1.5) Implemente os adiantamentos que forem necessários para que o código a seguir não gere bolhas no
pipeline. Considere que nos códigos MIPS indicados na tabela, X é um endereço de memória e Rx é o registrador
que armazena o valor de X. Use a tabela para descrever os estágios de execução de cada uma das instruções a fim
de detectar os conflitos. Insira as conexões necessárias para que seja feito o adiantamento de dados no esquema
de execução do pipeline logo abaixo da tabela.
y ← x + z;
h ← y + x;
lw Rx,x
lw Rz,z
add Ry,Rx,Rz
sw y,Ry
add Rh,Ry,Rx
sw h,Rh
CICLO
0
1
2
3
4
5
6
7
8
9
10
2. (1.5) Um esquema para minimizar os efeitos dos “conflitos de controle” (causados por mudanças no fluxo de
controle durante a execução das instruções) é baseado na predição da ocorrência de desvios. Um esquema
sofisticado de predição trabalha com a hipótese de que desvios para endereços anteriores sempre se realizam e
que desvios para endereços posteriores nunca se realizam. Explique como isso é feito e por que o esquema tem
predição tem uma taxa de acerto tão elevada (benchmarks mostraram taxas de acerto da ordem de 90%).
3. (1.0) Explique como funcionam as políticas do tipo write-through e write-back para garantir a integridade dos
dados em um sistema de memória.
4. (4.5) Considere a representação de uma memória cache conforme esquema abaixo:
(A)
(E)
(D)
(C)
(B)
entradas
a. (2.5) Explique o funcionamento da cache, mencionando obrigatoriamente, os componentes indicados
(A, B, C, D e E) indicados no esquema.
b. (1.0) Mostre qual é o tamanho (em bits) dessa cache.
c. (1.0) Explique por que essa estrutura permite explorar tanto da localidade temporal quanto da espacial.
5. (1.5) A técnica de memória virtual permite que a quantidade de memória necessária para a execução de um único
processo exceda a quantidade total de memória física disponível. Explique como isso é feito.
Download