exerc´ıcios de arquitetura de computadores

40

Upload: buihanh

Post on 07-Jan-2017

275 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Exerc´ıcios de Arquitetura de Computadores

Exercıciosde

Arquitetura de Computadores

Ano Letivo de 2016/2017

Page 2: Exerc´ıcios de Arquitetura de Computadores

1 Compilacao de Programas

No compilador gcc (Gnu C Compiler) pode efectuar apenas alguns dos passos da com-pilacao (pre-processamento, compilacao, assemblagem, linkagem). Para tal existem asopcoes: “-E”, “-S” ou “-c” – para indicar ao gcc onde parar. Se nenhuma destas opcoesfor usada, sao executados todos os passos, i.e., a saıda e um ficheiro binario executavel sea compilacao for bem sucedida.

• -E, parar logo apos o pre-processamento de diretivas e macros.

• -S, gerar codigo assembly correspondente ao programa fonte, nao gerar codigo binario.

• -c, gerar codigo binario mas nao fazer a ligacao.

• -o fich, colocar o codigo binario no ficheiro “fich”.

As extensoes usuais dos ficheiros usados/gerados pelo gcc sao: fich.c - codigo fonte emC; fich.h - ficheiro de cabecalho com codigo fonte em C; fich.i - codigo fonte em C pre-processado; fich.s - codigo assembly intermedio; fich.o - ficheiro binario nao executavel;fich - binario executavel.

Figura 1: Sequencia de passos na compilacao de um programa.

Page 3: Exerc´ıcios de Arquitetura de Computadores

Considere os seguintes programas em C:

Programa #1

#include <stdio.h>

#include <math.h>

#define MIN 0

#define MAX 360

main() {

int i,j;

char *s;

#ifdef DEBUG

printf("Computing cos table ...\n");

#endif

for(i=MIN;i<MAX;i++) {

printf("cos(%d*PI/180.0) = %f\n", i, cos(M_PI*i/180.0));

}

#ifdef DEBUG

printf("done.\n");

#endif

}

Programa #2

#include <math.h>

main() {

int i;

double cos_table[360];

for(i=0;i<360;i++) {

cos_table[i] = cos(M_PI*i/180.0);

}

}

Page 4: Exerc´ıcios de Arquitetura de Computadores

Programa #3

#include <stdio.h>

#include <unistd.h>

#define PWD "CrappyPassword"

#define MIN 0

#define MAX 3

#define STRING_MAX_SIZE 128

main(){

int i;

char s[STRING_MAX_SIZE];

#ifdef DEBUG

printf("Start reading ...\n");

#endif

i=MIN;

while(i<MAX) {

scanf("%s",s);

printf("crypt(%s) = %s\n",s,crypt(s,PWD));

i++;

}

#ifdef DEBUG

printf("... done\n");

#endif

}

Page 5: Exerc´ıcios de Arquitetura de Computadores

1. Para cada programa, utilize o gcc para verificar quais sao as alteracoes realizadas nopasso de pre-processamento do codigo. Repita o pre-processamento, mas desta vez utilizeo gcc com o argumento -DDEBUG.

2. Para cada programa, compile o codigo C para codigo assembly. Caso obtenha errosou avisos, identifique o ponto da compilacao em que ocorreram e altere o programa e/ouas opcoes da linha de comando do gcc para que a compilacao seja bem sucedida.

3. Para cada programa, gere o codigo assembly e compare-o com o codigo fonte em C.O assembly obtido e de que arquitectura? Tente identificar as estruturas principais doprograma: ciclos, saltos, saltos condicionais, chamadas de funcoes.

4. Para o programa #2, gere o codigo assembly com as opcoes adicionais de optimizacaode codigo do gcc: -O1 e -O2. Compare o assembly gerado e explique as diferencas entreas versoes sem e com optimizacao.

