Check the new version here

Popular channels

Como funciona la cache del procesador y por qué es esencial



El desarrollo de la cache y el cacheo es uno de los eventos mas significativos en la historia de la computación. Virtualmente cada CPU moderna desde las de ultra-bajo poder como los ARM Cortex-A5 hasta la mas poderosa de un Core i7 usa caches. Incluso microcontroladores avanzados frecuentemente tienen caches o son ofrecidas como opción. Los beneficios en el desempeño son demasiado significativos para ignorarlos, incluso en diseños de consumo ultra-bajo.

El cacheo intentaba solucionar un problema importante. En las primeras décadas de la computación, la memoria principal era extremadamente lenta e increíblemente cara, pero las CPUs no eran particularmente veloces tampoco. Después de 1980 la brecha se empezó a agrandar de manera muy veloz. Las velocidades de clock en la CPUs despegaron pero los tiempos de acceso a memoria mejoraron de forma mucho menos dramática. Mientras esta brecha crecia, se volvió paulatinamente más claro que un nuevo tipo de memoria veloz era necesaria.


Aunque solo llega al 2000, las crecientes de los 80s llevaron al desarrollo de las primeras caches.

Como funciona el cacheo
Las caches en la CPU son pequeños bancos de memoria que guardan información que la CPU seguramente va a necesitar a continuación. Que información es cargada en la cache depende de sofisticados algoritmos y suposiciones certeras acerca del código del programa. El objetivo del sistema de cache es asegurarse que la CPU tenga la siguiente porción de datos que va a necesitar ya cargada en la cache para el momento en que vaya a buscarla (esto se llama cache hit).
Un “cache miss”, por otro lado, significa que la CPU tiene que ir a buscar los datos a otro lado. Aquí es donde la cache nivel 2 (L2) entra en juego. Es mas lenta pero también mucho mas grande.

Algunos procesadores usan un diseño de cache inclusiva (significa que los datos almacenados en la cache L1 también están duplicados en la L2), mientras que otras son exclusivas (no tienen datos duplicados). Si los datos tampoco se encuentran en la cache L2 continua hacia la L3 (con frecuencia fuera del chip pero cerca de este), la L4 si existe y finalmente la memoria principal (DRAM).



Este gráfico muestra la relación entre una cache L1 con una tasa de aciertos (hits) constante pero con una cache L2 mas grande. Nótese que la tasa de aciertos sube abruptamente al incrementarse la L2. Una L2 mas grande, lenta y barata puede proveer todos los beneficios de una L1 grande sin el espacio ocupado en el chip ni la penalización en consumo de energía. La mayoría de las caches L1 modernas tienen una tasa de aciertos mucho mayor al 50% teórico que se muestra aquí. Intel y AMD típicamente están en el 95% o más.

El siguiente asunto importante es la asociatividad. Cada CPU tiene un tipo específico de RAM que se llama tag RAM. La tag RAM en un índice de todas las locaciones de memoria que se pueden mapear a cada bloque de cache. Si una cache es full asociativa significa que cualquier bloque de RAM puede ser almacenada en cualquier bloque de cache. La ventaja de tal sistema es que la tasa de hits es muy alta pero los tiempos de búsqueda son extremadamente largos, la CPU tiene que mirar la cache entera para saber si los datos están presentes antes de buscar en la memoria principal.

En el extremo opuesto del espectro tenemos las caches de mapeo directo. Una cache de mapeo directo es cuando cada bloque de la cache puede tener uno y solo un bloque de la memoria principal. Este tipo de cache puede ser escaneada de forma extremadamente veloz pero como la relación de mapeo es 1 a 1 con las locaciones de memoria el nivel de aciertos es muy bajo. Entre estos dos extremos están las cache asociativas de n-vías (n-way). Una cache asociativa de 2 vías (2-way) como la L1 de los Piledriver, significa que puede mapear una de dos locaciones de memoria. Una 8-way es una que en cada bloque de cache puede contener información de ocho bloques diferentes de memoria.

Los siguientes dos gráficos muestran como la tasa de aciertos mejora con la asociatividad. Tengan en cuenta que el “hit rate” es altamente particular, diferentes aplicaciones tendrán diferentes tasas de acierto.



Por qué las caches en la CPU siguen creciendo
Asi que, ¿para qué seguir agrandando las caches? Porque cada bloque de memoria adicional retrae la necesidad de accesar a la memoria principal y puede mejorar el desempeño en casos específicos.



Este gráfico de un review del procesador Haswell hecho por Anandtech, es útil porque ilustra el impacto en el desepeño de agregar una enorme cache L4 (128 megabytes) asi como las estructuras convencionales L1/L2/L3.

