La jerarquía de caché, o caché multinivel , es una arquitectura de memoria que utiliza una jerarquía de almacenes de memoria en función de las distintas velocidades de acceso a los datos almacenados en caché. Los datos más solicitados se almacenan en caché en almacenes de memoria de acceso de alta velocidad, lo que permite un acceso más rápido por parte de los núcleos de la unidad central de procesamiento (CPU).
La jerarquía de caché es una forma y parte de la jerarquía de memoria y puede considerarse una forma de almacenamiento por niveles . [1] Este diseño fue pensado para permitir que los núcleos de la CPU procesen más rápido a pesar de la latencia de la memoria del acceso a la memoria principal . El acceso a la memoria principal puede actuar como un cuello de botella para el rendimiento del núcleo de la CPU mientras la CPU espera datos, mientras que hacer que toda la memoria principal sea de alta velocidad puede ser prohibitivamente costoso. Las cachés de alta velocidad son un compromiso que permite el acceso de alta velocidad a los datos más utilizados por la CPU, lo que permite un reloj de CPU más rápido . [2]
En la historia del desarrollo de chips electrónicos y de computadoras, hubo un período en el que los aumentos en la velocidad de la CPU superaron las mejoras en la velocidad de acceso a la memoria. [3] La brecha entre la velocidad de las CPU y la memoria significaba que la CPU a menudo estaba inactiva. [4] Las CPU eran cada vez más capaces de ejecutar mayores cantidades de instrucciones en un tiempo determinado, pero el tiempo necesario para acceder a los datos de la memoria principal impedía que los programas se beneficiaran plenamente de esta capacidad. [5] Este problema motivó la creación de modelos de memoria con mayores tasas de acceso para aprovechar el potencial de los procesadores más rápidos. [6]
Esto dio lugar al concepto de memoria caché , propuesto por primera vez por Maurice Wilkes , un científico informático británico de la Universidad de Cambridge en 1965. Llamó a estos modelos de memoria "memoria esclava". [7] Entre aproximadamente 1970 y 1990, los artículos de Anant Agarwal , Alan Jay Smith , Mark D. Hill , Thomas R. Puzak y otros discutieron mejores diseños de memoria caché. Los primeros modelos de memoria caché se implementaron en ese momento, pero incluso cuando los investigadores estaban investigando y proponiendo mejores diseños, la necesidad de modelos de memoria más rápidos continuó. Esta necesidad resultó del hecho de que, aunque los primeros modelos de caché mejoraron la latencia de acceso a los datos, con respecto a los costos y las limitaciones técnicas no era factible que la caché de un sistema informático se acercara al tamaño de la memoria principal. A partir de 1990, se propusieron ideas como agregar otro nivel de caché (segundo nivel), como respaldo para la caché de primer nivel. Jean-Loup Baer , Wen-Hann Wang, Andrew W. Wilson y otros han realizado investigaciones sobre este modelo. Cuando varias simulaciones e implementaciones demostraron las ventajas de los modelos de caché de dos niveles, el concepto de cachés multinivel se impuso como un modelo nuevo y generalmente mejor de memorias caché. Desde el año 2000, los modelos de caché multinivel han recibido una amplia atención y actualmente se implementan en muchos sistemas, como los cachés de tres niveles que están presentes en los productos Core i7 de Intel. [8]
El acceso a la memoria principal para cada ejecución de instrucción puede resultar en un procesamiento lento, ya que la velocidad del reloj depende del tiempo necesario para encontrar y obtener los datos. Para ocultar esta latencia de la memoria al procesador, se utiliza el almacenamiento en caché de datos. [9] Siempre que el procesador necesita los datos, se obtienen de la memoria principal y se almacenan en una estructura de memoria más pequeña llamada caché. Si hay alguna necesidad adicional de esos datos, primero se busca en la caché antes de ir a la memoria principal. [10] Esta estructura se encuentra más cerca del procesador en términos del tiempo que se tarda en buscar y obtener datos con respecto a la memoria principal. [11] Las ventajas de utilizar la caché se pueden demostrar calculando el tiempo de acceso promedio (AAT) para la jerarquía de memoria con y sin caché. [12]
Los cachés, al ser de pequeño tamaño, pueden dar lugar a errores frecuentes (cuando una búsqueda en el caché no proporciona la información buscada), lo que da lugar a una llamada a la memoria principal para recuperar los datos. Por lo tanto, la AAT se ve afectada por la tasa de errores de cada estructura en la que busca los datos. [13]
La AAT para la memoria principal se obtiene mediante Hit time main memory . La AAT para cachés se puede obtener mediante
El tiempo de acceso a los cachés es menor que el tiempo de acceso a la memoria principal, por lo que el AAT para la recuperación de datos es significativamente menor cuando se accede a los datos a través del caché en lugar de la memoria principal. [14]
Si bien el uso de la memoria caché puede mejorar la latencia de la memoria, es posible que no siempre resulte en la mejora necesaria en el tiempo que se tarda en obtener datos debido a la forma en que se organizan y recorren las memorias caché. Por ejemplo, las memorias caché de mapeo directo que tienen el mismo tamaño suelen tener una tasa de errores más alta que las memorias caché completamente asociativas. Esto también puede depender del parámetro de referencia de la computadora que prueba el procesador y del patrón de instrucciones. Pero el uso de una memoria caché completamente asociativa puede resultar en un mayor consumo de energía, ya que tiene que buscar en toda la memoria caché cada vez. Debido a esto, el equilibrio entre el consumo de energía (y el calor asociado) y el tamaño de la memoria caché se vuelve crítico en el diseño de la memoria caché. [13]
En caso de que se produzca un error de caché, el propósito de utilizar dicha estructura se volverá inútil y el ordenador tendrá que ir a la memoria principal para obtener los datos necesarios. Sin embargo, con un caché de varios niveles , si el ordenador no encuentra el caché más cercano al procesador (caché de nivel uno o L1), buscará en el nivel o niveles de caché más cercanos y accederá a la memoria principal solo si estos métodos fallan. La tendencia general es mantener el caché L1 pequeño y a una distancia de 1 a 2 ciclos de reloj de CPU del procesador, y los niveles inferiores de caché aumentan de tamaño para almacenar más datos que L1, por lo que están más distantes pero con una tasa de errores menor. Esto da como resultado una mejor AAT. [15] Los arquitectos pueden diseñar la cantidad de niveles de caché según sus requisitos después de verificar las compensaciones entre el costo, las AAT y el tamaño. [16] [17]
Con el escalamiento tecnológico que permitió que los sistemas de memoria se pudieran acomodar en un solo chip, la mayoría de los procesadores modernos tienen hasta tres o cuatro niveles de caché. [18] La reducción en la AAT se puede entender con este ejemplo, donde la computadora verifica la AAT para diferentes configuraciones hasta cachés L3.
Ejemplo : memoria principal = 50 ns , L1 = 1 ns con una tasa de error del 10 %, L2 = 5 ns con una tasa de error del 1 %, L3 = 10 ns con una tasa de error del 0,2 %.
En una caché con bancos, la caché se divide en una caché dedicada al almacenamiento de instrucciones y una caché dedicada a los datos. Por el contrario, una caché unificada contiene tanto las instrucciones como los datos en la misma caché. [22] Durante un proceso, el procesador accede a la caché L1 (o la mayoría de las cachés de nivel superior en relación con su conexión con el procesador) para recuperar tanto las instrucciones como los datos. Para que se implementen ambas acciones al mismo tiempo, se necesitan varios puertos y más tiempo de acceso en una caché unificada. Tener varios puertos requiere hardware y cableado adicionales, lo que genera una estructura significativa entre las cachés y las unidades de procesamiento. [23] Para evitar esto, la caché L1 a menudo se organiza como una caché con bancos, lo que da como resultado menos puertos, menos hardware y, en general, tiempos de acceso más bajos. [13]
Los procesadores modernos tienen cachés divididos y en sistemas con cachés multinivel, los cachés de nivel superior pueden unificarse mientras que los de nivel inferior se dividen. [24]
La política de inclusión del sistema de memoria determina si un bloque presente en la capa de caché superior también puede estar presente en el nivel de caché inferior y puede ser inclusiva, exclusiva o no inclusiva no exclusiva (NINE). [ cita requerida ]
Con una política inclusiva, todos los bloques presentes en la caché de nivel superior deben estar presentes también en la caché de nivel inferior. Cada componente de la caché de nivel superior es un subconjunto del componente de la caché de nivel inferior. En este caso, dado que hay una duplicación de bloques, se desperdicia algo de memoria. Sin embargo, la comprobación es más rápida. [ cita requerida ]
En una política exclusiva, todos los componentes de la jerarquía de caché son completamente exclusivos, de modo que ningún elemento de la caché de nivel superior estará presente en ninguno de los componentes de la caché de nivel inferior. Esto permite el uso completo de la memoria caché. Sin embargo, existe una alta latencia de acceso a la memoria. [25]
Las políticas anteriores requieren que se respete un conjunto de reglas para implementarlas. Si no se fuerza ninguna de ellas, la política de inclusión resultante se denomina política de inclusión no inclusiva y no exclusiva (NINE). Esto significa que la caché de nivel superior puede o no estar presente en la caché de nivel inferior. [21]
Hay dos políticas que definen la forma en que se actualizará un bloque de caché modificado en la memoria principal: escritura directa y escritura diferida. [ cita requerida ]
En el caso de la política de escritura continua, siempre que cambia el valor del bloque de caché, también se modifica aún más en la jerarquía de memoria de nivel inferior. [26] Esta política garantiza que los datos se almacenen de forma segura a medida que se escriben en toda la jerarquía.
Sin embargo, en el caso de la política de escritura diferida, el bloque de caché modificado se actualizará en la jerarquía de nivel inferior solo cuando se expulse el bloque de caché. Se adjunta un "bit sucio" a cada bloque de caché y se establece siempre que se modifica el bloque de caché. [27] Durante la expulsión, los bloques con un bit sucio establecido se escribirán en la jerarquía de nivel inferior. Con esta política, existe un riesgo de pérdida de datos, ya que la copia más recientemente modificada de un dato solo se almacena en la caché y, por lo tanto, se deben observar algunas técnicas correctivas.
En caso de una escritura en la que el byte no está presente en el bloque de caché, el byte puede llevarse al caché según lo determinado por una política de asignación de escritura o de no asignación de escritura. [28] La política de asignación de escritura establece que en caso de una falla de escritura, el bloque se recupera de la memoria principal y se coloca en el caché antes de escribir. [29] En la política de no asignación de escritura, si el bloque no se encuentra en el caché, se escribirá en la jerarquía de memoria de nivel inferior sin buscar el bloque en el caché. [30]
Las combinaciones comunes de políticas son "escritura diferida, escritura con asignación" y "escritura directa, escritura sin asignación" .
Una caché privada se asigna a un núcleo en particular en un procesador y no puede ser accedida por ningún otro núcleo. En algunas arquitecturas, cada núcleo tiene su propia caché privada; esto crea el riesgo de bloques duplicados en la arquitectura de caché de un sistema, lo que resulta en una utilización reducida de la capacidad. Sin embargo, este tipo de elección de diseño en una arquitectura de caché multicapa también puede ser buena para una latencia de acceso a los datos más baja. [28] [31] [32]
Una caché compartida es una caché a la que pueden acceder varios núcleos. [33] Dado que es compartida, cada bloque de la caché es único y, por lo tanto, tiene una mayor tasa de aciertos, ya que no habrá bloques duplicados. Sin embargo, la latencia de acceso a los datos puede aumentar a medida que varios núcleos intentan acceder a la misma caché. [34]
En los procesadores multinúcleo , la elección de diseño para hacer que una caché sea compartida o privada afecta el rendimiento del procesador. [35] En la práctica, la caché de nivel superior L1 (o a veces L2) [36] [37] se implementa como privada y las cachés de nivel inferior se implementan como compartidas. Este diseño proporciona altas tasas de acceso para las cachés de alto nivel y bajas tasas de error para las cachés de nivel inferior. [35]
Hasta 64 núcleos:
6 núcleos (rendimiento | eficiencia):
96 núcleos:
20 núcleos (núcleo de "rendimiento" 4:1 | núcleo de "eficiencia"):
De 6 a 16 núcleos:
{{cite news}}
: CS1 maint: varios nombres: lista de autores ( enlace )