5. Para cada programa, compile o codigo assembly para o codigo binario (objecto). Use ocomando nm para verificar quais as funcoes nao definidas, i.e., cujo codigo nao esta incluıdono ficheiro objecto.

6. Compile o codigo obtido na alınea anterior para o codigo executavel. Caso obtenhaerros ou avisos do ligador, identifique as funcoes problematicas e altere as opcoes da linhade comando do gcc para que a compilacao seja bem sucedida (sugestao: consulte o manualpara as funcoes e faca uso das opcoes, -L e/ou -l).

Page 6: Exerc´ıcios de Arquitetura de Computadores

2 Representacao de Inteiros

Dada uma sequencia de n bits an−1an−2 . . . a2a1a0 (ai ∈ {0, 1}), sem sinal, o numero inteirom representado pela mesma e:

m = an−1 × 2n−1 + an−2 × 2n−2 + · · ·+ a2 × 22 + a1 × 21 + a0 × 20

para an−1an−2 . . . a2a1a0 = 0 . . . 0 valor mınimo m = 0

para an−1an−2 . . . a2a1a0 = 1 . . . 1 valor maximo m = 2n − 1

Para numeros com sinal, em complemento para 2, o numero m seria:

m = −an−1 × 2n−1 + an−2 × 2n−2 + · · ·+ a2 × 22 + a1 × 21 + a0 × 20

para an−1an−2 . . . a2a1a0 = 10 . . . 0 valor mınimo m = −2n−1

para an−1an−2 . . . a2a1a0 = 01 . . . 1 valor maximo m = 2n−1 − 1

Page 7: Exerc´ıcios de Arquitetura de Computadores

Inteiros sem sinal:

57/2 = 28 : 1

28/2 = 14 : 0

14/2 = 7 : 0

7/2 = 3 : 1

3/2 = 1 : 1

1/2 = 0 : 1

57(10) = 00111001(2) em 8 bits

e de volta:

00111001(2) = 0× 27 + 0× 26 + 1× 25 + 1× 24 + 1× 23 + 0× 22 + 0× 21 + 1× 20(10)

= 32 + 16 + 8 + 1(10)

= 57(10)

Inteiros com sinal (em complemento para 2):

−57(10) = ¬(57(2)) + 1(2)

= ¬(00111001) + 1(2)

= 11000110 + 1(2)

= 11000111(2) em 8 bits

ou, pela definicao de complemento para 2 (em 8 bits):

−57(10) = 28(2)− 57(2)

= 100000000− 00111001

= 011000111(2) so os 8 bits menos significativos

e de volta:

11000111(2) = −1× 27 + 1× 26 + 0× 25 + 0× 24 + 0× 23 + 1× 22 + 1× 21 + 1× 20(10)

= −128 + 64 + 4 + 2 + 1(10)

= −57(10)

Page 8: Exerc´ıcios de Arquitetura de Computadores

1. Indique a representacao binaria, em 8 bits, sem sinal dos seguintes numeros inteiros.

• 75

• 102

• 127

• 240

2. Passe para a base decimal as seguintes sequencias binarias, assumindo que representaminteiros sem sinal em 8 bits.

• 00101010

• 01100101

• 10010010

• 11100011

3. Indique a representacao binaria, em 8 bits, com sinal (em complemento para 2) dosseguintes numeros inteiros.

• 20

• -20

• 126

• -126

4. Passe para a base decimal as seguintes sequencias binarias, assumindo que representaminteiros com sinal, em complemento para 2, em 8 bits.

• 00101010

• 01100101

• 10010010

• 11100011

Page 9: Exerc´ıcios de Arquitetura de Computadores

5. Quais dos seguintes numeros nao e possıvel representar na base binaria usando arepresentacao em complemento para 2 usando apenas 8 bits?

• 127

• 128

• -128

• -129

6. Calcule o resultado das seguintes operacoes usando durante o calculo a base binariana representacao em complemento para 2 em 8 bits. Quais das operacoes dao “overflow”?

