COMPUTING

Cómo funcionan las memorias caché de CPU L1 y L2 y por qué son una parte esencial de los chips modernos

El desarrollo de cachés y almacenamiento en caché es uno de los eventos más importantes en la historia de la informática. Prácticamente todos los núcleos de CPU modernos, desde chips de potencia ultrabaja como ARM Cortex-A5 hasta los Intel Core i9 de gama alta, usan cachés. Incluso los microcontroladores de gama alta a menudo tienen cachés pequeños o los ofrecen como opciones; los beneficios de rendimiento son demasiado grandes para ignorarlos, incluso en diseños de energía ultrabaja.

El almacenamiento en caché se inventó para resolver un problema importante. En las primeras décadas de la informática, la memoria principal era extremadamente lenta e increíblemente cara, pero las CPU tampoco eran particularmente rápidas. A partir de la década de 1980, la brecha comenzó a ensancharse rápidamente. Las velocidades de reloj del microprocesador despegaron, pero los tiempos de acceso a la memoria mejoraron mucho menos drásticamente. A medida que crecía esta brecha, se hizo cada vez más claro que se necesitaba un nuevo tipo de memoria rápida para salvar la brecha.

CPU vs relojes DRAM

Si bien solo se ejecuta hasta 2000, las crecientes discrepancias de la década de 1980 llevaron al desarrollo de los primeros cachés de CPU.

Cómo funciona el almacenamiento en caché

Los cachés de CPU son pequeños grupos de memoria que almacenan información UPC es más probable que necesite el siguiente. La información que se carga en la caché depende de algoritmos sofisticados y ciertas suposiciones sobre el código de programación. El objetivo del sistema de caché es asegurarse de que la CPU tenga el siguiente bit de datos que necesitará ya cargado en el caché cuando lo busque (también llamado acierto de caché).

Una falta de caché, por otro lado, significa que la CPU tiene que salir corriendo para encontrar los datos en otra parte. Aquí es donde entra en juego la caché L2: aunque es más lenta, también es mucho más grande. Algunos procesadores utilizan un diseño de caché inclusivo (lo que significa que los datos almacenados en el caché L1 también se duplican en el caché L2) mientras que otros son exclusivos (lo que significa que los dos cachés nunca comparten datos). Si no se pueden encontrar datos en la caché L2, la CPU continúa en la cadena hasta L3 (generalmente todavía en el chip), luego L4 (si existe) y la memoria principal (DRAM).

L1-L2Balance

Este gráfico muestra la relación entre una caché L1 con una tasa de aciertos constante, pero una caché L2 más grande. Tenga en cuenta que la tasa de aciertos total aumenta considerablemente a medida que aumenta el tamaño de la L2. Una L2 más grande, más lenta y más barata puede proporcionar todos los beneficios de una L1 grande, pero sin la penalización por el tamaño del dado y el consumo de energía. La mayoría de las tasas de caché L1 modernas tienen tasas de aciertos muy por encima del 50 por ciento teórico que se muestra aquí: Intel y AMD suelen tener tasas de aciertos de caché de campo del 95% o más.

El siguiente tema importante es la asociatividad de conjuntos. Cada CPU contiene un tipo específico de RAM llamado RAM de etiqueta. La etiqueta RAM es un registro de todas las ubicaciones de memoria que se pueden asignar a cualquier bloque de caché. Si una caché es completamente asociativa, significa que cualquier bloque de datos de RAM se puede almacenar en cualquier bloque de caché. La ventaja de un sistema de este tipo es que la tasa de aciertos es alta, pero el tiempo de búsqueda es extremadamente largo: la CPU tiene que revisar toda su caché para averiguar si los datos están presentes antes de buscar en la memoria principal.

En el extremo opuesto del espectro, tenemos cachés mapeados directamente. Una caché de asignación directa es una caché donde cada bloque de caché puede contener uno y solo un bloque de memoria principal. Este tipo de caché se puede buscar muy rápidamente, pero como se asigna 1: 1 a ubicaciones de memoria, tiene una tasa de aciertos baja. Entre estos dos extremos están norte-manera cachés asociativos. Una caché asociativa de 2 vías (el L1 de Piledriver es de 2 vías) significa que cada bloque de memoria principal puede mapearse en uno de los dos bloques de caché. Una caché asociativa de ocho vías significa que cada bloque de la memoria principal podría estar en uno de los ocho bloques de caché. La caché de instrucciones L1 de Ryzen es asociativa de 4 vías, mientras que la caché de datos L1 es asociativa por conjuntos de 8 vías.

