exerc´ıcios de arquitetura de computadores
TRANSCRIPT
Exercıciosde
Arquitetura de Computadores
Ano Letivo de 2016/2017
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.
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);
}
}
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
}
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).
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
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)
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
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
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).
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)
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
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?
4 Representacao Binaria de Instrucoes MIPS R2000
Figura 3: Formato das instrucoes MIPS R2000.
Figura 4: Operandos das instrucoes.
Figura 5: Registos disponıveis.
Figura 6: Subconjunto das instrucoes assembly MIPS R2000.
Figura 7: Subconjunto das instrucoes assembly MIPS R2000 - formato binario.
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
2. Quais as instrucoes R2000 representadas pelas seguintes sequencias de 32 bits ?
• 00000010010100111000100000100000
• 10001110010100010000000001100100
• 00010010001100100000000000011001
• 00000011111000000000000000001000
• 00001100000000000000100111000100
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++)
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};
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]);
}
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) {
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;
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?
.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
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);
}
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);
}
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).
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.
Figura 11: And/Or 1-bit.
Figura 12: Adicao 1-bit.
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.
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.
Figura 14: Implementacao multi-ciclo do MIPS R2000.
Figura 15: Maquina de estados para o “control-path” da implementacao multi-ciclo.
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
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?
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