• 15 + 29

• 13 - 7

• -25 + 51

• -14 - 37

• 121 + 16

• -95 - 43

Page 10: Exerc´ıcios de Arquitetura de Computadores

3 Numeros em Vırgula Flutuante

Formato IEEE754, precisao simples:

total s (bits) e (bits) m (bits)single 32 1 8 23

double 64 1 11 52

sinal expoente mantissa numero(1 bit) (8 bits) (23 bits)

- 0 . . . 0 0 . . . 0 zero- 0 . . . 0 a1 . . . a23 numero nao normalizado, ai ∈ {0, 1} ∧ ∃i : ai 6= 0- 0 . . . 01 - 1 . . . 10 a1 . . . a23 numero normalizado, ai ∈ {0, 1}- 1 . . . 1 0 . . . 0 infinito- 1 . . . 1 a1 . . . a23 NaN (Not a Number), ai ∈ {0, 1} ∧ ∃i : ai 6= 0

O numero real x representado por uma tal sequencia e:

para numeros normalizados (precisao simples):

x = (−1)s × (1 + m(10))× 2e(10)−127

para numeros nao normalizados (precisao simples):

x = (−1)s ×m(10)× 2−127+1

Em precisao dupla, o expoente tem 11 bits, a mantissa 52 e o desvio no expoente e de 1023(em vez de 127).

Page 11: Exerc´ıcios de Arquitetura de Computadores

Decimal para binario, precisao simples:

6.6875(10) = 6 + 0.6875(10)

6(10) = 110(2)

2× 0.6875 = 1.375

2× 0.375 = 0.75

2× 0.75 = 1.50

2× 0.5 = 1.0 (parar quando parte fracionaria e 0)

0.6875(10) = 0.1011(2)

6.6875(10) = 110.1011(2) = 1.101011× 22 (representacao em vırgula flutuante)

s = 0

e− 127 = 2

e = 129 = 10000001(2) 8 bits em precisao simples

m = 10101100000000000000000 23 bits em precisao simples

6.6875(10) = 0 10000001 10101100000000000000000 (representacao em binario)

Binario, precisao simples, para decimal:

1.101011× 22 = (−1)0 × (1 + 1× 2−1 + 0× 2−2 + 1× 2−3 + 0× 2−4 + 1× 2−5 + 1× 2−6)× 22

= (1 + 1/2 + 1/8 + 1/32 + 1/64)× 4

= 6.6875(10)

Page 12: Exerc´ıcios de Arquitetura de Computadores

Adicao em vırgula flutuante.

Figura 2: Algoritmo de adicao em vırgula flutuante.

Exemplo, 0.90625 + 0.1875:

0.90625(10) = 1.1101× 2−1

0.1875(10) = 1.1× 2−3

0.1875(10) = 0.011× 2−1 acertar expoente

1.1101 + 0.0110 = 10.0011 fazer adicao

10.0011× 2−1 = 1.00011× 20 normalizar, nao e preciso arredondar

Resultado (em precisao simples):

1.00011× 20 = 0 01111111 00011000000000000000000

Page 13: Exerc´ıcios de Arquitetura de Computadores

1. Calcule a representacao em formato de vırgula flutuante e em formato binario (IEEE754,precisao simples) dos seguintes numeros reais.

• 0.25

• 0.046875

• -16.375

• -0.5625

2. Calcule os numeros, na base 10, a que correspondem as seguintes sequencias binariasem formato IEEE754 de precisao simples.

• 0 01111101 10010000000000000000000

• 0 10000010 11001000000000000000000

• 1 01111100 01011000000000000000000

• 1 10000011 10011100000000000000000

3. Qual o numero normalizado positivo mais pequeno que pode representar com precisaosimples? E nao normalizado? E o maior normalizado com precisao simples?