Las siguientes dos diapositivas muestran cómo la tasa de aciertos mejora con la asociatividad de conjuntos. Tenga en cuenta que aspectos como la tasa de aciertos son muy particulares: diferentes aplicaciones tendrán diferentes tasas de aciertos.

Cache-HitRate

Por qué las cachés de CPU siguen creciendo

Entonces, ¿por qué agregar cachés continuamente más grandes en primer lugar? Porque cada grupo de memoria adicional elimina la necesidad de acceder a la memoria principal y puede mejorar el rendimiento en casos específicos.

Crystalwell contra Core i7

Esta gráfico de la revisión de Haswell de Anandtech es útil porque ilustra el impacto en el rendimiento de agregar una caché L4 enorme (128 MB), así como las estructuras L1 / L2 / L3 convencionales. Cada escalón representa un nuevo nivel de caché. La línea roja es el chip con L4; tenga en cuenta que para archivos de gran tamaño, sigue siendo casi el doble de rápido que los otros dos chips Intel.

Puede parecer lógico, entonces, dedicar grandes cantidades de recursos en la matriz a la caché, pero resulta que hay un rendimiento marginal decreciente al hacerlo. Los cachés más grandes son más lentos y más costosos. A seis transistores por bit de SRAM (6T), la caché también es cara (en términos de tamaño de troquel y, por tanto, coste en dólares). Pasado cierto punto, tiene más sentido gastar el presupuesto de energía del chip y el recuento de transistores en más unidades de ejecución, mejor predicción de ramificaciones o núcleos adicionales. En la parte superior de la historia, puede ver una imagen del chip Pentium M (Centrino / Dothan); todo el lado izquierdo del dado está dedicado a un caché L2 masivo. Este fue el caso en los últimos días de las CPU de un solo subproceso, ahora que tenemos chips multinúcleo y GPU integrados en muchos casos, un porcentaje menor de la CPU en general está dedicado a la caché.

Cómo el diseño de la caché afecta el rendimiento

El impacto en el rendimiento de agregar una memoria caché de CPU está directamente relacionado con su eficiencia o tasa de aciertos; las fallas repetidas de caché pueden tener un impacto catastrófico en el rendimiento de la CPU. El siguiente ejemplo está muy simplificado, pero debería servir para ilustrar el punto.

Imagina que un UPC tiene que cargar datos de la caché L1 100 veces seguidas. La caché L1 tiene una latencia de acceso de 1ns y una tasa de aciertos del 100 por ciento. Por lo tanto, nuestra CPU tarda 100 nanosegundos en realizar esta operación.

Disparo de matriz Haswell-E

Disparo de matriz Haswell-E (haz clic para acercar). Las estructuras repetitivas en el medio del chip son 20 MB de caché L3 compartida.

Ahora, suponga que la caché tiene una tasa de aciertos del 99 por ciento, pero los datos que la CPU realmente necesita para su acceso número 100 se encuentran en L2, con una latencia de acceso de 10 ciclos (10ns). Eso significa que la CPU tarda 99 nanosegundos en realizar las primeras 99 lecturas y 10 nanosegundos en realizar la centésima. Una reducción del 1 por ciento en la tasa de aciertos acaba de ralentizar la CPU en un 10 por ciento.

En el mundo real, una caché L1 normalmente tiene una tasa de aciertos entre el 95 y el 97 por ciento, pero la actuación El impacto de esos dos valores en nuestro ejemplo simple no es del 2 por ciento, es del 14 por ciento. Tenga en cuenta que asumimos que los datos perdidos siempre se encuentran en la caché L2. Si los datos han sido desalojados de la caché y están almacenados en la memoria principal, con una latencia de acceso de 80-120ns, la diferencia de rendimiento entre una tasa de aciertos del 95 y el 97 por ciento podría casi duplicar el tiempo total necesario para ejecutar el código.

