Diseño de la caché

Lo primero que hay que decidir en un diseño de caché es la línea de caché donde se debería almacenar un bloque cargado desde memoria. Pensemos en un sistema que use direccionamiento de 32 bits. Si el tamaño de un bloque es de 64(2 elevado a 6)bytes, los 6 bits de la parte inferior de la dirección -el offset- determina a que byte de dentro del bloque se esta direccionando. Si la caché consta de 1024 de estas líneas de 64 bytes los siguientes 10 bits de la dirección determina en que línea esta colocado el bloque . Los 16 bits de la parte superior de la dirección -el tag- se guarda con al línea de la caché . Una caché mapeada directamente almacena un tag por línea en su array de tags.

Por ejemplo una lectura la caché utiliza los bits centrales de la dirección como índice para su array de tags. El tag indicado se conforta luego con los 16 bits de la parte superior de la actual dirección. Si encajan, los datos que indican el ofsset se envían a la CPU.

La ventaja que implica utilizar una cache directamente  mapeada es que solamente se tiene que hacer una confrontación por acceso a la caché.

El problema de una caché directamente mapeada es que si dos bloques a los que se accede frecuentemente mapean en la misma línea de caché, estarán todo el tiempo expulsándose mutuamente de la caché.

El otro extremo en el diseño de caches es la caché completamente asociativa, en la que se puede colocar un bloque en cualquier línea de caché. En este caso, la dirección simplemente se divide en bits inferiores, lo que constituye  el offset en la línea de caché y los bits superiores que forman el tag que se confronta con referencias superiores.

En el caso de una caché asociativa, tiene que haber algún mecanismo para decidir en que línea se coloca el bloque. En teoría se sustituye el bloque de memoria menos utilizado últimamente LRU.

Una caché completamente asociativa resuelve los problemas de direcciones en conflicto pero a costa de mucho hardware extra para comparar el tag con todas las líneas de caché. Entre las caches directamente mapeadas y las completamente asociativas  es la caché asociativa por conjuntos. Las líneas se dividen en conjuntos y los bits centrales de la dirección determinan el conjunto en el que se colocan un bloque. Dentro de cada conjunto, la caché es completamente asociativa. Además de necesitar menos comparadores que una caché completamente asociativa, la de tipo asociativa por conjuntos también facilita la implementación de la política LRU. Por ejemplo, solo se precisa un bit para implementar una política LRU.

Anterior

(c) 2000 Carlos Urzua Ruiz