4. Calcule o resultado das seguintes operacoes usando o algoritmo de adicao em vırgulaflutuante IEEE754. Deve verificar se ocorre “overflow” ou “underflow”.

• 32.5 + 0.046875

• -0.875 - 0.5625

• -325.875 + 0.546875

• 524288.25 - 0.0078125

5. Repita o exercıcio anterior assumindo que a mantissa tem apenas 3 dıgitos e nao os23 dos numeros representados em precisao simples.

6. Calcule: 1.00101 x 2−126 - 1.00010 x 2−126. Ha “overflow”? Ha “underflow”? Que tipode valor IEEE754 e obtido?

Page 14: Exerc´ıcios de Arquitetura de Computadores

4 Representacao Binaria de Instrucoes MIPS R2000

Figura 3: Formato das instrucoes MIPS R2000.

Figura 4: Operandos das instrucoes.

Figura 5: Registos disponıveis.

Page 15: Exerc´ıcios de Arquitetura de Computadores

Figura 6: Subconjunto das instrucoes assembly MIPS R2000.

Figura 7: Subconjunto das instrucoes assembly MIPS R2000 - formato binario.

Page 16: Exerc´ıcios de Arquitetura de Computadores

1. Utilize as tabelas para traduzir para sequencias de instrucoes R2000 os seguintes frag-mentos de codigo:

• 8616 add $t0, $s1, $s2

8620 add $t1, $s3, $s4

8624 sub $s0, $t0, $t1

• 8616 lw $t0, 32($s3)

8620 add $t0, $s2, $t0

8624 sw $t0, 48($s3)

• 8616 bne $s3, $s4, else

8620 add $s0, $s1, $s2

8624 j exit

8628 else: sub $s0, $s1, $s2

8632 exit: ...

• 3664 loop: add $t1, $s3, $s3

3668 add $t1, $t1, $t1

3672 add $t1, $t1, $s6

3676 lw $t0, 0($t1)

3680 bne $t0, $s5, exit

3684 add $s3, $s3, $s4

3688 j loop

3692 exit:

• 3664 proc: addiu $sp, $sp, -12

3668 sw $t1, 8($sp)

3672 sw $t0, 4($sp)

3676 sw $s0, 0($sp)

3680 add $t0, $a0, $a1

3684 add $t1, $a2, $a3

3688 sub $s0, $t0, $t1

3692 add $v0, $s0, $zero

3696 lw $s0, 0($sp)

3700 lw $t0, 4($sp)

3704 lw $t1, 8($sp)

3708 addiu $sp, $sp, 12

3712 jr $ra

Page 17: Exerc´ıcios de Arquitetura de Computadores

2. Quais as instrucoes R2000 representadas pelas seguintes sequencias de 32 bits ?

• 00000010010100111000100000100000

• 10001110010100010000000001100100

• 00010010001100100000000000011001

• 00000011111000000000000000001000

• 00001100000000000000100111000100

Page 18: Exerc´ıcios de Arquitetura de Computadores

5 Programacao em Assembly MIPS R2000

Escreva programas em assembly MIPS R2000 correspondentes aos programas em C que seseguem, preservando a sua estrutura funcional.

1. Exemplo basico #1.

#include <stdio.h>

int main () {

int i, sum, upTo;

scanf("%d",&upTo);

sum = 0;

for(i = 0; i < upTo ; i++)

sum += i * i;

printf("sum = %d\n", sum);

return 0;

}

2. Exemplo basico #2.

#include <stdio.h>

int squares[64];

int main () {

int i, upTo;

scanf("%d",&upTo);

for(i = 0; i < upTo ; i++)

squares[i] = i * i;

return 0;

}

3. Exemplo basico #3.

#include <stdio.h>

int squares[64];

int main () {

int i, sum, upTo;

scanf("%d",&upTo);

for(i = 0; i < upTo ; i++)

Page 19: Exerc´ıcios de Arquitetura de Computadores

squares[i] = i * i;

sum = 0;

for(i = 0; i < upTo ; i++)

sum += squares[i];

printf("sum = %d\n", sum);

return 0;

}