Parece lógico entonces dedicar enormes cantidades de recursos en el chip a la cache, pero ocurre que hay un retorno cada vez menor en hacerlo. Caches mas grandes son las dos cosas, mas lentas y mas caras. Con 6 transistores por bit de SRAM, la cache también es cara en términos de tamaño en el chip y por tanto en costo monetario. Pasado cieto punto, tiene mas sentido gastar el presupuesto de energía y transistores del chip en mas unidades de ejecución, mejor predicción de salto o mas núcleos. Al principio del post se puede ver una imagen del Pentium M (Centrino/Dothan), el lado izquierdo entero del chip esta dedicado a una cache L2 masiva.

Como impacta el diseño de cache en la performance
El impacto en la performance de agregar una cache esta directamente relacionado con su eficiencia o tasa de aciertos, cache misses repetidos pueden tener un impacto catastrófico en el desempeño de la CPU. El siguiente ejemplo esta enormemente simplificado pero debería alcanzar para ilustrar el punto.

Imagina una CPU que tiene que cargar datos desde la cache L1 cien veces consecutivas. La cache L1 tiene una latencia de acceso de 1 nanosegundo (ns) y un hit rate del 100%. Por tanto le toma a nuestra CPU 100 ns para completar la operación.


Foto del chip Haswell-E. Las estructuras que se repiten en el centro del chip son los 20MB de cache L3.

Ahora, asuma que la cache tiene un hit rate del 99% pero la CPU necesita ir para su centésimo acceso a la cache L2 con una latencia de 10 ciclos (10ns). Esto significa que le toma a la CPU 99 ns finalizar las primeras 99 lecturas y 10ns para la última. Un 1% de reducción en el hit rate ha enlentecido la CPU en un 10%.

En el mundo real una cache L1 tiene típicamente una tasa de acierto del 95 al 97%, pero el impacto en la performance de esos dos valores en nuestro ejemplo no es el 2%, es el 14%. Tenga en mente que estamos asumiendo que los datos no presentes en la cache L1 si lo están en la L2. Si los datos están fuera de la cache y se alojan en la memoria principal, con latencia de 80 a 120ns, la diferencia de performance entre el 95 y 97% de hit rate puede doblar el tiempo total necesario para ejecutar el código.

Cuando la famila Bulldozer de AMD es comparada con procesadores Intel, el tópico del diseño de cache y el impacto en la performance, es un importante asunto. No está claro cuanto de la baja performance de Bulldozer se le puede responsabilizar al subsistema de caches. En adicion a las latencias relativamente altas, la familia Bulldozer también sufre de una gran dosis de contención de cache. Cada modulo Bulldozer/Piledriver/Seamroller comparte su cache de instrucciones como se muestra abajo:



Una cache es contenida cuando dos hilos (threads) de ejecución están escribiendo y sobreescribiendo en el mismo espacio de memoria. Esto daña el desempeño de ambos threads, cada núcleo es forzado a gastar tiempo escribiendo sus datos en la L1 sólo para que el otro núcleo rápidamente sobreescriba esa información. Steamroller todavía esta acuciado por este problema, aunque AMD haya incrementado la cache L1 de instrucciones a 96KB y la hiciera asociativa de tres vías en lugar de dos.



Caching out
La estructura y diseño de la cache sigue siendo refinada y los investigadores buscan formas de lograr mayores desempeños de menores caches. Hay una vieja regla del pulgar que dice que añadimos un nivel de cache por década, y parece seguir siendo cierto en la era moderna, los Haswell y Broadwell de Intel ofrecen ciertas versiones con enormes caches L4 para continuar con la tendencia.

Es una pregunta abierta en este punto si AMD alguna vez ira por este camino. El énfasis de la compañía en HSA y recursos de ejecución compartidos parece llevarla por un camino diferente, y los actuales chips de AMD no poseen el nivel que justifique el costo.

En cualquier caso, el diseño de caché, el consumo de energía y el rendimiento serán críticos para el rendimiento de los procesadores futuros, y conseguir importantes mejoras en los diseños actuales podría impulsar el estado de cualquier compañía que pueda ponerlas en práctica.


Esta nota aparecida hoy en Extremetech.com contradice en gran medida lo que yo habia escrito en mi viejo post del 2011¿Por qué lo micros Bulldozer resultaron ser una poronga?. En aquella época todavia no se entendia bien el motivo de la falta de rendimiento del chip y las explicaciones especulativas (como la mia) eran frecuentes. La data de ese post es correcta pero no es toda la historia.


Saludos.
0No comments yet