Estou aprendendo a lógica das memórias cache. Gostaria de saber se você pode verificar se entendi corretamente. Se uma memória cache no campo tag tem 16 bits, o campo definido tem 10 bits e o byte no campo de bloco é 6 bits, então posso deduzir apenas dessa informação que a capacidade é de 128 kbyte e é um conjunto de 2 vias associativo com o tamanho do bloco de 64 bytes porque 2⁶ = 64 bytes do byte no campo do bloco. 2¹⁰ = 1024 mas poderia alguma outra capacidade com algum outro número de associatividade satisfazer os requisitos?
Eu aprendi que as fórmulas são
número de blocos = capacidade / tamanho do bloco
número de conjuntos = número de blocos / #associatividade
Portanto Eu poderia dobrar a associatividade para 4 vias, mas não consegui satisfazer os requisitos com um cache de 4 vias porque uld requer outro número de bits no campo definido.
Eu entendi corretamente?
Resposta
Esta imagem ajuda você a entender como funcionam os caches associativos estruturalmente?
emprestada de aqui
Em poucas palavras, os bits de deslocamento do bloco determinam o tamanho do seu bloco (quantos bytes estão em uma linha de cache e quantas colunas, se preferir). Os bits de índice determinam quantas linhas existem em cada conjunto. A capacidade do cache é, portanto, 2 ^ (blockoffsetbits + indexbits) * #sets. Neste caso, é 2 ^ (4 + 4) * 4 = 256 * 4 = 1 kilobyte.
Para o cache de mesmo tamanho (capacidade), se você fosse de 4 para 2 vias conjunto associativo, é associativo bidirecional, você pode fazer isso dobrando as linhas em cada conjunto ou dobrando as colunas em cada conjunto, o que significa dobrar o número de linhas de cache ou dobrar o tamanho do bloco.
Se você escolhesse dobrar o número de linhas, acabaria com seu endereço de 12 bits sendo dividido em um índice de 5 bits e um deslocamento de bloco de 4 bits, deixando uma tag de 3 bits.
Se você escolhesse dobrar o tamanho do bloco, acabaria com o seu endereço de 12 bits sendo dividido em um índice de 4 bits, um deslocamento de bloco de 5 bits, deixando uma tag de 3 bits.
Então, para reiterar, acho que as fórmulas que regem os caches associativos são:
Cache Capacity = (Block Size in Bytes) * (Blocks per Set) * (Number of Sets) Index Bits = LOG2(Blocks per Set) Block Offset Bits = LOG2(Block Size in Bytes) Tag Bits = (Address Bits) - (Index Bits) - (Block Offset Bits)
Em seu exemplo originalmente declarado, eu não ” acho que você pode deduzir o tamanho do cache com base no tamanho de seus respectivos campos de bits de endereço sem fazer uma suposição sobre ut a associatividade. Se for associativo bidirecional, você poderia dizer:
Capacidade do cache = (2 ^ 6) * (2 ^ 10) * (2) = 2 ^ 18 = 2 ^ 8 kilobytes = 256 kilobytes. Não tenho certeza de como você chegou a 128 kilobytes. Esse seria o caso se fosse associativo de uma via (mapeamento direto).
Para uma capacidade de cache de 128 kB (2 ^ 17 bytes), você poderia fazer um cache associativo de 4 vias com um tamanho de bloco de 64 bytes dizendo:
2^17 = 2^6 * (Blocks per Set) * 4 Blocks per Set = 2^17 / 2^6 / 2^2 = 2^9 = 512
… e, portanto, alocando 9 bits de índice, 4 bits de deslocamento de bloco e os demais (19) bits de tag.