4. Exemplo basico #4.

#include <stdio.h>

int squares[64];

void storeValues(int n) {

int i;

for(i = 0; i < n ; i++)

squares[i] = i * i;

}

int computeSum(int n) {

int i, sum;

sum = 0;

for(i = 0; i < n ; i++)

sum += squares[i];

return sum;

}

int main () {

int upTo;

scanf("%d",&upTo);

storeValues(upTo);

printf("sum = %d\n", computeSum(upTo));

return 0;

}

5. Calculo da frequencia de cada letra numa frase (histograma).

#include <stdio.h>

char text[] = "This is the string to be used to generate the histogram";

int histogram[26] = {0};

Page 20: Exerc´ıcios de Arquitetura de Computadores

void computeHistogram() {

int i = 0;

while ( text[i] != ’\0’ ) {

if(text[i] >= ’A’ && text[i] <= ’Z’)

histogram[text[i] - 65]++;

if(text[i] >= ’a’ && text[i] <= ’z’)

histogram[text[i] - 97]++;

i++;

}

}

void printHistogram() {

int i;

for(i = 0; i < 26 ; i++)

printf("%c -> %d\n", i + 97, histogram[i]);

}

int main () {

computeHistogram();

printHistogram();

return 0;

}

6. O seguinte programa calcula a frequencia de cada dıgito de 0 a 9 numa sequencia.Traduza-o para assembly do MIPS R2000.

#include <stdio.h>

char sequence[] = "31415926535897932384626433832795028841971";

int histogram[10];

void computeHistogram() {

int i = 0;

while ( sequence[i] != ’\0’ ) {

histogram[sequence[i] - ’0’]++;

i++;

}

}

void printHistogram() {

int i;

for(i = 0; i < 10 ; i++)

printf("%d -> %d\n", i, histogram[i]);

Page 21: Exerc´ıcios de Arquitetura de Computadores

}

int main () {

computeHistogram();

printHistogram();

return 0;

}

7. O seguinte programa calcula todos os primos menores do que n usando o Crivo deEratostenes. Traduza-o para assembly do MIPS R2000.

#include <stdio.h>

int primes[64] = {2};

int is_prime(int i, int k) {

int j = 0;

while (j <= k) {

if (i % primes[j] == 0)

break;

j++;

}

return (j > k);

}

int main () {

int i,j,k = 0,n;

int prime;

scanf("%d",&n);

for (i = 2; i < n; i++)

if(is_prime(i,k))

primes[++k] = i;

for (i = 0; i <= k; i++)

printf("%d\n", primes[i]);

return 0;

}

8. O seguinte programa calcula o maximo divisor comum entre dois numeros de formaiterativa. Traduza-o para assembly do MIPS R2000.

#include <stdio.h>

int gcd(int i, int j) {

Page 22: Exerc´ıcios de Arquitetura de Computadores

while (i != j) {

if (i > j)

i = i - j;

else

j = j - i;

}

return i;

}

int main () {

int i,j,k;

scanf("%d",&i);

scanf("%d",&j);

k = gcd(i,j);

printf("%d\n",k);

return 0;

}

9. O seguinte programa ordena um vector de inteiros pelo Metodo da Bolha. Implemente-o em assembly do MIPS R2000.

#include <stdio.h>

int array[] = {32, 6, 51, 63, 22, 29, 91, 39, 66, 47};

int size = 10;

void bsort(int v[], int n) {

int i, j;

for( j = 0 ; j < n ; j++ ) {

for( i = 0 ; i < n - 1 ; i++ ) {

if ( v[i+1] < v[i] ) {

int tmp;

tmp = v[i];

v[i] = v[i+1];

v[i+1] = tmp;

}

}

}

}

