4 <§5.3> Para um projeto de cache mapeada diretamente com endereço de 32 bits, os bits de endereço a seguir são usados para acessar a cache.
Tag
Índice
Offset
a) Qualéotamanhodoblocodecache(empalavras)?
b) Quantaspalavraselaécapazdearmazenar?
c) Qual é a razão entre o total de bits exigido para essa implementação de cache e os bits de armazenamento de dados?
Considere que, desde que a alimentação foi ligada, as seguintes referências de cache endereçadas por byte são registradas:
Endereço
0
4
16
132
232
160
1024
30
140
3100
d) Quantos blocos foram substituídos ao final do acesso ao endereço 3100?
e) Qualéataxadehits?
f) Indique o estado final da cache, com cada entrada válida representada como um registro de <índice, tag, dados>.
| Tag | Índice | Offset |
|
|
|
|
b) Quantaspalavraselaécapazdearmazenar?
c) Qual é a razão entre o total de bits exigido para essa implementação de cache e os bits de armazenamento de dados?
Considere que, desde que a alimentação foi ligada, as seguintes referências de cache endereçadas por byte são registradas:
| Endereço | |||||||||
| 0 | 4 | 16 | 132 | 232 | 160 | 1024 | 30 | 140 | 3100 |
e) Qualéataxadehits?
f) Indique o estado final da cache, com cada entrada válida representada como um registro de <índice, tag, dados>.
Passo 1
O enunciado dá um sistema de cache mapeada diretamente com endereço de 32 bits e especifica como os bits do endereço são usados:
As perguntas são:
a) Qual é o tamanho do bloco de cache (em palavras)?
b) Quantas palavras a cache é capaz de armazenar (no total)?
c) Qual é a razão entre o total de bits exigidos pela implementação da cache e os bits de armazenamento de dados? (ou seja, total bits incluindo overhead / bits “apenas dados”)
d) Dadas as referências (em bytes) , quantos blocos foram substituídos ao final do acesso ao endereço
?
e) Qual é a taxa de hits?
f) Indique o estado final da cache, com cada entrada válida como um registro .
a) Qual é o tamanho do bloco de cache (em palavras)?
b) Quantas palavras a cache é capaz de armazenar (no total)?
c) Qual é a razão entre o total de bits exigidos pela implementação da cache e os bits de armazenamento de dados? (ou seja, total bits incluindo overhead / bits “apenas dados”)
d) Dadas as referências (em bytes)
e) Qual é a taxa de hits?
f) Indique o estado final da cache, com cada entrada válida como um registro
Informações relevantes extraídas do enunciado:
- Endereço total:
bits. - Offset:
bits (bits – ). - Índice:
bits (bits – ). - Tag:
bits (bits – ). - Sequência de acessos em bytes:
.
Observação prática (assumida para poder responder a (a) e (b)): quando o enunciado pede tamanho em “palavras”, vou assumir que uma palavra tem
bytes (convenção comum em problemas de arquitetura). Vou declarar isso claramente onde for usado.
Passo 2
Entender o significado dos campos e calcular o tamanho do bloco (em bytes e em palavras).
- O campo Offset tem
bits. Isso significa que cada bloco contém
Explicação didática: o offset seleciona a posição dentro do bloco; com 5 bits podemos endereçar
bytes diferentes dentro do bloco, logo o bloco tem
bytes.
Agora converter bytes → palavras. Assumimos palavra =
bytes. Então o número de palavras por bloco é
Passo 3
Calcular quantas palavras a cache armazena no total.
- O índice tem
bits, logo o número de linhas (entradas) da cache é
- Cada linha armazena um bloco com
palavras (do Passo 2). Então o total de palavras armazenadas é
Também útil: capacidade de dados em bytes =
.
Passo 4
Calcular a razão entre o total de bits exigidos pela implementação e os bits de dados (apenas armazenamento de dados).
Precisamos contar, por linha:
- bits de dados por linha:
bytes bits; - bits de tag por linha: número de bits de tag =
bits (ou simplesmente dado pelo enunciado: bits – ); - bits de controle por linha: pelo menos 1 bit de válido (assumimos apenas o bit válido; não foi pedido dirty bit etc.).
Logo bits por linha total:
Total para a cache inteira (32 linhas):
Total apenas dados:
A razão pedida (total bits / bits de dados) é
Interpretação: para cada bit de dados há um overhead extra que resulta nessa razão (≈
de overhead).
Passo 5
Explicar e fixar as fórmulas para simular os acessos (importante para as partes d–f).
Com offset
bits e índice
bits:
- número do bloco em memória (em bytes) é
- índice na cache é
(Equivalentemente, são os bits
–
do endereço.)
- tag é
(ou seja, bits
–
).
Regra de decisão de hit/miss em mapeamento direto: se a linha
está inválida → miss (carrega o bloco); se válida, comparar tag: se igual → hit; se diferente → miss e substituição (evicção) do bloco antigo por novo (contabilizamos esse evento como “substituído”).
A cache começa vazia (todas entradas inválidas).
Passo 6
Simulação passo a passo dos acessos. Vou para cada endereço calcular
,
,
, decidir hit/miss e, se houver substituição, aumentar o contador de substituições.
- Endereço
:
Cache[0] está inválida → miss, carregar bloco
em índice
. Substituições =
.
- Endereço
:
Cache[0] contém tag
então → hit. Substituições =
.
- Endereço
:
Ainda cache[0], tag
→ hit. Substituições =
.
- Endereço
:
Cache[4] inválida → miss, carrega bloco número
(tag
) em índice
. Substituições =
.
- Endereço
:
Cache[7] inválida → miss, carrega bloco
em índice
. Substituições =
.
- Endereço
:
Cache[5] inválida → miss, carrega bloco
em índice
. Substituições =
.
- Endereço
:
Cache[0] atualmente tem tag
(válida) → tag diferente → miss e substituição do bloco antigo por novo (tag
). Substituições
.
- Endereço
:
Cache[0] tem tag
→ tag diferente → miss e substituição (traz novamente o bloco com tag
). Substituições
.
- Endereço
:
Cache[4] tem tag
→ hit. Substituições =
.
- Endereço
:
Cache[0] tem tag
(do passo 8) → tag diferente → miss e substituição por tag
. Substituições
.
Resumo da sequência de hits/misses:
- Hits ocorreram nos acessos aos endereços
→ hits. - Total acessos =
. - Substituições (evicções) ocorridas =
(nos acessos a ).
Passo 7
Calcular a taxa de hits.
Número de hits =
. Número de acessos =
. Logo a taxa de hits é
Passo 8
Determinar o estado final da cache (após o acesso a
).
Só as linhas que foram carregadas/validadas aparecem válidas. A partir da simulação, as linhas com conteúdo válido final são (índices onde carregamos blocos):
. Precisamos indicar para cada uma
.
Para obter o intervalo dos bytes/words armazenados em cada bloco, usar:
e o bloco armazena bytes
que correspondem, em palavras de 4 bytes, às palavras
(8 palavras por bloco).
Calcular para cada linha válida final:
-
Índice
: tag final = (carregado pelo acesso a ).
block_num. Bytes armazenados: até . Em palavras (4 bytes): palavras até (pois e -> inteiros – ).
Então dados = palavras. -
Índice
: tag = (carregado por e usado por ).
block_num. Bytes – . Palavras – .
Dados = palavras. -
Índice
: tag = (carregado por ).
block_num. Bytes – . Palavras – .
Dados = palavras. -
Índice
: tag = (carregado por ).
block_num. Bytes – . Palavras – .
Dados = palavras.
Todas as outras linhas permanecem inválidas (não foram carregadas).
Resposta
a)
palavras por bloco
b)
palavras no total
c)
d)
e)
f) Estado final (cada entrada válida como
):