¿Esta imagen le ayuda a comprender cómo funcionan estructuralmente los cachés asociativos?
tomadode aquí
En pocas palabras, los bits de desplazamiento del bloque determinan el tamaño de su bloque (cuántos bytes hay en una fila de caché, cuántas columnas, si lo desea). Los bits de índice determinan cuántas filas hay en cada conjunto. La capacidad de la memoria caché es, por lo tanto, 2 ^ (blockoffsetbits + indexbits) * #sets. En este caso, es 2 ^ (4 + 4) * 4 = 256 * 4 = 1 kilobyte.
Para el mismo tamaño de caché (capacidad), si fuera de asociativo de 4 vías a asociativa bidireccional, asociativo de dos vías, podría hacerlo duplicando las filas en cada conjunto o duplicando las columnas en cada conjunto, es decir, duplicar el número de líneas de caché o duplicar el tamaño del bloque.
Si tuviera que elegir duplicar el número de filas, terminaría con su dirección de 12 bits dividida en un índice de 5 bits y un desplazamiento de bloque de 4 bits, dejando una etiqueta de 3 bits.
Si tuviera que elegir duplicar el tamaño del bloque, terminaría con su dirección de 12 bits dividida en un índice de 4 bits, un desplazamiento de bloque de 5 bits, dejando una etiqueta de 3 bits.
Por lo tanto, para repetir, creo que las fórmulas que rigen para las cachés asociativas son:
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)
En su ejemplo original, no creo que pueda deducir el tamaño de la memoria caché en función del tamaño de sus respectivos campos de bits de dirección sin hacer una suposición sobre la asociatividad. Si es asociativo bidireccional, entonces podrías decir:
Capacidad de caché = (2 ^ 6) * (2 ^ 10) * (2) = 2 ^ 18 = 2 ^ 8 kilobytes = 256 kilobytes. No estoy seguro de cómo se te ocurrieron 128 kilobytes. Ese sería el caso si fuera asociativo de una vía (mapeado directo).
Para una capacidad de caché de 128 kB (2 ^ 17 bytes), puede crear un caché asociativo de 4 vías con un tamaño de bloque de 64 bytes diciendo:
2^17 = 2^6 * (Blocks per Set) * 4
Blocks per Set = 2^17 / 2^6 / 2^2 = 2^9 = 512
... y, por lo tanto, asignando 9 bits de índice, 4 bits de desplazamiento de bloque y el resto (19) de bits de etiqueta.