int main () {

int i;

Page 23: Exerc´ıcios de Arquitetura de Computadores

bsort(array,size);

for ( i = 0 ; i < size ; i++ )

printf("%d ", array[i]);

printf("\n");

return 0;

}

10. Implemente o seguinte programa que, dada uma sequencia de caracteres em memoria,roda a mesma number (no exemplo 5) posicoes para a direita, de forma circular:

#include <stdio.h>

char text[64] = "Please shift me to the right...";

int size() {

int i;

for(i=0; text[i] != ’\0’; i++);

return i;

}

void shiftOnce() {

int i, j, last;

j = size();

last = text[j-1];

for(i=j-2; i >= 0; i--)

text[i+1] = text[i];

text[0] = last;

}

void shiftMany(int number) {

int i;

for ( i=0 ; i < number ; i++ )

shiftOnce();

}

int main () {

shiftMany(5);

printf("%s\n", text);

return 0;

}

11. O que faz o seguinte programa?

Page 24: Exerc´ıcios de Arquitetura de Computadores

.data

msg: .asciiz "result is: "

str: .asciiz "abracadabra"

.text

main: la $a0,str

jal proc

add $s0,$v0,$zero

la $a0,msg

addiu $v0,$zero,4

syscall

add $a0,$s0,$zero

addiu $v0,$zero,1

syscall

addiu $v0,$zero,10

syscall

proc: addiu $v0,$zero,0

loop: lb $t0,0($a0)

beqz $t0,exit

addiu $v0, $v0, 1

addiu $a0, $a0, 1

j loop

exit: jr $ra

12. Que calculo realiza o seguinte programa?

.text

main: addiu $t0,$zero,0

addiu $t2,$zero,0

loop: mul $t1,$t0,$t0

add $t2,$t2,$t1

addiu $t0,$t0,1

ble $t0,100,loop

la $a0,str

addiu $v0,$zero,4

syscall

add $a0,$t2,$zero

addiu $v0,$zero,1

syscall

Page 25: Exerc´ıcios de Arquitetura de Computadores

addiu $v0,$zero,10

syscall

.data

str: .asciiz "The result is ..."

13. Implemente a seguinte versao recursiva ingenua dos numeros de Fibonnacci:

int fib (int n) {

return (n < 2) ? n : fib(n - 1) + fib(n - 2);

}

int main () {

fib(45);

return 0;

}

14. Modifique a versao recursiva ingenua dos numeros de Fibonnacci por forma a manteruma tabela com os valores pre-calculados, como abaixo:

int computedFibs[1024] = {0,1,1};

int fib (int n) {

if (computedFibs[n] == 0)

computedFibs[n] = fib(n - 1) + fib(n - 2);

return computedFibs[n];

}

int main () {

fib(45);

}

15. O seguinte programa calcula o maximo divisor comum entre dois numeros de formarecursiva. Traduza-o para assembly do MIPS R2000.

#include <stdio.h>

int gcd(int i, int j) {

if (j == 0)

return i;

else

return gcd(j, i % j);

Page 26: Exerc´ıcios de Arquitetura de Computadores

}

int main () {

int i,j,k;

scanf("%d",&i);

scanf("%d",&j);

k = gcd(i,j);

printf("%d\n",k);

return 0;

}

16. O seguinte programa procura um inteiro num array usando o metdo da PesquisaBinaria. Implemente-o em assembly do MIPS R2000.

#include <stdio.h>

int v[] = {2, 9, 13, 15, 26, 31, 37, 49, 51, 53, 54, 62, 66, 73, 75, 84, 91};

int size = 17;

int value = 9;

int bsearch ( int value, int low, int high ) {

if ( low > high ) {

return -1;

} else {

int middle = (low + high) / 2;

if ( value > v[middle] )

return bsearch(value, middle + 1, high);

else if ( value < v[middle] )

return bsearch(value, low, middle - 1);

else

return middle;

}

}