Cuando se comparaba la familia Bulldozer de AMD con los procesadores de Intel, el tema del diseño de la caché y el impacto en el rendimiento surgió mucho. No está claro cuánto del desempeño mediocre de Bulldozer podría atribuirse a su subsistema de caché relativamente lento; además de tener latencias relativamente altas, la familia Bulldozer también sufría de una gran cantidad de caché contención. Cada módulo Bulldozer / Piledriver / Steamroller compartió su caché de instrucciones L1, como se muestra a continuación:

Tabla de caché Steamroller

Una caché se disputa cuando dos subprocesos diferentes escriben y sobrescriben datos en el mismo espacio de memoria. Daña el rendimiento de ambos subprocesos: cada núcleo se ve obligado a dedicar tiempo a escribir sus propios datos preferidos en el L1, solo para que el otro núcleo sobrescriba rápidamente esa información. El Steamroller MÁS VIEJO de AMD todavía se ve afectado por este problema, a pesar de que AMD aumentó la caché de código L1 a 96KB y la convirtió en asociativa de tres vías en lugar de dos. Las CPU Ryzen posteriores no comparten el caché de esta manera y no sufren este problema.

Tasas de éxito de Opteron y Xeon

Imagen de Anandtech

Este gráfico muestra cómo la tasa de aciertos del Opteron 6276 (un procesador Bulldozer original) dejado cuando ambos núcleos estaban activos, al menos en algunas pruebas. Sin embargo, está claro que la contención de la caché no es el único problema: el 6276 históricamente luchó por superar al 6174 incluso cuando ambos procesadores tenían tasas de aciertos iguales.

Zen 2 no tiene este tipo de debilidades en la actualidad, y el rendimiento general de la memoria caché y de la memoria de Zen y Zen 2 es mucho mejor que la arquitectura Piledriver anterior.

Las CPU modernas también suelen tener una caché “L0” muy pequeña, que a menudo tiene un tamaño de unos pocos KB y se utiliza para almacenar microoperaciones. Tanto AMD como Intel utilizan este tipo de caché; Zen tenía una caché de 2.048 µOP, mientras que Zen 2 tiene una caché de 4.096 µOP. Estos pequeños grupos de caché operan bajo los mismos principios generales que L1 y L2, pero representan un grupo de memoria aún más pequeño al que la CPU puede acceder con latencias aún más bajas que L1. A menudo, las empresas ajustarán estas capacidades entre sí. Zen 1 y Zen + (Ryzen 1xxx, 2xxx, 3xxx APU) tienen una caché de instrucciones L1 de 64 KB que es asociativa de 4 vías y una caché L0 de 2048 µOP. Zen 2 (CPU de escritorio Ryzen 3xxx, Ryzen Mobile 4xxx) tiene una caché de instrucciones L1 de 32KB que es asociativa por conjuntos de 8 vías y una caché de 4.096 µOP. Duplicar la asociatividad del conjunto y el tamaño de la caché µOP permitió a AMD reducir a la mitad el tamaño de la caché L1. Este tipo de compensaciones son comunes en los diseños de CPU.

Almacenamiento en caché

La estructura y el diseño de la caché aún se están perfeccionando a medida que los investigadores buscan formas de obtener un mayor rendimiento de las cachés más pequeñas. Hasta ahora, los fabricantes como Intel y AMD no han presionado drásticamente por cachés más grandes ni han llevado diseños hasta L4 todavía. Hay algunas CPU Intel con EDRAM integrado que tienen lo que equivale a una caché L4, pero este enfoque es inusual. Es por eso que usamos el ejemplo de Haswell anterior, aunque esa CPU es más antigua. Presumiblemente, los beneficios de una caché L4 grande aún no superan los costos de la mayoría de los casos de uso.

Independientemente, el diseño de la caché, el consumo de energía y el rendimiento serán fundamentales para el rendimiento de los procesadores futuros, y las mejoras sustanciales en los diseños actuales podrían impulsar el estado de cualquier empresa que pueda implementarlas.

Consulte también nuestra serie ExtremeTech Explains para obtener una cobertura más detallada de los temas tecnológicos más actuales.

Publicaciones relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar
Cerrar