Como siempre, la respuesta depende de la CPU. 🙂
Pero, a los fines de una explicación simple a alto nivel, suponiendo una CPU simple: las instrucciones sobre la CPU solicitan elementos individuales. Si escribe c = a + b
, el procesador necesita cargar los valores de a
y b
, agregarlos y luego escribir el resultado en c
.
Entonces, en este modelo simple, la CPU se comunica en términos de elementos individuales al caché. “Dame a
. Dame b
. Actualice el valor de c
“.
El caché, por otro lado, necesita obtener valores de la RAM más grande y lenta del sistema. También necesita volver a escribir valores actualizados en esa RAM cuando tenga que dejar espacio en el caché para otros datos. La memoria principal es lenta de dos maneras: tiene un ancho de banda menor y tiene una latencia mucho mayor.
Para aprovechar al máximo este enlace, el caché transfiere grandes bloques de datos hacia y desde la memoria principal cada vez que necesita interactuar con él. Esto amortiza el costo de comunicarse con la memoria principal. Por ejemplo, el costo de leer 1 byte de la memoria externa puede ser de 100 ciclos, pero el costo de leer 128 bytes de la memoria externa puede ser solo de 128 ciclos. El costo de leer cada byte disminuye de 100 ciclos / byte a 1 ciclo / byte. ¡No está mal!*
¿Pero cómo ayuda eso?
Consideremos esa expresión c = a + b
. Es muy probable que las tres variables se almacenen una al lado de la otra en la memoria. Entonces, cuando la CPU pide a
, si el caché no lo tiene, saldrá y tomará a
y todo lo que esté a su alrededor, hasta el tamaño de un solo bloque de caché. Con suerte, eso también trajo tanto c
. Ahora, cuando el procesador pide leer b
justo después de pedir a, tiene una buena posibilidad de que b
ya esté en la memoria caché, incluso si a
no estaba. Asimismo para c
.
Esto se llama el principio de localidad espacial. Los datos que tienden a usarse casi a tiempo también tienden a estar en direcciones cercanas. (También hay un principio de localidad temporal , que dice más o menos: “Es probable que los datos que he usado recientemente se vuelvan a usar pronto”. Los cachés se basan en ambos principios para proporcionar su beneficio).
Ahora, el mecanismo exacto por el cual el caché “redondea” un acceso único a un bloque de caché completo también depende del detalle de la implementación específica del caché. Pero, para un primer orden, es suficiente entender que eso sucede, sin profundizar mucho en los detalles.
Hace mucho tiempo, escribí conjuntamente algunos documentos que describían el sistema de memoria caché en un procesador DSP que ayudé a construir. Estos documentos entran en mayor detalle en el sistema de memoria de ese dispositivo. Los conceptos allí se aplican en diversos grados a otros cachés.
- SPRU610C – TMS320C64x DSP Guía de referencia de memoria interna de dos niveles (Autor principal)
- SPRU656a – TMS320C6000 DSP Cache Guía del usuario (Autor secundario. Oliver Sohm escribió la mayor parte de este excelente material, según recuerdo, y merece el crédito por ello).
* Y en caso de que te lo estés preguntando, esos números no están muy lejos de la vida real. Están bastante cerca de los números reales en un TMS320C6678 a 1.2GHz conectado a DDR3–1600 de 64 bits, si no recuerdo mal. Han pasado unos años.