int main () {

int index;

index = bsearch(value, 0, size - 1);

if ( index == -1 )

printf("%d is not in vector", value);

else

printf("%d is in vector at index %d", value, index);

}

Page 27: Exerc´ıcios de Arquitetura de Computadores

Vırgula Flutuante no MIPS R2000

1. Escreva uma funcao que receba uma temperatura em Celsius (um float) e retorne atemperatura correspondente em Fahrenheit.

2. Traduza para assembly o seguinte programa em C que calcula o valor de um polinomioP (x) = anx

n + an−1xn−1 + · · · + a1x + a0, de coeficientes reais, num ponto x = x0, pelo

Metodo de Horner.

#include <stdio.h>

int n = 3;

float x = 2;

float coefs[] = { -1.0, 7.0, -4.0, 6.0 };

float horner(float coefs[], int n, float x) {

int i;

float v = 0.0;

for( i=0 ; i <= n; i++ )

v = v * x + coefs[i];

return v;

}

int main() {

printf("%f\n", horner(coefs, n, x));

return 0;

}

3. Implemente um programa que calcule a raız quadrada de um numero inteiro n,√n,

pela recorrencia seguinte, com uma dada precisao (e.g., se a precisao for 1e-5, a diferencaentre os valores calculados numa iteracao e na seguinte nao pode exceder 1e-5).

x0 = n, xi+1 =1

2(xi +

n

xi

), i ∈ {0, 1, 2, ...}

4. Implemente 3 funcoes que calculem os valores de exp(x), sin(x) e cos(x), utilizandoas respectivas expansoes em Serie de Taylor das funcoes. Os parametros de entrada dasfuncoes deverao ser o valor x0 em que a funcao vai ser avaliada e a precisao absoluta comque o valor deve ser calculado (e.g., se a precisao for 1e-5, a diferenca entre os valorescalculados por uma serie e outra com mais um termo nao pode exceder 1e-5).

Page 28: Exerc´ıcios de Arquitetura de Computadores

6 Componentes Basicas de Hardware

Considere os seguintes circuitos:

Figura 8: Latch 1-bit.

Figura 9: Flip-flop 1-bit.

Figura 10: Memoria estatica 1-bit.

Page 29: Exerc´ıcios de Arquitetura de Computadores

Figura 11: And/Or 1-bit.

Figura 12: Adicao 1-bit.

Page 30: Exerc´ıcios de Arquitetura de Computadores

Figura 13: Multiplexador 1-bit.

1. Construa tabelas que mostrem, para os todos os valores de input dos respectivoscircuitos, o output obtido. Verifique que os circuitos implementam de facto as funcoesreferidas na legenda correspondente, sobre 1 bit.

Page 31: Exerc´ıcios de Arquitetura de Computadores

7 Implementacao Multi-Ciclo do MIPS R2000

Considere as seguintes instrucoes do MIPS R2000:

• add $s1, $t1, $s2

• beq $t1, $s5, 64

• lw $t6, 44($t2)

• sw $s2,-12($t1)

• j 5164

1. A Figura 14 representa a implementacao de multi-ciclo da ”data-path” e do ”control-path” do MIPS R2000. Para cada uma das instrucoes apresentadas siga o trajecto dainformacao correspondente a sua execucao tendo em conta os sinais de controle emitidospelo hardware especificados na maquina de estados representada na Figura 15.

Page 32: Exerc´ıcios de Arquitetura de Computadores

Figura 14: Implementacao multi-ciclo do MIPS R2000.

Page 33: Exerc´ıcios de Arquitetura de Computadores

Figura 15: Maquina de estados para o “control-path” da implementacao multi-ciclo.

Page 34: Exerc´ıcios de Arquitetura de Computadores

8 Memorias Cache

1. Considere as memorias cache representadas nas figuras no fim desta seccao. Para cadauma indique e justifique:

• o tipo de cache;

• o numero de linhas;

