Las memorias caché son elementos básicos en cualquier CPU y GPU actual. Su funcionamiento básico es muy sencillo. Se trata de una tabla. Consta de una serie de marcos en los que se almacenan copias de bloques de la memoria principal. Cada uno de estos marcos va asociado a una etiqueta que permite saber que bloque de memoria se ha copiado en dicho marco. Los datos en una memoria caché pueden organizarse según varios parámetros que afectan a su rendimiento de una manera u otra.
El primer factor importante es el tamaño. En general una caché grande tiene menos fallos (es más probable que los datos pedidos estén en la caché), pero a cambio es lenta, además de que una caché muy grande supone ocupar una superficie del chip considerable.
Otra decisión a tomar es el tamaño de los marcos de la caché. En una caché con marcos pequeños es más fácil que el procesador según vaya pidiendo datos (por ejemplo procesando un array) llegue a pedir alguno que no está en la caché, por lo que hay más probabilidad de tener fallos. Sin embargo, en caso de tener un fallo, copiar un bloque a un marco de la caché es una operación menos costosa que si el marco fuera más grande.
Como hemos visto, las cachés pueden alojar algunos bloques de memoria para poder acceder a ellos rápidamente. Existen estrategias a la hora de emplazar un bloque memoria en un marco de la caché:
El primer factor importante es el tamaño. En general una caché grande tiene menos fallos (es más probable que los datos pedidos estén en la caché), pero a cambio es lenta, además de que una caché muy grande supone ocupar una superficie del chip considerable.
Otra decisión a tomar es el tamaño de los marcos de la caché. En una caché con marcos pequeños es más fácil que el procesador según vaya pidiendo datos (por ejemplo procesando un array) llegue a pedir alguno que no está en la caché, por lo que hay más probabilidad de tener fallos. Sin embargo, en caso de tener un fallo, copiar un bloque a un marco de la caché es una operación menos costosa que si el marco fuera más grande.
Como hemos visto, las cachés pueden alojar algunos bloques de memoria para poder acceder a ellos rápidamente. Existen estrategias a la hora de emplazar un bloque memoria en un marco de la caché:
- emplazamiento directo: A un bloque le corresponde un único marco. Esta estrategia es sencilla, hace que la caché sea rápida, pero provoca más fallos de caché.
- emplazamiento asociativo: Un bloque puede almacenarse en cualquier marco. En este caso se minimizan los fallos, pero la caché es más lenta.
- emplazamiento asociativo por conjuntos: A un bloque le corresponde un pequeño conjunto de marcos. Es una solución intermedia entre las dos anteriores.
Lo ideal sería poder tener una caché lo más grande posible y lo más rápida posible al mismo tiempo. Tecnológicamente no es posible por lo que se tiende a utilizar varios niveles de caché. Pueden usarse varios niveles de caché que son cada vez más grandes y más lentas. De esta manera el procesador accede a la caché de nivel 1, que es la más rápida, pero la más pequeña. En caso de haber un fallo la información no se busca directamente en la memoria principal, sino que se busca en la caché de nivel 2, que es más lenta, pero aún así sensiblemente más rápida que la RAM. En la actualidad es muy común utilizar 3 niveles de caché. El objetivo es que desde el punto del vista del procesador se vea una memoria del tamaño de la memoria principal (GB) con la velocidad de acceso de la caché de nivel 1 (ns).
En general un procesador puede incluir diferentes cachés diseñadas especialmente para una función específica, lo que hace que tengan sus peculiaridades. Por ejemplo es habitual que existan cachés separadas para de datos y de instrucciones, al menos en el primer nivel, para evitar los riesgos estructurales.
Patxi Astiz
No hay comentarios:
Publicar un comentario