La caché de CPU, es una caché usada por la unidad central de procesamiento de una computadora para reducir el tiempo de acceso a la memoria. La caché es una memoria más pequeña y rápida, la cual almacena copias de datos ubicados en la memoria principal que se utilizan con más frecuencia.
Es un conjunto de datos duplicados de otros originales, con la propiedad de que los datos originales son costosos de acceder, normalmente en tiempo, respecto a la copia en la caché. Cuando se accede por primera vez a un dato, se hace una copia en el caché; los accesos siguientes se realizan a dicha copia, haciendo que el tiempo de acceso medio al dato sea menor.
Cuando el procesador necesita leer o escribir en una ubicación en memoria principal, primero verifica si una copia de los datos está en la caché. Si es así, el procesador de inmediato lee o escribe en la memoria caché, que es mucho más rápido que de la lectura o la escritura a la memoria principal.
La memoria cache es la respuesta al problema de rendimiento de la memoria RAM. Esta es muy pequeña y esta incluida en el interior del microprocesador. Esta se organiza en niveles. Cuanto más cercana este al procesador es más rápida pero también más cara.
Esta memoria se organiza en niveles. Cuanto más cercano al procesador más rápida, más cara y por tanto más pequeña. Debido a esto usamos los nombres cache de nivel 1, nivel 2 y nivel 3. También se puede ver como L1, L2 y L3.
Si el procesador necesita un dato de la memoria comprueba si esta se encuentra en el nivel 1. En caso de no encontrarla se busca en el nivel 2 y si no en el nivel 3. El sistema se complementa con un algoritmo que es capaz de colocar los datos que más utilizas en los niveles más cercanos al procesador.
En comparación con la memoria RAM la cache de nivel 3 que es la mayor de todas es unas mil veces más pequeña. Por suerte los programas suelen realizar muchas operaciones sobre los mismos datos y tienen un efecto radical en el rendimiento.
Diseño
En el diseño de la memoria caché se deben considerar varios factores que influyen directamente en el rendimiento de la memoria y por lo tanto en su objetivo de aumentar la velocidad de respuesta de la jerarquía de memoria. Estos factores son las políticas de ubicación, extracción, reemplazo, escritura y el tamaño de la caché y de sus bloques.
Política de ubicación
Decide dónde debe colocarse un bloque de memoria principal que entra en la memoria caché. Las más utilizadas son:
- Directa: Al bloque i-ésimo de memoria principal le corresponde la posición i módulo n, donde n es el número de bloques de la memoria caché.
- Asociativa: Cualquier bloque de memoria principal puede ir en cualquiera de los n bloques de la memoria caché.
- Asociativa por conjuntos: La memoria caché se divide en k conjuntos de bloques, así al bloque i-ésimo de memoria principal le corresponde el conjunto i módulo k. Dicho bloque de memoria podrá ubicarse en cualquier posición de ese conjunto.
Política de extracción
La política de extracción determina cuándo y qué bloque de memoria principal hay que traer a memoria caché. Existen dos políticas muy extendidas:
- Por demanda: Un bloque sólo se trae a memoria caché cuando ha sido referenciado y se produzca un fallo.
- Con prebúsqueda: Cuando se referencia el bloque i-ésimo de memoria principal, se trae además el bloque (i+1)-ésimo. Esta política se basa en la propiedad de localidad espacial de los programas.
Política de reemplazo
Determina qué bloque de memoria caché debe abandonarla cuando no existe espacio disponible para un bloque entrante. Básicamente hay cuatro políticas que son:
- Aleatoria: El bloque es reemplazado de forma aleatoria.
- FIFO: Se usa un algoritmo First In First Out FIFO (primero en entrar es el primero en salir) para determinar qué bloque debe abandonar la caché. Este algoritmo generalmente es poco eficiente.
- Menos recientemente usado (LRU): Se sustituye el bloque que hace más tiempo que no se ha usado en la caché, traeremos a caché el bloque en cuestión y lo modificaremos ahí.
- Menos frecuencias usadas (LFU): Se sustituye el bloque que ha experimentado menos referencias.
Hay tres tipos diferentes de memoria caché para procesadores:
Caché de 1er nivel (L1):
Esta caché está integrada en el núcleo del procesador, trabajando a la misma velocidad que este. La cantidad de memoria caché L1 varía de un procesador a otro, estando normalmente entra los 64KB y los 256KB. Esta memoria suele a su vez estar dividida en dos partes dedicadas, una para instrucciones y otra para datos.
Caché de 2º nivel (L2):
Integrada también en el procesador, aunque no directamente en el núcleo de este, tiene las mismas ventajas que la caché L1, aunque es algo más lenta que esta. La caché L2 suele ser mayor que la caché L1, pudiendo llegar a superar los 2MB.
A diferencia de la caché L1, esta no está dividida, y su utilización está más encaminada a programas que al sistema.
Caché de 3er nivel (L3):
Es un tipo de memoria caché más lenta que la L2, muy poco utilizada en la actualidad.
En un principio esta caché estaba incorporada a la placa base, no al procesador, y su velocidad de acceso era bastante más lenta que una caché de nivel 2 o 1, ya que si bien sigue siendo una memoria de una gran rapidez (muy superior a la RAM, y mucho más en la época en la que se utilizaba), depende de la comunicación entre el procesador y la placa base.
¿El tamaño de la cache mejora el rendimiento?
The first processor that came with L2 cache (though it was not integrated) was the Pentium Pro in 1995. It had either 256 kB or 512 kB second-level cache on the die and thus had a significant performance advantage over the regular Pentium processors whose cache memory was located on the motherboard. With the introduction of the Pentium II on the Slot 1 module, dedicated cache memory was planted onto the processor. However, it wasn't before the second-generation Pentium III for socket 370 when cache memory could be found on the actual processor die. This hasn't changed to date for performance reasons, but there still are some processors with little cache and those with a lot. So is it worth spending money for more cache? In the past, extra cache really did not make much difference in performance.
Although there have always been measurable differences between processors with little cache and those with a lot of cache memory, it was smarter to choose devices with smaller cache to save money. But no processor model prior to Core 2 Duo was available in three different cache flavors.
The Pentium 4 carried 256 kB L2 cache in its first generation (Willamette, 180 nm) and 512 kB in the most successful, second-generation (Northwood, 130 nm). At this time, low-cost Celerons with less cache memory were produced using the same processing cores. The Celerons represented the first generation of high-end and low-cost products with the same technical origin, differing only in useable cache size and FSB/core clock speed. Feature differences were added later to further distinguish market segments.
With the introduction of the 90-nm Prescott core, 1 MB caches were introduced, and they represented the backbone of Intel's desktop processor portfolio until the 2 MB cache, 65-nm Cedar Mill core took over. Intel even used two of these to create the second-generation Pentium D 900 series. However, the faster clock speeds and cache sizes did not mean a whole lot, even then. Now, things have changed; the Core 2 Duo's (Conroe, 65 nm) better performance and lower power consumption have a lot to do with cache size.
AMD has been prudent about when and how to boost cache size. Presumably, this is because silicon real estate is extremely important when 65-nm output cannot satisfy the market demand and there still is a noticeable dependence on the economically less beneficial 90-nm process. Intel, on the other hand, has the advantage of producing all mainstream processors in 65-nm, and it seeks further increases in L2 cache capacity. The next Core 2 generation based on the 45-nm Penryn core will even carry up to 6 MB of L2 cache. Is this just marketing bluff or does the swelling of L2 cache capacities indeed lead to better performance? Let's find out.
El siguiente ejemplo muestra algunas formas de vaciado de los buffers del compilador y de la caché del Sistema
#include <stdio.h>
#include <ofstream.h>
void funcES1() {
FILE* Fichero1; // L.5
fflush(Fichero1); // L.6
_commit(_filenum(Fichero1)); // L.7
}
void funcES2() {
ofstream Fichero2; // L.11
Fichero2.flush(); // L.12
_commit(Fichero2.rdbuf()->fd()); // L:13
}
void main() { // ========
funcES1();
funcES2();
}
Referencias
http://es.wikipedia.org/wiki/Cach%C3%A9_(inform%C3%A1tica)
http://computadoras.about.com/od/Preguntas-Frecuentes-elegir-pc/a/Memoria-Cache-Que-Es-Y-Para-Que-Sirve.htm