• o numero maximo de linhas de memoria mapeadas numa linha da cache;

• a capacidade de cada linha (bytes de valores em memoria) e a capacidade total dacache em bytes.

2. Assuma uma memoria com 64 kbytes. Para cada cache determine:

• em quantos linhas de cache pode ser dividida a memoria;

• em quantas linhas na memoria podem ser mapeadas numa linha de cache.

3. Assuma que a memoria tem o tamanho maximo suportado por enderecos de 32 bits erepita o calculo anterior. Porque obteve resultados diferentes ?

4. Para cada cache determine a tag e o index associados aos seguintes enderecos:

• 0x0000222c

• 0x00001956

• 0x00004321

• 0x00000037

Page 35: Exerc´ıcios de Arquitetura de Computadores
Page 36: Exerc´ıcios de Arquitetura de Computadores
Page 37: Exerc´ıcios de Arquitetura de Computadores
Page 38: Exerc´ıcios de Arquitetura de Computadores

9 Impacto das Caches Na Performance

A performance de um CPU dada por cycles per instruction e dada por:

cycles per instruction =

cycles per instruction no misses + memory stall cycles per instruction

O custo, memory stall cycles per instruction, em numero de ciclos de CPU, de umaconfiguracao CPU-Cache L1-Memoria e dada pela formula:

memory stall cycles per instruction =

fraction load/store ×miss rate data L1 ×miss penalty L1 +

fraction IF ×miss rate instructions L1 ×miss penalty L1

(note que fraction IF = 1). Abstraindo-nos do facto da cache L1 estar dividida emL1-Data e L1-Instructions, podemos simplificar a formula para o fluxo das instrucoes:

memory stall cycles per instruction ≈miss rate L1 ×miss penalty L1

Adicionando um novo nıvel de cache, para uma configuracao CPU-Cache L1-Cache L2-Memoria obtemos:

memory stall cycles per instruction ≈miss rate L1 ×miss penalty L1 +

(global)miss rate L2 ×miss penalty L2

1. Assuma que um sistema tem cycles per instruction = 2 ciclos, numa configuracao(ideal, irrealista) em que as caches tem um hit-rate de 100%. Calcule o impacto de umacache L1, de dados e intrucoes, se fraction load/store = 0.36, miss rate data L1 = 4%,miss rate instructions L1 = 2%, miss penalty L1 = 100 ciclos (igual para instrucoes edados). Qual o cycles per instruction real de um tal sistema?

2. Assuma uma configuracao CPU-Cache L1-Cache L2-Memoria. Suponha que miss rate L1 =2%, miss penalty L1 = 20 ciclos, miss rate L2 = 0.5% e miss penalty L2 = 400 ciclos.Se o processador tiver um cycles per instruction ideal de 2, qual o impacto dos acessos amemoria na performance?

3. Repita o exercıcio anterior assumindo que apenas existe a cache L1, isto e uma confi-guracao CPU-Cache L1-Memoria. Que pode concluir?

4. O que acontece a estes numeros quando aumentamos a frequencia de relogio do pro-cessador? Para a mesma configuracao, a performance aumenta ou diminui?

Page 39: Exerc´ıcios de Arquitetura de Computadores

10 Memoria Virtual

1. Assuma a organizacao da memoria virtual indicada na imagem no fim desta seccao.Para os seguintes enderecos virtuais calcule, sempre que possıvel, os enderecos fısicos cor-respondentes:

• 0x0000222c

• 0x000019fc

• 0x0000cf2c

• 0x0001c0bb

Assuma o seguinte conteudo parcial da tabela de paginas:

• 1 : 1,001011001101111111

• 2 : 1,000100001111111110

• 4 : 0,000010010100111110

• 6 : 1,000000001100110111

• 12 : 0,001000100010110011

• 20 : 1,100011000010110010

• 28 : 1,100000101100110111

Page 40: Exerc´ıcios de Arquitetura de Computadores