Una caché de CPU es una caché de hardware utilizada por la unidad central de procesamiento (CPU) de una computadora para reducir el costo promedio (tiempo o energía) para acceder a los datos de la memoria principal . [ 1 ] Una caché es una memoria más pequeña y rápida, ubicada más cerca de un núcleo de procesador , que almacena copias de los datos de ubicaciones de memoria principal de uso frecuente , evitando la necesidad de consultar siempre la memoria principal, cuyo acceso puede ser decenas o cientos de veces más lento.
La memoria caché se implementa típicamente con memoria de acceso aleatorio estática (SRAM), que requiere múltiples transistores para almacenar un solo bit . Esto la hace costosa en términos del área que ocupa, y en las CPU modernas, la caché suele ser la parte más grande en términos de área del chip. El tamaño de la caché debe equilibrarse con el deseo general de chips más pequeños y económicos. Algunos diseños modernos implementan parte o la totalidad de su caché utilizando eDRAM , físicamente más pequeña , que es más lenta que la SRAM, pero permite mayores cantidades de caché para una cantidad dada de área de chip.
La mayoría de las CPU tienen una jerarquía de múltiples niveles de caché (L1, L2, a menudo L3, y rara vez incluso L4), con cachés separadas específicas para instrucciones (I-cache) y específicas para datos (D-cache) en el nivel 1. [ 2 ] Los diferentes niveles se implementan en diferentes áreas del chip; L1 se ubica lo más cerca posible de un núcleo de CPU y, por lo tanto, ofrece la mayor velocidad debido a las rutas de señal cortas, pero requiere un diseño cuidadoso. Las cachés L2 están físicamente separadas de la CPU y operan más lentamente, pero imponen menos exigencias al diseñador del chip y pueden hacerse mucho más grandes sin afectar el diseño de la CPU. Las cachés L3 generalmente se comparten entre varios núcleos de CPU.
Existen otros tipos de caché (que no se incluyen en el cálculo del tamaño de la caché más importante mencionada anteriormente), como el búfer de traducción anticipada (TLB), que forma parte de la unidad de gestión de memoria (MMU) presente en la mayoría de las CPU. Las secciones de entrada/salida también suelen contener búferes de datos con una función similar.
Descripción general
Para acceder a los datos en la memoria principal , se utiliza un proceso de varios pasos, cada uno con su correspondiente retardo. Por ejemplo, para leer un valor de la memoria en un sistema informático sencillo, la CPU primero selecciona la dirección a la que se va a acceder, la cual se expresa en el bus de direcciones y espera un tiempo fijo para que el valor se estabilice. El dispositivo de memoria que contiene dicho valor, normalmente implementado en DRAM , lo almacena en un formato de muy bajo consumo energético, insuficiente para que la CPU lo lea directamente. En su lugar, la CPU debe copiar ese valor desde el almacenamiento a un pequeño búfer conectado al bus de datos . A continuación, espera un tiempo determinado para que este valor se estabilice antes de leerlo del bus de datos.
Al ubicar la memoria físicamente más cerca de la CPU, se reduce el tiempo necesario para que los buses se estabilicen. Además, al reemplazar la DRAM por SRAM, que almacena el valor en un formato que no requiere amplificación para su lectura, se elimina el retardo dentro de la propia memoria. Esto hace que la caché sea mucho más rápida tanto en la respuesta como en la lectura y escritura. Sin embargo, la SRAM requiere entre cuatro y seis transistores para almacenar un solo bit, según el tipo, mientras que la DRAM generalmente usa un transistor y un condensador por bit, lo que le permite almacenar muchos más datos en un área determinada del chip.
Implementar memoria en un formato más rápido puede generar mejoras significativas en el rendimiento. Al intentar leer o escribir en una ubicación de la memoria, el procesador verifica si los datos de esa ubicación ya se encuentran en la caché. De ser así, el procesador leerá o escribirá en la caché en lugar de en la memoria principal, que es mucho más lenta.
Muchos procesadores modernos para ordenadores de sobremesa , servidores e industria tienen al menos tres niveles independientes de caché (L1, L2 y L3) y diferentes tipos de caché:
- Búfer de búsqueda de traducción (TLB)
- Se utiliza para acelerar la traducción de direcciones virtuales a físicas tanto para instrucciones ejecutables como para datos. Se puede proporcionar una única TLB para acceder a instrucciones y datos, o bien una TLB de instrucciones (ITLB) y una TLB de datos (DTLB) independientes. Sin embargo, la caché TLB forma parte de la unidad de gestión de memoria (MMU) y no está directamente relacionada con las cachés de la CPU.
- caché de instrucciones (I-cache)
- Se utiliza para acelerar la búsqueda de instrucciones ejecutables; algunas versiones especializadas incluyen cachés de microoperaciones y cachés de instrucciones de destino de bifurcación .
- Caché de datos (caché D)
- Se utiliza para acelerar la obtención y el almacenamiento de datos.
- Cachés de nivel superior
- Las cachés situadas por encima de la caché I y la caché D suelen estar organizadas como una jerarquía de más niveles de caché (L2, L3, etc.); véase también el apartado de cachés multinivel más adelante.
Historia

Los primeros ejemplos de cachés de CPU incluyen el Atlas 2 [ 3 ] y el IBM System/360 Modelo 85 [ 4 ] [ 5 ] en la década de 1960. Las primeras CPU que usaban una caché tenían solo un nivel de caché; a diferencia de la caché de nivel 1 posterior, no estaba dividida en L1d (para datos) y L1i (para instrucciones). La caché L1 dividida comenzó en 1976 con la CPU IBM 801 , [ 6 ] [ 7 ] se generalizó a finales de la década de 1980, y en 1997 entró en el mercado de CPU embebidas con el ARMv5TE. A partir de 2015, incluso los SoC de menos de un dólar dividen la caché L1. También tienen cachés L2 y, para procesadores más grandes, también cachés L3. La caché L2 generalmente no está dividida y actúa como un repositorio común para la caché L1 ya dividida. Cada núcleo de un procesador multinúcleo tiene una caché L1 dedicada y generalmente no se comparte entre los núcleos. La caché L2 y las cachés de nivel inferior pueden compartirse entre los núcleos. La caché L4 es poco común actualmente y generalmente consiste en memoria de acceso aleatorio dinámica (DRAM) en un chip independiente, en lugar de memoria de acceso aleatorio estática (SRAM). Una excepción a esto es cuando se utiliza eDRAM para todos los niveles de caché, hasta L1. Históricamente, L1 también se encontraba en un chip independiente; sin embargo, el mayor tamaño de los chips ha permitido su integración, así como la de otros niveles de caché, con la posible excepción del último nivel. Cada nivel adicional de caché tiende a ser más pequeño y rápido que los niveles inferiores. [ 8 ]
Las cachés (como históricamente para la RAM) generalmente se han dimensionado en potencias de: 2, 4, 8, 16, etc. KiB ; cuando se alcanzaron tamaños de MiB (es decir, para cachés no L1 más grandes), muy pronto el patrón se rompió, para permitir cachés más grandes sin verse obligados al paradigma de duplicar el tamaño, con por ejemplo el Intel Core 2 Duo con caché L2 de 3 MiB en abril de 2008. Esto sucedió mucho más tarde para las cachés L1, ya que su tamaño generalmente sigue siendo un número pequeño de KiB. El IBM zEC12 de 2012 es una excepción, sin embargo, al obtener una caché de datos L1 inusualmente grande de 96 KiB para su época, y por ejemplo el IBM z13 que tiene una caché de instrucciones L1 de 96 KiB (y una caché de datos L1 de 128 KiB), [ 9 ] y los procesadores basados en Intel Ice Lake de 2018, que tienen una caché de datos L1 de 48 KiB y una caché de instrucciones L1 de 48 KiB. En 2020, algunas CPU Intel Atom (con hasta 24 núcleos) tienen tamaños de caché (múltiplos de) 4,5 MiB y 15 MiB. [ 10 ] [ 11 ]
Operación
Entradas de caché
Los datos se transfieren entre la memoria y la caché en bloques de tamaño fijo, denominados líneas o bloques de caché . Cuando una línea de caché se copia de la memoria a la caché, se crea una entrada de caché. Esta entrada incluirá los datos copiados, así como la ubicación de memoria solicitada (denominada etiqueta).
Cuando el procesador necesita leer o escribir en una ubicación de memoria, primero busca una entrada correspondiente en la caché. La caché busca el contenido de la ubicación solicitada en cualquier línea de caché que pueda contener esa dirección. Si el procesador encuentra la ubicación en la caché, se produce un acierto . Sin embargo, si no la encuentra, se produce un fallo . En caso de acierto, el procesador lee o escribe inmediatamente los datos en la línea de caché. En caso de fallo, la caché asigna una nueva entrada y copia los datos de la memoria principal; luego, la solicitud se satisface con el contenido de la caché.
Políticas
Políticas de reemplazo
Para dejar espacio a la nueva entrada tras un fallo de caché, esta puede tener que eliminar una de las entradas existentes. La heurística que utiliza para elegir la entrada a eliminar se denomina política de reemplazo. El problema fundamental de cualquier política de reemplazo es que debe predecir qué entrada de caché existente tiene menos probabilidades de ser utilizada en el futuro. Predecir el futuro suele ser difícil, por lo que no existe un método perfecto para elegir entre la variedad de políticas de reemplazo disponibles. Una política de reemplazo popular, la de menos usado recientemente (LRU), reemplaza la entrada a la que se ha accedido menos recientemente.
Marcar ciertos rangos de memoria como no almacenables en caché puede mejorar el rendimiento, al evitar el almacenamiento en caché de regiones de memoria a las que se accede con poca frecuencia. Esto evita la sobrecarga que supone cargar información en la caché sin que se vaya a reutilizar. Las entradas de caché también pueden deshabilitarse o bloquearse según el contexto.
Redactar políticas
Si se escriben datos en la caché, en algún momento también deben escribirse en la memoria principal; la sincronización de esta escritura se conoce como política de escritura. En una caché de escritura directa , cada escritura en la caché provoca una escritura en la memoria principal. Por otro lado, en una caché de escritura diferida o de copia, las escrituras no se replican inmediatamente en la memoria principal, y las ubicaciones sobrescritas se marcan como sucias , escribiéndose de nuevo en la memoria principal solo cuando se eliminan de la caché. Por este motivo, un fallo de lectura en una caché de escritura diferida a veces puede requerir dos accesos a memoria para su resolución: uno para escribir primero la ubicación sucia en la memoria principal y otro para leer la nueva ubicación de la memoria. Además, una escritura en una ubicación de la memoria principal que aún no está mapeada en una caché de escritura diferida puede eliminar una ubicación ya sucia, liberando así ese espacio de caché para la nueva ubicación de memoria.
También existen políticas intermedias. La caché puede ser de escritura directa, pero las escrituras pueden retenerse temporalmente en una cola de datos de almacenamiento, generalmente para que se puedan procesar varios almacenamientos a la vez (lo que puede reducir los tiempos de espera del bus y mejorar su utilización).
Los datos almacenados en caché en la memoria principal pueden ser modificados por otras entidades (por ejemplo, periféricos que utilizan acceso directo a memoria (DMA) u otro núcleo en un procesador multinúcleo ), en cuyo caso la copia en la caché puede quedar obsoleta. De igual modo, cuando una CPU en un sistema multiprocesador actualiza los datos en la caché, las copias de los datos en las cachés asociadas a otras CPU quedan obsoletas. Los protocolos de comunicación entre los gestores de caché que mantienen la coherencia de los datos se conocen como protocolos de coherencia de caché .
Rendimiento de la caché
La medición del rendimiento de la caché se ha vuelto crucial en los últimos tiempos, dado que la diferencia de velocidad entre la memoria y el procesador aumenta exponencialmente. La caché se introdujo para reducir esta diferencia. Por lo tanto, es fundamental conocer la capacidad de la caché para compensar esta brecha, especialmente en sistemas de alto rendimiento. La tasa de aciertos y la tasa de fallos de la caché desempeñan un papel importante en la determinación de este rendimiento. Para mejorar el rendimiento de la caché, reducir la tasa de fallos es uno de los pasos necesarios. Disminuir el tiempo de acceso a la caché también mejora su rendimiento y facilita la optimización.
La CPU se bloquea
El tiempo que se tarda en obtener una línea de caché de la memoria ( latencia de lectura por fallo de caché) es importante porque la CPU se queda sin trabajo mientras espera. Cuando una CPU llega a este estado, se denomina bloqueo. A medida que las CPU se vuelven más rápidas que la memoria principal, los bloqueos debidos a fallos de caché desplazan una mayor cantidad de cálculos potenciales; las CPU modernas pueden ejecutar cientos de instrucciones en el tiempo que se tarda en obtener una sola línea de caché de la memoria principal.
Se han empleado diversas técnicas para mantener ocupada la CPU durante este tiempo, incluyendo la ejecución fuera de orden, en la que la CPU intenta ejecutar instrucciones independientes después de la instrucción que espera los datos de fallo de caché. Otra tecnología, utilizada por muchos procesadores, es el multihilo simultáneo (SMT), que permite que un hilo alternativo utilice el núcleo de la CPU mientras el primer hilo espera a que los recursos de la CPU necesarios estén disponibles.
Asociatividad

La política de ubicación decide dónde en la caché se colocará una copia de una entrada particular de la memoria principal. Si la política de ubicación puede elegir libremente cualquier entrada en la caché para almacenar la copia, la caché se denomina totalmente asociativa . En el otro extremo, si cada entrada en la memoria principal puede ir a un solo lugar en la caché, la caché es de mapeo directo . Muchas cachés implementan un compromiso en el que cada entrada en la memoria principal puede ir a cualquiera de los N lugares en la caché, y se describen como asociativas de conjuntos de N vías. [ 12 ] Por ejemplo, la caché de datos de nivel 1 en un AMD Athlon es asociativa de conjuntos de dos vías, lo que significa que cualquier ubicación particular en la memoria principal puede almacenarse en caché en cualquiera de las dos ubicaciones en la caché de datos de nivel 1.
Elegir el valor adecuado de asociatividad implica una compensación . Si hay diez lugares a los que la política de ubicación podría haber asignado una ubicación de memoria, entonces para comprobar si esa ubicación está en la caché, se deben buscar diez entradas de caché. Comprobar más lugares requiere más energía y área del chip, y potencialmente más tiempo. Por otro lado, las cachés con mayor asociatividad sufren menos fallos (véase fallos por conflicto ), por lo que la CPU pierde menos tiempo leyendo de la memoria principal lenta. La pauta general es que duplicar la asociatividad, de asignación directa a bidireccional, o de bidireccional a cuatridireccional, tiene aproximadamente el mismo efecto en el aumento de la tasa de aciertos que duplicar el tamaño de la caché. Sin embargo, aumentar la asociatividad más de cuatro no mejora tanto la tasa de aciertos, [ 13 ] y generalmente se hace por otras razones (véase alias virtual ). Algunas CPU pueden reducir dinámicamente la asociatividad de sus cachés en estados de baja potencia, lo que actúa como una medida de ahorro de energía. [ 14 ]
En orden de peor pero simple a mejor pero complejo:
- Caché de mapeo directo : buen tiempo en el mejor de los casos, pero impredecible en el peor.
- Caché asociativa de dos vías
- Caché asociativa sesgada bidireccional [ 15 ]
- Caché asociativa de cuatro vías
- Caché asociativa de ocho vías, una opción común para implementaciones posteriores.
- Caché asociativa de conjuntos de 12 vías, similar a la de ocho vías.
- Caché totalmente asociativa : las mejores tasas de fallos, pero práctica solo para un número pequeño de entradas.
Caché de mapeo directo
En esta organización de caché, cada ubicación en la memoria principal puede ir en una sola entrada en la caché. Por lo tanto, una caché de mapeo directo también puede llamarse caché "asociativa de conjunto unidireccional". No tiene una política de ubicación como tal, ya que no hay elección de qué contenido de entrada de caché desalojar. Esto significa que si dos ubicaciones se mapean a la misma entrada, pueden continuamente desplazarse mutuamente. Aunque más simple, una caché de mapeo directo necesita ser mucho más grande que una asociativa para brindar un rendimiento comparable, y es más impredecible. Sea x el número de bloque en la caché, y el número de bloque de memoria y n el número de bloques en la caché, entonces el mapeo se realiza con la ayuda de la ecuación x = y mod n .
Caché asociativa de dos vías
Si cada ubicación de la memoria principal puede almacenarse en cualquiera de las dos ubicaciones de la caché, surge la pregunta lógica: ¿ en cuál de las dos? El esquema más simple y común, mostrado en el diagrama de la derecha, consiste en usar los bits menos significativos del índice de la ubicación de memoria como índice para la memoria caché, y tener dos entradas para cada índice. Una ventaja de este esquema es que las etiquetas almacenadas en la caché no tienen que incluir la parte de la dirección de la memoria principal que se deduce del índice de la memoria caché. Dado que las etiquetas de la caché tienen menos bits, requieren menos transistores, ocupan menos espacio en la placa de circuito del procesador o en el chip del microprocesador, y se pueden leer y comparar más rápidamente. Además, el algoritmo LRU es especialmente simple, ya que solo se necesita almacenar un bit para cada par.
Ejecución especulativa
Una de las ventajas de una caché de mapeo directo es que permite una especulación sencilla y rápida . Una vez calculada la dirección, se conoce el índice de caché que podría contener una copia de esa ubicación en memoria. Se puede leer esa entrada de caché y el procesador puede seguir trabajando con esos datos antes de finalizar la comprobación de que la etiqueta coincide con la dirección solicitada.
La idea de que el procesador utilice los datos almacenados en caché antes de que se complete la coincidencia de etiquetas también se puede aplicar a las cachés asociativas. Un subconjunto de la etiqueta, denominado pista , se puede usar para seleccionar solo una de las posibles entradas de caché que se corresponden con la dirección solicitada. La entrada seleccionada por la pista se puede usar en paralelo con la comprobación de la etiqueta completa. La técnica de la pista funciona mejor en el contexto de la traducción de direcciones, como se explica a continuación.
Caché asociativa sesgada bidireccional
Se han sugerido otros esquemas, como la caché sesgada , [ 15 ] donde el índice para la vía 0 es directo, como se indicó anteriormente, pero el índice para la vía 1 se forma con una función hash . Una buena función hash tiene la propiedad de que las direcciones que entran en conflicto con el mapeo directo tienden a no entrar en conflicto cuando se mapean con la función hash, por lo que es menos probable que un programa sufra una cantidad inesperadamente grande de fallos de conflicto debido a un patrón de acceso patológico. La desventaja es la latencia adicional derivada del cálculo de la función hash. [ 16 ] Además, cuando llega el momento de cargar una nueva línea y desalojar una antigua, puede ser difícil determinar qué línea existente fue la menos utilizada recientemente, porque la nueva línea entra en conflicto con datos en diferentes índices en cada vía; el seguimiento LRU para cachés no sesgadas generalmente se realiza por conjunto. Sin embargo, las cachés asociativas sesgadas tienen ventajas importantes sobre las asociativas de conjuntos convencionales. [ 17 ]
Caché pseudoasociativa
Una caché asociativa verdadera prueba todas las posibles combinaciones simultáneamente, utilizando algo similar a una memoria direccionable por contenido . Una caché pseudoasociativa prueba cada combinación posible de forma individual. Una caché hash-rehash y una caché asociativa por columnas son ejemplos de una caché pseudoasociativa.
En el caso común de encontrar un acierto en la primera forma probada, una caché pseudoasociativa es tan rápida como una caché de mapeo directo, pero tiene una tasa de fallos por conflicto mucho menor que una caché de mapeo directo, más cercana a la tasa de fallos de una caché totalmente asociativa. [ 16 ]
caché de varias columnas
En comparación con una caché de mapeo directo, una caché asociativa de conjuntos tiene un número reducido de bits para su índice de conjunto de caché que se mapea a un conjunto de caché, donde permanecen múltiples vías o bloques, como 2 bloques para una caché asociativa de conjuntos de 2 vías y 4 bloques para una caché asociativa de conjuntos de 4 vías. En comparación con una caché de mapeo directo, los bits de índice de caché no utilizados pasan a formar parte de los bits de etiqueta. Por ejemplo, una caché asociativa de conjuntos de 2 vías contribuye con 1 bit a la etiqueta y una caché asociativa de conjuntos de 4 vías contribuye con 2 bits a la etiqueta. La idea básica de la caché de múltiples columnas [ 18 ] es usar el índice de conjunto para mapear a un conjunto de caché como lo hace una caché asociativa de conjuntos convencional, y usar los bits de etiqueta añadidos para indexar una vía en el conjunto. Por ejemplo, en una caché asociativa de conjuntos de 4 vías, los dos bits se usan para indexar la vía 00, la vía 01, la vía 10 y la vía 11, respectivamente. Esta doble indexación de caché se denomina "mapeo de ubicación principal" y su latencia es equivalente a un acceso de mapeo directo. Experimentos exhaustivos en el diseño de caché de múltiples columnas [ 18 ] muestran que la tasa de aciertos en las ubicaciones principales alcanza el 90%. Si el mapeo de caché entra en conflicto con un bloque de caché en la ubicación principal, el bloque existente se moverá a otra ruta de caché en el mismo conjunto, denominada "ubicación seleccionada". Dado que el bloque de caché recién indexado es el más usado recientemente (MRU), se coloca en la ubicación principal en la caché de múltiples columnas, considerando la localidad temporal. Como la caché de múltiples columnas está diseñada para una caché con alta asociatividad, el número de rutas en cada conjunto es elevado; por lo tanto, es fácil encontrar una ubicación seleccionada en el conjunto. Se mantiene un índice de ubicación seleccionada mediante hardware adicional para la ubicación principal en un bloque de caché.
La caché de múltiples columnas mantiene una alta tasa de aciertos debido a su alta asociatividad y tiene una latencia baja comparable a la de una caché de mapeo directo debido a su alto porcentaje de aciertos en ubicaciones principales. Los conceptos de ubicaciones principales y ubicaciones seleccionadas en la caché de múltiples columnas se han utilizado en varios diseños de caché en el chip ARM Cortex R, [ 19 ] la memoria caché predictiva de vías de Intel, [ 20 ] la memoria caché asociativa multi-vía reconfigurable de IBM [ 21 ] y la selección de vías de reemplazo de caché dinámica de Oracle basada en bits de tabulación de direcciones. [ 22 ]
Estructura de entrada de caché
Las entradas de filas de caché suelen tener la siguiente estructura:
El bloque de datos (línea de caché) contiene los datos reales obtenidos de la memoria principal. La etiqueta contiene (parte de) la dirección de los datos reales obtenidos de la memoria principal. Los bits de bandera se explican más adelante .
El "tamaño" de la caché es la cantidad de datos de la memoria principal que puede almacenar. Este tamaño se calcula multiplicando el número de bytes almacenados en cada bloque de datos por el número de bloques almacenados en la caché. (Los bits de etiqueta, indicador y código de corrección de errores no se incluyen en el tamaño, [ 23 ] aunque sí afectan al área física de la caché).
Una dirección de memoria efectiva que acompaña a la línea de caché (bloque de memoria) se divide ( MSB a LSB ) en la etiqueta, el índice y el desplazamiento del bloque. [ 8 ] [ 24 ]
El índice describe en qué conjunto de caché se han colocado los datos. La longitud del índice esbits para conjuntos de caché s .
El desplazamiento de bloque especifica los datos deseados dentro del bloque de datos almacenado en la fila de caché. Normalmente, la dirección efectiva está en bytes, por lo que la longitud del desplazamiento de bloque esbits, donde b es el número de bytes por bloque de datos. La etiqueta contiene los bits más significativos de la dirección, que se comparan con todas las filas del conjunto actual (el conjunto se ha recuperado por índice) para ver si este conjunto contiene la dirección solicitada. Si la contiene, se produce un acierto de caché. La longitud de la etiqueta en bits es la siguiente:
tag_length = address_length - index_length - block_offset_length
Algunos autores se refieren al desplazamiento del bloque simplemente como "desplazamiento" [ 25 ] o "desplazamiento". [ 26 ] [ 27 ]
Ejemplo
El procesador Pentium 4 original tenía una caché de datos L1 asociativa de cuatro vías de 8 KiB , con bloques de caché de 64 bytes. Por lo tanto, hay 8 KiB / 64 = 128 bloques de caché. El número de conjuntos es igual al número de bloques de caché dividido por el número de vías de asociatividad, lo que da como resultado 128 / 4 = 32 conjuntos, y por lo tanto 2⁵ = 32 índices diferentes. Hay 2⁶ = 64 desplazamientos posibles. Dado que la dirección de la CPU tiene 32 bits de ancho, esto implica 32 − 5 − 6 = 21 bits para el campo de etiqueta.
El procesador Pentium 4 original también tenía una caché L2 integrada asociativa de ocho vías de 256 KiB de tamaño, con bloques de caché de 128 bytes. Esto implica 32 − 8 − 7 = 17 bits para el campo de etiqueta. [ 25 ]
bits de bandera
Una caché de instrucciones requiere solo un bit de indicador por cada entrada de fila de caché: un bit de validez. Este bit indica si un bloque de caché se ha cargado con datos válidos o no.
Al encenderse, el hardware establece todos los bits válidos en todas las cachés como "inválidos". Algunos sistemas también establecen un bit válido como "inválido" en otros momentos, como cuando el hardware de inspección de bus multi-maestro en la caché de un procesador detecta una transmisión de dirección de otro procesador y se da cuenta de que ciertos bloques de datos en la caché local están obsoletos y deben marcarse como inválidos.
Normalmente, una caché de datos requiere dos bits de indicador por línea de caché : un bit de validez y un bit de modificación . Si el bit de modificación está activado, significa que la línea de caché asociada ha cambiado desde que se leyó de la memoria principal ("modificada"), lo que implica que el procesador ha escrito datos en esa línea y el nuevo valor aún no se ha propagado completamente a la memoria principal.
Fallo de caché
Un fallo de caché es un intento fallido de leer o escribir un dato en la caché, lo que resulta en un acceso a la memoria principal con una latencia mucho mayor. Existen tres tipos de fallos de caché: fallo de lectura de instrucciones, fallo de lectura de datos y fallo de escritura de datos.
Los fallos de lectura de la caché de instrucciones generalmente causan el mayor retraso, porque el procesador, o al menos el hilo de ejecución , tiene que esperar (detenerse) hasta que la instrucción se obtenga de la memoria principal. Los fallos de lectura de la caché de datos generalmente causan un retraso menor, porque las instrucciones que no dependen de la lectura de la caché pueden emitirse y continuar su ejecución hasta que los datos se devuelvan de la memoria principal, y las instrucciones dependientes pueden reanudar su ejecución. Los fallos de escritura en la caché de datos generalmente causan el menor retraso, porque la escritura se puede poner en cola y hay pocas limitaciones en la ejecución de las instrucciones subsiguientes; el procesador puede continuar hasta que la cola esté llena. Para una introducción detallada a los tipos de fallos, consulte la medición y métricas del rendimiento de la caché .
Traducción de direcciones
La mayoría de las CPU de propósito general implementan algún tipo de memoria virtual . En resumen, cada programa que se ejecuta en la máquina ve su propio espacio de direcciones simplificado , que contiene código y datos exclusivos para ese programa, o bien todos los programas se ejecutan en un espacio de direcciones virtual común. Un programa se ejecuta calculando, comparando, leyendo y escribiendo en las direcciones de su espacio de direcciones virtual, en lugar de en las direcciones del espacio de direcciones físico, lo que simplifica los programas y, por lo tanto, facilita su escritura.
La memoria virtual requiere que el procesador traduzca las direcciones virtuales generadas por el programa a direcciones físicas en la memoria principal. La parte del procesador que realiza esta traducción se conoce como unidad de gestión de memoria (MMU). La ruta rápida a través de la MMU puede realizar las traducciones almacenadas en el búfer de traducción anticipada (TLB), que es una caché de asignaciones de la tabla de páginas , la tabla de segmentos o ambas del sistema operativo .
Para los fines de la presente discusión, existen tres características importantes de la traducción de direcciones:
- Latencia: La dirección física está disponible en la MMU algún tiempo, quizás unos pocos ciclos, después de que la dirección virtual esté disponible en el generador de direcciones.
- Aliasing: Varias direcciones virtuales pueden corresponder a una única dirección física. La mayoría de los procesadores garantizan que todas las actualizaciones de esa dirección física se realizarán en el orden de ejecución del programa. Para cumplir con esta garantía, el procesador debe asegurarse de que solo exista una copia de la dirección física en la caché en un momento dado.
- Granularidad: El espacio de direcciones virtuales se divide en páginas. Por ejemplo, un espacio de direcciones virtuales de 4 GiB podría dividirse en 1.048.576 páginas de 4 KiB, cada una de las cuales puede asignarse de forma independiente. Es posible que se admitan varios tamaños de página; consulte la sección de memoria virtual para obtener más información.
Un sistema de memoria virtual primitivo, el IBM M44/44X , requería un acceso a una tabla de mapeo almacenada en la memoria central antes de cada acceso programado a la memoria principal. [ 28 ] [ NB 1 ] Sin cachés, y con la memoria de la tabla de mapeo funcionando a la misma velocidad que la memoria principal, esto redujo efectivamente la velocidad de acceso a la memoria a la mitad. Dos máquinas primitivas que usaban una tabla de páginas en la memoria principal para el mapeo, el IBM System/360 Modelo 67 y el GE 645 , tenían una pequeña memoria asociativa como caché para los accesos a la tabla de páginas en memoria. Ambas máquinas precedieron a la primera máquina con una caché para la memoria principal, el IBM System/360 Modelo 85 , por lo que la primera caché de hardware utilizada en un sistema informático no era una caché de datos o de instrucciones, sino una TLB.
Las cachés se pueden dividir en cuatro tipos, según si el índice o la etiqueta corresponden a direcciones físicas o virtuales:
- Las cachés indexadas y etiquetadas físicamente (PIPT) utilizan la dirección física tanto para el índice como para la etiqueta. Si bien esto es sencillo y evita problemas de alias, también es lento, ya que la dirección física debe buscarse (lo que podría implicar un fallo de la TLB y el acceso a la memoria principal) antes de que dicha dirección pueda buscarse en la caché.
- Las cachés con indexación virtual y etiquetado virtual (VIVT) utilizan la dirección virtual tanto para el índice como para la etiqueta. Este esquema de almacenamiento en caché puede resultar en búsquedas mucho más rápidas, ya que no es necesario consultar primero la MMU para determinar la dirección física de una dirección virtual dada. Sin embargo, VIVT sufre problemas de alias, donde varias direcciones virtuales diferentes pueden referirse a la misma dirección física. El resultado es que dichas direcciones se almacenarían en caché por separado a pesar de referirse a la misma memoria, causando problemas de coherencia. Aunque existen soluciones a este problema [ 31 ], no funcionan para los protocolos de coherencia estándar. Otro problema son los homónimos, donde la misma dirección virtual se asigna a varias direcciones físicas diferentes. No es posible distinguir estas asignaciones simplemente mirando el índice virtual en sí, aunque las posibles soluciones incluyen: vaciar la caché después de un cambio de contexto , forzar que los espacios de direcciones no se superpongan, etiquetar la dirección virtual con un ID de espacio de direcciones (ASID). Además, existe el problema de que las asignaciones de virtual a físico pueden cambiar, lo que requeriría vaciar las líneas de caché, ya que los VA dejarían de ser válidos. Todos estos problemas desaparecen si las etiquetas utilizan direcciones físicas (VIPT).
- Las cachés indexadas virtualmente y etiquetadas físicamente (VIPT) utilizan la dirección virtual para el índice y la dirección física en la etiqueta. La ventaja sobre PIPT es una menor latencia, ya que el conjunto de caché se puede consultar en paralelo con la traducción de la TLB; sin embargo, la etiqueta no se puede comparar hasta que la dirección física esté disponible. La ventaja sobre VIVT es que, dado que la etiqueta contiene la dirección física, la caché puede detectar homónimos. Teóricamente, VIPT requiere más bits de etiqueta porque algunos bits del índice podrían diferir entre las direcciones virtuales y físicas (por ejemplo, el bit 12 y superiores para páginas de 4 KiB) y tendrían que incluirse tanto en el índice virtual como en la etiqueta física. En la práctica, esto no supone un problema porque, para evitar problemas de coherencia, las cachés VIPT están diseñadas para no tener dichos bits de índice (por ejemplo, limitando el número total de bits para el índice y el desplazamiento de bloque a 12 para páginas de 4 KiB); esto limita el tamaño de las cachés VIPT al tamaño de página multiplicado por la asociatividad de la caché.
- En la literatura se suele afirmar que las cachés indexadas físicamente y etiquetadas virtualmente (PIVT) son inútiles e inexistentes. [ 32 ] Sin embargo, el MIPS R6000 utiliza este tipo de caché como la única implementación conocida. [ 33 ] El R6000 está implementado en lógica acoplada por emisor , una tecnología extremadamente rápida que no es adecuada para memorias grandes como una TLB . El R6000 resuelve el problema colocando la memoria TLB en una parte reservada de la caché de segundo nivel que tiene una pequeña "segmentación" TLB de alta velocidad en el chip. La caché se indexa mediante la dirección física obtenida de la segmentación TLB. Sin embargo, dado que la segmentación TLB solo traduce los bits de dirección virtual necesarios para indexar la caché y no utiliza etiquetas, pueden producirse falsos aciertos de caché, lo que se resuelve etiquetando con la dirección virtual.
La velocidad de esta recurrencia (la latencia de carga ) es crucial para el rendimiento de la CPU, por lo que la mayoría de las cachés de nivel 1 modernas están indexadas virtualmente, lo que al menos permite que la búsqueda en la TLB de la MMU se realice en paralelo con la obtención de los datos de la RAM de caché.
Sin embargo, la indexación virtual no es la mejor opción para todos los niveles de caché. El costo de gestionar los alias virtuales aumenta con el tamaño de la caché, por lo que la mayoría de las cachés de nivel 2 y superiores se indexan físicamente.
Históricamente, las cachés han utilizado direcciones tanto virtuales como físicas para las etiquetas de caché, aunque el etiquetado virtual es ahora poco común. Si la búsqueda en la TLB finaliza antes que la búsqueda en la RAM de caché, la dirección física está disponible a tiempo para la comparación de etiquetas y no es necesario el etiquetado virtual. Por lo tanto, las cachés grandes tienden a etiquetarse físicamente, y solo las cachés pequeñas de muy baja latencia se etiquetan virtualmente. En las CPU de propósito general recientes, el etiquetado virtual ha sido reemplazado por sugerencias virtuales, como se describe a continuación.
Problemas de homónimos y sinónimos
Una caché que se basa en la indexación y el etiquetado virtuales se vuelve inconsistente cuando la misma dirección virtual se asigna a diferentes direcciones físicas ( homónimos ), lo cual se puede solucionar utilizando la dirección física para el etiquetado o almacenando el identificador del espacio de direcciones en la línea de caché. Sin embargo, este último enfoque no resuelve el problema de los sinónimos , en el que varias líneas de caché terminan almacenando datos para la misma dirección física. Escribir en dichas ubicaciones puede actualizar solo una ubicación en la caché, dejando las demás con datos inconsistentes. Este problema se puede solucionar utilizando diseños de memoria que no se superpongan para diferentes espacios de direcciones, o bien, vaciando la caché (o parte de ella) cuando cambia la asignación. [ 34 ]
Etiquetas y pistas virtuales
La gran ventaja de las etiquetas virtuales es que, para las cachés asociativas, permiten que la coincidencia de etiquetas se realice antes de que se complete la traducción de virtual a física. Sin embargo, las sondas de coherencia y las desalojas presentan una dirección física para su procesamiento. El hardware debe contar con algún mecanismo para convertir las direcciones físicas en un índice de caché, generalmente almacenando tanto etiquetas físicas como virtuales. En comparación, una caché con etiquetas físicas no necesita conservar etiquetas virtuales, lo que resulta más sencillo. Cuando se elimina una asignación de virtual a física de la TLB, las entradas de caché con esas direcciones virtuales deberán vaciarse de alguna manera. Alternativamente, si se permiten entradas de caché en páginas no mapeadas por la TLB, dichas entradas deberán vaciarse cuando se modifiquen los derechos de acceso a esas páginas en la tabla de páginas.
El sistema operativo también puede garantizar que no haya alias virtuales residiendo simultáneamente en la caché. Para ello, aplica la coloración de páginas, que se describe a continuación. Algunos procesadores RISC antiguos (SPARC, RS/6000) utilizaban este método. Sin embargo, su uso ha disminuido recientemente, dado que la complejidad del hardware para detectar y eliminar alias virtuales ha aumentado, mientras que la complejidad del software y la penalización en el rendimiento que implica una coloración de páginas perfecta han aumentado.
Puede resultar útil distinguir las dos funciones de las etiquetas en una caché asociativa: se utilizan para determinar qué entrada del conjunto seleccionar y para determinar si la caché acertó o no. La segunda función siempre debe ser correcta, pero es admisible que la primera intente adivinar y, ocasionalmente, obtenga una respuesta incorrecta.
Algunos procesadores (por ejemplo, los primeros SPARC) cuentan con cachés con etiquetas virtuales y físicas. Las etiquetas virtuales se utilizan para la selección de la ruta, y las físicas para determinar si se ha producido un acierto o un fallo. Este tipo de caché ofrece la ventaja de latencia de una caché con etiquetas virtuales y la interfaz de software sencilla de una caché con etiquetas físicas. Sin embargo, conlleva el inconveniente de las etiquetas duplicadas. Además, durante el procesamiento de fallos, es necesario comprobar las rutas alternativas de la línea de caché indexada en busca de alias virtuales y eliminar cualquier coincidencia.
El área adicional (y cierta latencia) se puede mitigar manteniendo sugerencias virtuales con cada entrada de caché en lugar de etiquetas virtuales. Estas sugerencias son un subconjunto o hash de la etiqueta virtual y se utilizan para seleccionar la ruta de la caché desde la que obtener los datos y una etiqueta física. Al igual que en una caché con etiquetas virtuales, puede haber una coincidencia de sugerencia virtual pero una discrepancia de etiqueta física; en ese caso, la entrada de caché con la sugerencia coincidente debe eliminarse para que los accesos a la caché posteriores al llenado en esa dirección tengan solo una coincidencia de sugerencia. Dado que las sugerencias virtuales tienen menos bits que las etiquetas virtuales para distinguirlas entre sí, una caché con sugerencias virtuales sufre más fallos de conflicto que una caché con etiquetas virtuales.
Quizás la máxima reducción de sugerencias virtuales se encuentre en el Pentium 4 (núcleos Willamette y Northwood). En estos procesadores, la sugerencia virtual es de dos bits y la caché es asociativa de cuatro vías. En la práctica, el hardware mantiene una permutación simple entre la dirección virtual y el índice de caché, de modo que no se necesita memoria direccionable por contenido (CAM) para seleccionar la opción correcta entre las cuatro disponibles.
Página para colorear
Las cachés indexadas físicamente de gran tamaño (generalmente cachés secundarias) presentan un problema: el sistema operativo, y no la aplicación, controla qué páginas colisionan entre sí en la caché. Las diferencias en la asignación de páginas entre distintas ejecuciones del programa generan variaciones en los patrones de colisión de la caché, lo que puede provocar grandes diferencias en el rendimiento del programa. Estas diferencias pueden dificultar enormemente la obtención de una medición de tiempo consistente y repetible en una prueba de rendimiento.
Para comprender el problema, consideremos una CPU con una caché de nivel 2 de mapeo directo e indexada físicamente de 1 MiB y páginas de memoria virtual de 4 KiB. Las páginas físicas se asignan secuencialmente a ubicaciones secuenciales en la caché hasta que, después de 256 páginas, el patrón se repite. Podemos etiquetar cada página física con un color del 0 al 255 para indicar su ubicación en la caché. Las ubicaciones dentro de las páginas físicas con colores diferentes no pueden entrar en conflicto en la caché.
Los programadores que buscan aprovechar al máximo la caché pueden organizar los patrones de acceso de sus programas de manera que solo se necesite almacenar en caché 1 MiB de datos en un momento dado, evitando así fallos de capacidad. Sin embargo, también deben asegurarse de que los patrones de acceso no presenten conflictos. Una forma de abordar este problema es dividir las páginas virtuales que utiliza el programa y asignarles colores virtuales, del mismo modo que antes se asignaban colores físicos a las páginas físicas. De esta manera, los programadores pueden organizar los patrones de acceso de su código para que no se utilicen simultáneamente dos páginas con el mismo color virtual. Existe una amplia bibliografía sobre este tipo de optimizaciones (por ejemplo, la optimización de anidamiento de bucles ), proveniente principalmente de la comunidad de computación de alto rendimiento (HPC) .
El problema radica en que, si bien todas las páginas en uso en un momento dado pueden tener colores virtuales diferentes, algunas pueden tener los mismos colores físicos. De hecho, si el sistema operativo asigna páginas físicas a páginas virtuales de forma aleatoria y uniforme, es extremadamente probable que algunas páginas tengan el mismo color físico, y entonces las ubicaciones de esas páginas colisionarán en la caché (esta es la paradoja del cumpleaños ).
La solución consiste en que el sistema operativo intente asignar diferentes colores físicos a diferentes colores virtuales en las páginas, una técnica denominada coloración de página . Si bien la correspondencia real entre el color virtual y el físico es irrelevante para el rendimiento del sistema, las correspondencias extrañas son difíciles de controlar y ofrecen pocos beneficios, por lo que la mayoría de los métodos de coloración de página simplemente intentan mantener iguales los colores físicos y virtuales.
Si el sistema operativo garantiza que cada página física se asigna a un único color virtual, no existen alias virtuales y el procesador puede utilizar cachés indexadas virtualmente sin necesidad de sondeos adicionales de alias virtuales durante el manejo de errores. Como alternativa, el sistema operativo puede vaciar la caché de una página cada vez que cambia de un color virtual a otro. Como se mencionó anteriormente, este enfoque se utilizó en algunos diseños iniciales de SPARC y RS/6000.
La técnica de coloración de páginas de software se ha utilizado para particionar eficazmente la caché de último nivel (LLC) compartida en procesadores multinúcleo. [ 35 ] Intel ha adoptado esta gestión de LLC basada en el sistema operativo en procesadores multinúcleo. [ 36 ]
Jerarquía de caché en un procesador moderno

Los procesadores modernos cuentan con múltiples cachés integradas que interactúan entre sí. El funcionamiento de una caché específica puede definirse completamente mediante el tamaño de la caché, el tamaño del bloque de caché, el número de bloques en un conjunto, la política de reemplazo del conjunto de caché y la política de escritura de la caché (escritura directa o escritura diferida). [ 25 ]
Si bien todos los bloques de caché en una caché particular tienen el mismo tamaño y la misma asociatividad, las cachés de "nivel superior" (llamadas caché de nivel 1) suelen tener un menor número de bloques, un tamaño de bloque menor y menos bloques en un conjunto, pero tienen tiempos de acceso muy cortos. Las cachés de "nivel inferior" (es decir, nivel 2 e inferiores) tienen un número de bloques progresivamente mayor, un tamaño de bloque mayor, más bloques en un conjunto y tiempos de acceso relativamente más largos, pero siguen siendo mucho más rápidas que la memoria principal. [ 8 ]
La política de reemplazo de entradas de caché viene determinada por un algoritmo de caché seleccionado e implementado por los diseñadores del procesador. En algunos casos, se proporcionan varios algoritmos para diferentes tipos de cargas de trabajo.
Cajones especializados
Las CPU segmentadas acceden a la memoria desde múltiples puntos de la segmentación : búsqueda de instrucciones, traducción de direcciones virtuales a físicas y búsqueda de datos (véase la segmentación RISC clásica ). El diseño natural consiste en utilizar distintas cachés físicas para cada uno de estos puntos, de modo que ningún recurso físico tenga que ser asignado a dos puntos de la segmentación. Por lo tanto, la segmentación termina teniendo al menos tres cachés separadas (de instrucciones, TLB y de datos), cada una especializada en su función particular.
caché de víctimas
Una caché de víctimas es una caché que se utiliza para almacenar bloques expulsados de la caché de la CPU al ser reemplazada. La caché de víctimas se ubica entre la caché principal y su ruta de recarga, y almacena únicamente los bloques de datos que fueron expulsados de la caché principal. Generalmente, la caché de víctimas es totalmente asociativa y tiene como objetivo reducir el número de fallos por conflicto. Muchos programas de uso común no requieren una asignación asociativa para todos los accesos. De hecho, solo una pequeña fracción de los accesos a memoria del programa requiere una alta asociatividad. La caché de víctimas aprovecha esta propiedad proporcionando una alta asociatividad solo a estos accesos. Fue introducida por Norman Jouppi de DEC en 1990. [ 37 ]
La variante Crystalwell [ 38 ] de los procesadores Haswell de Intel introdujo una caché eDRAM de nivel 4 de 128 MiB en el paquete que funciona como caché víctima de la caché de nivel 3 de los procesadores. [ 39 ] En la microarquitectura Skylake, la caché de nivel 4 ya no funciona como caché víctima. [ 40 ]
caché de rastreo
Uno de los ejemplos más extremos de especialización de caché es la caché de trazas (también conocida como caché de trazas de ejecución ) que se encuentra en los microprocesadores Intel Pentium 4. Una caché de trazas es un mecanismo para aumentar el ancho de banda de búsqueda de instrucciones y disminuir el consumo de energía (en el caso del Pentium 4) mediante el almacenamiento de trazas de instrucciones que ya han sido buscadas y decodificadas. [ 41 ]
Una caché de trazas almacena instrucciones después de haber sido decodificadas o al ser retiradas. Generalmente, las instrucciones se agregan a las cachés de trazas en grupos que representan bloques básicos individuales o trazas de instrucciones dinámicas. La caché de trazas del Pentium 4 almacena microoperaciones resultantes de la decodificación de instrucciones x86, proporcionando también la funcionalidad de una caché de microoperaciones. Gracias a esto, la próxima vez que se necesite una instrucción, no es necesario decodificarla nuevamente en microoperaciones. [ 42 ] : 63–68
Escritura en caché coalescente (WCC)
La caché de coalescencia de escritura [ 43 ] es una caché especial que forma parte de la caché L2 en la microarquitectura Bulldozer de AMD . Las escrituras de ambas cachés L1D del módulo pasan por la WCC, donde se almacenan en búfer y se coalescen. La función de la WCC es reducir el número de escrituras en la caché L2.
Caché de microoperaciones (μop o uop)
Una caché de microoperaciones ( caché μop , caché uop o UC ) [ 44 ] es una caché especializada que almacena microoperaciones de instrucciones decodificadas, recibidas directamente de los decodificadores de instrucciones o de la caché de instrucciones. Cuando se necesita decodificar una instrucción, se consulta la caché μop para obtener su forma decodificada, la cual se reutiliza si está almacenada en caché; si no está disponible, la instrucción se decodifica y luego se almacena en caché.
Uno de los primeros trabajos que describen la caché de microoperaciones como un frontend alternativo para la familia de procesadores Intel P6 es el artículo de 2001 "Caché de microoperaciones: un frontend consciente del consumo de energía para ISA de longitud de instrucción variable" . [ 45 ] Posteriormente, Intel incluyó cachés de microoperaciones en sus procesadores Sandy Bridge y en microarquitecturas sucesivas como Ivy Bridge y Haswell . [ 42 ] : 121–123 [ 46 ] AMD implementó una caché de microoperaciones en su microarquitectura Zen . [ 47 ]
La obtención de instrucciones predecodificadas completas elimina la necesidad de decodificar repetidamente instrucciones complejas de longitud variable en microoperaciones más simples de longitud fija, y simplifica el proceso de predicción, obtención, rotación y alineación de las instrucciones obtenidas. Una caché de microoperaciones descarga eficazmente el hardware de obtención y decodificación, lo que reduce el consumo de energía y mejora el suministro de microoperaciones decodificadas al frontend. La caché de microoperaciones también aumenta el rendimiento al entregar de forma más consistente las microoperaciones decodificadas al backend y eliminar varios cuellos de botella en la lógica de obtención y decodificación de la CPU. [ 45 ] [ 46 ]
Una caché de microoperaciones (μop) tiene muchas similitudes con una caché de trazas, aunque la caché de microoperaciones es mucho más simple, lo que proporciona una mayor eficiencia energética; esto la hace más adecuada para implementaciones en dispositivos alimentados por batería. La principal desventaja de la caché de trazas, que conlleva su ineficiencia energética, es la complejidad del hardware necesaria para su heurística de decisión sobre el almacenamiento en caché y la reutilización de trazas de instrucciones creadas dinámicamente. [ 48 ]
caché de instrucciones de destino de salto
Una caché de destino de rama o caché de instrucciones de destino de rama , nombre utilizado en los microprocesadores ARM , [ 49 ] es una caché especializada que almacena las primeras instrucciones en el destino de una rama ejecutada. Esto lo utilizan los procesadores de bajo consumo que no necesitan una caché de instrucciones normal porque el sistema de memoria es capaz de entregar instrucciones con la suficiente rapidez para satisfacer las necesidades de la CPU sin ella. Sin embargo, esto solo se aplica a instrucciones consecutivas en secuencia; aún se requieren varios ciclos de latencia para reiniciar la búsqueda de instrucciones en una nueva dirección, lo que provoca algunos ciclos de burbuja de tubería después de una transferencia de control. Una caché de destino de rama proporciona instrucciones para esos pocos ciclos, evitando un retraso después de la mayoría de las ramas ejecutadas.
Esto permite un funcionamiento a máxima velocidad con una caché mucho más pequeña que una caché de instrucciones tradicional de tiempo completo.
Caché inteligente
La caché inteligente es un método de almacenamiento en caché de nivel 2 o nivel 3 para múltiples núcleos de ejecución, desarrollado por Intel .
Smart Cache comparte la memoria caché real entre los núcleos de un procesador multinúcleo . En comparación con una caché dedicada por núcleo, la tasa general de fallos de caché disminuye cuando los núcleos no requieren partes iguales del espacio de caché. En consecuencia, un solo núcleo puede usar la caché completa de nivel 2 o nivel 3 mientras los demás núcleos están inactivos. [ 50 ] Además, la caché compartida hace que sea más rápido compartir la memoria entre diferentes núcleos de ejecución. [ 51 ]
Cajones multinivel
Otro problema radica en la disyuntiva fundamental entre la latencia de la caché y la tasa de aciertos. Las cachés más grandes ofrecen mejores tasas de aciertos, pero mayor latencia. Para solucionar este problema, muchos ordenadores utilizan múltiples niveles de caché, con cachés pequeñas y rápidas respaldadas por cachés más grandes y lentas. Generalmente, las cachés multinivel funcionan comprobando primero la caché más rápida pero más pequeña, la de nivel 1 ( L1 ); si encuentra el resultado, el procesador continúa a alta velocidad. Si no encuentra el resultado, se comprueba la caché de nivel 2 ( L2 ), más lenta pero de mayor tamaño , y así sucesivamente, antes de acceder a la memoria externa.
A medida que la diferencia de latencia entre la memoria principal y la caché más rápida se ha vuelto mayor, algunos procesadores han comenzado a utilizar hasta tres niveles de caché en el chip. Los diseños sensibles al precio usaron esto para llevar toda la jerarquía de caché al chip, pero en la década de 2010 algunos de los diseños de más alto rendimiento volvieron a tener grandes cachés fuera del chip, que a menudo se implementan en eDRAM y se montan en un módulo multichip , como un cuarto nivel de caché. En casos raros, como en la CPU de mainframe IBM z15 (2019), todos los niveles hasta L1 están implementados por eDRAM, reemplazando por completo a SRAM (para caché, SRAM todavía se usa para registros ). La serie de silicio de Apple basada en ARM , comenzando con el A14 y M1 , tiene una caché L1i de 192 KiB para cada uno de los núcleos de alto rendimiento, una cantidad inusualmente grande; sin embargo, los núcleos de alta eficiencia solo tienen 128 KiB. Desde entonces, otros procesadores como Lunar Lake de Intel y Oryon de Qualcomm también han implementado tamaños de caché L1i similares.
Las ventajas de las cachés L3 y L4 dependen de los patrones de acceso de la aplicación. Algunos ejemplos de productos que incorporan cachés L3 y L4 son los siguientes:
- El Alpha 21164 (1995) tenía una caché L3 externa de 1 a 64 MiB.
- El procesador AMD K6-III (1999) tenía una caché L3 integrada en la placa base.
- El IBM POWER4 (2001) disponía de cachés L3 externas de 32 MiB por procesador, compartidas entre varios procesadores.
- El Itanium 2 (2003) tenía una caché unificada de nivel 3 (L3) de 6 MiB integrada en el chip; el módulo MX 2 del Itanium 2 (2003) incorporaba dos procesadores Itanium 2 junto con una caché L4 compartida de 64 MiB en un módulo multichip que era compatible a nivel de pines con un procesador Madison.
- El producto Xeon MP de Intel, cuyo nombre en clave era "Tulsa" (2006), cuenta con 16 MiB de caché L3 integrada, compartida entre dos núcleos del procesador.
- AMD Phenom (2007) con 2 MiB de caché L3.
- El AMD Phenom II (2008) cuenta con hasta 6 MiB de caché L3 unificada integrada en el chip.
- El procesador Intel Core i7 (2008) cuenta con una caché L3 unificada integrada de 8 MiB que es inclusiva y compartida por todos los núcleos.
- Las CPU Intel Haswell con gráficos integrados Intel Iris Pro tienen 128 MiB de eDRAM que actúan esencialmente como una caché L4. [ 52 ]
Finalmente, en el otro extremo de la jerarquía de memoria, el archivo de registros de la CPU puede considerarse la caché más pequeña y rápida del sistema, con la particularidad de que su programación se realiza mediante software, normalmente por un compilador, que asigna registros para almacenar valores recuperados de la memoria principal, por ejemplo, para la optimización de bucles anidados . Sin embargo, gracias al cambio de nombre de registros , la mayoría de las asignaciones de registros del compilador se reasignan dinámicamente por hardware en tiempo de ejecución a un banco de registros, lo que permite a la CPU romper dependencias de datos falsas y, por lo tanto, mitigar los riesgos de la segmentación.
Los archivos de registro a veces también tienen jerarquía: la Cray-1 (alrededor de 1976) tenía ocho registros de direcciones "A" y ocho registros de datos escalares "S" que generalmente eran utilizables. También había un conjunto de 64 registros de direcciones "B" y 64 registros de datos escalares "T" cuyo acceso era más lento, pero más rápido que la memoria principal. Los registros "B" y "T" se incluyeron porque la Cray-1 no tenía caché de datos. (Sin embargo, la Cray-1 sí tenía caché de instrucciones).
Chips multinúcleo
Al considerar un chip con múltiples núcleos , surge la pregunta de si las cachés deben ser compartidas o locales para cada núcleo. Implementar una caché compartida inevitablemente aumenta el cableado y la complejidad. Sin embargo, tener una caché por chip , en lugar de por núcleo , reduce considerablemente el espacio necesario, lo que permite incluir una caché de mayor tamaño.
Por lo general, compartir la caché L1 no es deseable porque el aumento resultante en la latencia haría que cada núcleo funcionara considerablemente más lento que un chip de un solo núcleo. Sin embargo, para la caché de nivel más alto (generalmente L3, la última llamada antes de acceder a la memoria), tener una caché global es deseable por varias razones, como permitir que un solo núcleo use toda la caché, reducir la redundancia de datos al permitir que diferentes procesos o hilos compartan datos en caché y reducir la complejidad de los protocolos de coherencia de caché utilizados. [ 53 ] Por ejemplo, un chip de ocho núcleos con tres niveles puede incluir una caché L1 para cada núcleo, una caché L2 intermedia para cada par de núcleos y una caché L3 compartida entre todos los núcleos.
Una caché de nivel superior compartida (generalmente L3, llamada antes de acceder a la memoria) se suele denominar caché de último nivel (LLC). [ 54 ] Se utilizan técnicas adicionales para aumentar el nivel de paralelismo cuando la LLC se comparte entre varios núcleos, incluyendo dividirla en múltiples partes que direccionan ciertos rangos de direcciones de memoria y pueden ser accedidas de forma independiente. [ 8 ] [ 55 ]
Separados versus unificados
En una estructura de caché separada, las instrucciones y los datos se almacenan en caché por separado, lo que significa que una línea de caché se utiliza para almacenar en caché instrucciones o datos, pero no ambos; se han demostrado varios beneficios con búferes de traducción de instrucciones y datos separados . [ 56 ] En una estructura unificada, esta restricción no está presente y las líneas de caché se pueden utilizar para almacenar en caché tanto instrucciones como datos.
Exclusivo versus inclusivo
Las cachés multinivel introducen nuevas decisiones de diseño. Por ejemplo, en algunos procesadores, todos los datos en la caché L1 también deben estar en algún lugar de la caché L2. Estas cachés se denominan estrictamente inclusivas . Otros procesadores (como el AMD Athlon ) tienen cachés exclusivas : se garantiza que los datos estén como máximo en una de las cachés L1 y L2, nunca en ambas. Otros procesadores (como el Intel Pentium II , III y 4 ) no requieren que los datos en la caché L1 también residan en la caché L2, aunque a menudo lo hacen. No existe un nombre universalmente aceptado para esta política intermedia; [ 57 ] [ 58 ] dos nombres comunes son "no exclusiva" y "parcialmente inclusiva".
La ventaja de las cachés exclusivas es que almacenan más datos. Esta ventaja es mayor cuando la caché L1 exclusiva es comparable a la caché L2, y disminuye si la caché L2 es mucho mayor que la caché L1. Cuando la caché L1 falla y la L2 acierta en un acceso, la línea de caché acertada en la L2 se intercambia con una línea en la L1. Este intercambio requiere bastante más trabajo que simplemente copiar una línea de la L2 a la L1, que es lo que hace una caché inclusiva. [ 58 ]
Una ventaja de las cachés estrictamente inclusivas es que, cuando dispositivos externos u otros procesadores en un sistema multiprocesador desean eliminar una línea de caché del procesador, solo necesitan que este verifique la caché L2. En jerarquías de caché que no imponen la inclusión, también se debe verificar la caché L1. Como desventaja, existe una correlación entre las asociatividades de las cachés L1 y L2: si la caché L2 no tiene al menos tantas vías como todas las cachés L1 juntas, la asociatividad efectiva de las cachés L1 se ve restringida. Otra desventaja de la caché inclusiva es que, cada vez que se produce una expulsión en la caché L2, las líneas (posiblemente) correspondientes en la L1 también deben ser expulsadas para mantener la inclusividad. Esto supone una cantidad considerable de trabajo y resultaría en una mayor tasa de fallos de la caché L1. [ 58 ]
Otra ventaja de las cachés inclusivas es que la caché más grande puede usar líneas de caché más grandes, lo que reduce el tamaño de las etiquetas de la caché secundaria. (Las cachés exclusivas requieren que ambas cachés tengan líneas de caché del mismo tamaño, de modo que las líneas de caché se puedan intercambiar en caso de fallo de caché en L1 y acierto en L2). Si la caché secundaria es un orden de magnitud mayor que la primaria, y los datos de la caché son un orden de magnitud mayores que las etiquetas de caché, esta área de etiquetas ahorrada puede ser comparable al área incremental necesaria para almacenar los datos de la caché L1 en la L2. [ 59 ]
Memoria de bloc de notas
La memoria de acceso rápido (SPM, por sus siglas en inglés), también conocida como memoria de acceso rápido, RAM de acceso rápido o almacenamiento local en la terminología informática, es una memoria interna de alta velocidad que se utiliza para el almacenamiento temporal de cálculos, datos y otros trabajos en curso.
Ejemplo: el K8
Para ilustrar tanto la especialización como el almacenamiento en caché multinivel, aquí está la jerarquía de caché del núcleo K8 en la CPU AMD Athlon 64. [ 60 ]

El K8 tiene cuatro cachés especializadas: una caché de instrucciones, una TLB de instrucciones , una TLB de datos y una caché de datos. Cada una de estas cachés está especializada:
- La caché de instrucciones guarda copias de líneas de memoria de 64 bytes y recupera 16 bytes en cada ciclo. Cada byte en esta caché se almacena en diez bits en lugar de ocho, y los bits adicionales marcan los límites de las instrucciones (esto es un ejemplo de predecodificación). La caché solo cuenta con protección de paridad en lugar de ECC , ya que la paridad es menor y cualquier dato dañado puede reemplazarse con datos nuevos recuperados de la memoria (que siempre tiene una copia actualizada de las instrucciones).
- La TLB de instrucciones almacena copias de las entradas de la tabla de páginas (PTE). La dirección virtual de cada instrucción, traducida a una dirección física a través de esta TLB, se encuentra en memoria en cuatro u ocho bytes. Debido a que el procesador K8 tiene un tamaño de página variable, cada TLB se divide en dos secciones: una para almacenar PTE que asignan páginas de 4 KiB y otra para almacenar PTE que asignan páginas de 4 MiB o 2 MiB. Esta división simplifica el circuito de coincidencia totalmente asociativo en cada sección. El sistema operativo asigna diferentes secciones del espacio de direcciones virtuales con PTE de distinto tamaño.
- La TLB de datos tiene dos copias que almacenan entradas idénticas. Estas dos copias permiten dos accesos a datos por ciclo para traducir direcciones virtuales a direcciones físicas. Al igual que la TLB de instrucciones, esta TLB se divide en dos tipos de entradas.
- La caché de datos almacena copias de líneas de memoria de 64 bytes. Está dividida en 8 bancos (cada uno con capacidad para 8 KiB de datos) y puede recuperar dos datos de 8 bytes por ciclo, siempre que se encuentren en bancos diferentes. Existen dos copias de las etiquetas, ya que cada línea de 64 bytes se distribuye entre los ocho bancos. Cada copia de la etiqueta gestiona uno de los dos accesos por ciclo.
El K8 también cuenta con cachés de varios niveles. Dispone de TLB de instrucciones y datos de segundo nivel, que almacenan únicamente PTE que mapean 4 KiB. Tanto las cachés de instrucciones y datos como las distintas TLB pueden llenarse desde la gran caché L2 unificada . Esta caché es exclusiva de las cachés L1 de instrucciones y datos, lo que significa que cualquier línea de 8 bytes solo puede estar en una de ellas: la caché de instrucciones L1, la caché de datos L1 o la caché L2. Sin embargo, es posible que una línea en la caché de datos tenga un PTE que también se encuentre en una de las TLB; el sistema operativo se encarga de mantener la coherencia de las TLB vaciando partes de ellas cuando se actualizan las tablas de páginas en memoria.
El K8 también almacena en caché información que nunca se guarda en la memoria: información de predicción. Estas cachés no se muestran en el diagrama anterior. Como es habitual en este tipo de CPU, el K8 cuenta con una predicción de bifurcaciones bastante compleja , con tablas que ayudan a predecir si se toman las bifurcaciones y otras que predicen los destinos de las bifurcaciones y los saltos. Parte de esta información está asociada a las instrucciones, tanto en la caché de instrucciones de nivel 1 como en la caché secundaria unificada.
El K8 utiliza un ingenioso método para almacenar información de predicción junto con las instrucciones en la caché secundaria. Las líneas de la caché secundaria están protegidas contra la corrupción accidental de datos (por ejemplo, por el impacto de una partícula alfa ) mediante ECC o paridad , según si dichas líneas fueron expulsadas de las cachés primarias de datos o de instrucciones. Dado que el código de paridad requiere menos bits que el código ECC, las líneas de la caché de instrucciones disponen de algunos bits libres. Estos bits se utilizan para almacenar en caché la información de predicción de bifurcaciones asociada a dichas instrucciones. El resultado es que el predictor de bifurcaciones dispone de una tabla de historial efectiva mayor y, por lo tanto, ofrece una mayor precisión.
Más jerarquías
Otros procesadores tienen otros tipos de predictores (por ejemplo, el predictor de derivación de almacenamiento a carga en el DEC Alpha 21264 ).
Estos predictores funcionan como cachés, ya que almacenan información cuyo cálculo es costoso. Parte de la terminología utilizada al hablar de predictores es la misma que la de las cachés (se habla de un acierto en un predictor de bifurcación), pero generalmente no se considera que los predictores formen parte de la jerarquía de cachés.
El K8 mantiene la coherencia de las cachés de instrucciones y datos a nivel de hardware, lo que significa que una instrucción que se almacena inmediatamente después de la instrucción de almacenamiento modificará dicha instrucción. Otros procesadores, como los de las familias Alpha y MIPS, han dependido del software para mantener la coherencia de la caché de instrucciones. No se garantiza que las instrucciones de almacenamiento aparezcan en el flujo de instrucciones hasta que un programa llame a una función del sistema operativo para asegurar la coherencia.
Etiqueta RAM

En ingeniería informática, una etiqueta RAM se utiliza para especificar cuál de las posibles ubicaciones de memoria está actualmente almacenada en una caché de CPU. [ 61 ] [ 62 ] Para un diseño simple de mapeo directo, se puede utilizar SRAM rápida. Las cachés asociativas superiores suelen emplear memoria direccionable por contenido .
Implementación
Las lecturas de caché son la operación más común de la CPU que requiere más de un ciclo. El tiempo de ejecución del programa suele ser muy sensible a la latencia de un acierto en la caché de datos de nivel 1. Se invierte mucho esfuerzo de diseño, y a menudo energía y área de silicio, para que las cachés sean lo más rápidas posible.
La caché más sencilla es una caché de mapeo directo con indexación virtual. La dirección virtual se calcula con un sumador, se extrae la parte relevante de la dirección y se utiliza para indexar una SRAM, que devuelve los datos cargados. Los datos se alinean byte a byte en un desplazador de bytes y, desde allí, se pasa a la siguiente operación. No es necesario comprobar las etiquetas en el bucle interno ; de hecho, ni siquiera es necesario leerlas. Más adelante en la tubería, pero antes de que se complete la instrucción de carga, se debe leer la etiqueta de los datos cargados y compararla con la dirección virtual para asegurar que se haya producido un acierto de caché. En caso de fallo, la caché se actualiza con la línea de caché solicitada y se reinicia la tubería.
Una caché asociativa es más compleja, ya que se debe leer algún tipo de etiqueta para determinar qué entrada de la caché seleccionar. Una caché de nivel 1 asociativa de N vías suele leer todas las N etiquetas posibles y los N datos en paralelo, y luego elige los datos asociados con la etiqueta correspondiente. Las cachés de nivel 2 a veces ahorran energía leyendo primero las etiquetas, de modo que solo se lee un elemento de datos de la SRAM de datos.

El diagrama adjunto tiene como objetivo aclarar la forma en que se utilizan los distintos campos de la dirección. El bit 31 de la dirección es el más significativo, mientras que el bit 0 es el menos significativo. El diagrama muestra las memorias SRAM, la indexación y la multiplexación para una caché de 4 KiB, asociativa por conjuntos de 2 vías, virtualmente indexada y virtualmente etiquetada, con líneas de 64 bytes (B), un ancho de lectura de 32 bits y una dirección virtual de 32 bits.
Dado que la caché tiene una capacidad de 4 KiB y 64 líneas B, solo hay 64 líneas en la caché, y leemos dos a la vez desde una SRAM de etiquetas que tiene 32 filas, cada una con un par de etiquetas de 21 bits. Si bien se podría usar cualquier función de los bits de dirección virtual del 31 al 6 para indexar las SRAM de etiquetas y datos, lo más sencillo es usar los bits menos significativos.
De manera similar, debido a que la caché es de 4 KiB y tiene una ruta de lectura de 4 bytes, y lee en dos direcciones para cada acceso, la SRAM de datos tiene 512 filas de 8 bytes de ancho.
Una caché más moderna podría tener 16 KiB, ser asociativa por conjuntos de 4 vías, estar indexada virtualmente, tener sugerencias virtuales y estar etiquetada físicamente, con líneas de 32 bytes, un ancho de lectura de 32 bits y direcciones físicas de 36 bits. La recurrencia de la ruta de lectura para dicha caché es muy similar a la ruta anterior. En lugar de etiquetas, se leen sugerencias virtuales y se comparan con un subconjunto de la dirección virtual. Más adelante en la cadena de procesamiento, la TLB traduce la dirección virtual a una dirección física y se lee la etiqueta física (solo una, ya que la sugerencia virtual indica en qué dirección de la caché leer). Finalmente, la dirección física se compara con la etiqueta física para determinar si se ha producido un acierto.
Algunos diseños SPARC han mejorado la velocidad de sus cachés L1 reduciendo ligeramente el retardo de las puertas lógicas al integrar el sumador de direcciones virtuales en los decodificadores SRAM.
Historia
La historia temprana de la tecnología de caché está estrechamente ligada a la invención y el uso de la memoria virtual. Debido a la escasez y el costo de las memorias semiconductoras, las primeras computadoras centrales de la década de 1960 utilizaban una jerarquía compleja de memoria física, mapeada en un espacio de memoria virtual plano utilizado por los programas. Las tecnologías de memoria abarcaban semiconductores, núcleos magnéticos, tambores y discos. La memoria virtual vista y utilizada por los programas era plana, y el almacenamiento en caché se utilizaba para obtener datos e instrucciones en la memoria más rápida antes del acceso del procesador. Se realizaron estudios exhaustivos para optimizar los tamaños de caché. Se descubrió que los valores óptimos dependían en gran medida del lenguaje de programación utilizado: Algol requería el tamaño de caché más pequeño, mientras que Fortran y Cobol requerían el más grande.
En los inicios de la tecnología de microcomputadoras, el acceso a la memoria era solo ligeramente más lento que el acceso a los registros . Pero desde la década de 1980 [ 63 ] la brecha de rendimiento entre el procesador y la memoria ha ido en aumento. Los microprocesadores han avanzado mucho más rápido que la memoria, especialmente en términos de su frecuencia de operación , por lo que la memoria se convirtió en un cuello de botella de rendimiento. Si bien era técnicamente posible tener toda la memoria principal tan rápida como la CPU, se ha optado por una vía más viable económicamente: usar mucha memoria de baja velocidad, pero también introducir una pequeña memoria caché de alta velocidad para mitigar la brecha de rendimiento. Esto proporcionó un orden de magnitud más de capacidad —por el mismo precio— con solo una ligera reducción del rendimiento combinado.
Primeras implementaciones de TLB
Los primeros usos documentados de una TLB fueron en el GE 645 [ 64 ] y el IBM 360/67 , [ 65 ] ambos usaban una memoria asociativa como TLB.
Caché de primera instrucción
El primer uso documentado de una caché de instrucciones fue en el CDC 6600. [ 66 ]
Primera caché de datos
El primer uso documentado de una caché de datos fue en el IBM System/360 Modelo 85. [ 67 ]
En microprocesadores de 68k
El 68010 , lanzado en 1982, cuenta con un "modo de bucle" que puede considerarse una pequeña caché de instrucciones especial que acelera los bucles compuestos por solo dos instrucciones. El 68020 , lanzado en 1984, lo reemplazó con una caché de instrucciones típica de 256 bytes, siendo el primer procesador de la serie 68k en incorporar memoria caché integrada.
El 68030 , lanzado en 1987, es básicamente un núcleo 68020 con una caché de datos adicional de 256 bytes, una unidad de gestión de memoria (MMU) integrada , una reducción del proceso de fabricación y un modo ráfaga añadido para las cachés.
El 68040 , lanzado en 1990, tiene cachés de instrucciones y de datos separadas, de cuatro kilobytes cada una.
El 68060 , lanzado en 1994, tiene lo siguiente: caché de datos de 8 KiB (asociativa de cuatro vías), caché de instrucciones de 8 KiB (asociativa de cuatro vías), búfer de instrucciones FIFO de 96 bytes, caché de bifurcación de 256 entradas y búfer MMU de caché de traducción de direcciones de 64 entradas (asociativa de cuatro vías).
En microprocesadores x86

Cuando los microprocesadores x86 alcanzaron frecuencias de reloj de 20 MHz o más en el 386 , se empezó a incorporar una pequeña cantidad de memoria caché rápida en los sistemas para mejorar el rendimiento. Esto se debía a que la DRAM utilizada para la memoria principal tenía una latencia significativa, de hasta 120 ns, así como ciclos de actualización. La caché se construyó con celdas de memoria SRAM , más caras pero mucho más rápidas , que en aquel entonces tenían latencias de entre 10 y 25 ns. Las primeras cachés eran externas al procesador y normalmente se ubicaban en la placa base en forma de ocho o nueve dispositivos DIP colocados en zócalos para habilitar la caché como una característica opcional o de actualización.
Algunas versiones del procesador Intel 386 podían admitir entre 16 y 256 KiB de caché externa.
Con el procesador 486 , se integró una caché de 8 KiB directamente en el chip de la CPU. Esta caché se denominó caché de nivel 1 o L1 para diferenciarla de la caché de nivel 2 (L2) en la placa base, que era más lenta. Estas cachés en la placa base eran mucho más grandes, siendo el tamaño más común de 256 KiB. Algunas placas base contenían zócalos para la tarjeta hija Intel 485 Turbocache , que tenía 64 o 128 Kbytes de memoria caché. [ 68 ] [ 69 ] La popularidad de la caché en la placa base continuó durante la era del Pentium MMX , pero quedó obsoleta con la introducción de la SDRAM y la creciente disparidad entre las frecuencias de reloj del bus y las de la CPU, lo que provocó que la caché en la placa base fuera solo ligeramente más rápida que la memoria principal.
El siguiente avance en la implementación de la caché en los microprocesadores x86 comenzó con el Pentium Pro , que integró la caché secundaria en el mismo encapsulado que el microprocesador, funcionando a la misma frecuencia que este.
Las cachés integradas en la placa base gozaron de gran popularidad gracias a los procesadores AMD K6-2 y AMD K6-III , que aún utilizaban el Socket 7 , empleado anteriormente por Intel con cachés integradas. El K6-III incluía una caché L2 integrada de 256 KiB y aprovechaba la caché integrada como caché de tercer nivel, denominada L3 ( se fabricaron placas base con hasta 2 MiB de caché integrada). Tras la obsolescencia del Socket 7, las cachés integradas en la placa base desaparecieron de los sistemas x86.
Las cachés de tres niveles se volvieron a utilizar por primera vez con la introducción del Intel Xeon MP "Foster Core" [ 70 ] , donde la caché L3 se añadió al chip de la CPU. Se hizo común que el tamaño total de la caché fuera cada vez mayor en las nuevas generaciones de procesadores, y recientemente (a partir de 2011) no es raro encontrar tamaños de caché de nivel 3 de decenas de megabytes. [ 71 ]
Intel introdujo una caché de nivel 4 en el paquete con la microarquitectura Haswell . Las CPU Crystalwell [ 38 ] Haswell, equipadas con la variante GT3e de los gráficos integrados Iris Pro de Intel, cuentan efectivamente con 128 MiB de DRAM integrada ( eDRAM ) en el mismo paquete. Esta caché L4 se comparte dinámicamente entre la GPU en el chip y la CPU, y sirve como caché víctima para la caché L3 de la CPU. [ 39 ]
En microprocesadores ARM
La CPU Apple M1 cuenta con 128 o 192 KiB de caché de instrucciones L1 para cada núcleo (importante para la latencia y el rendimiento de un solo hilo), según el tipo de núcleo. Esta es una caché L1 inusualmente grande para cualquier tipo de CPU (no solo para una computadora portátil); el tamaño total de la memoria caché no es inusualmente grande (el total es más importante para el rendimiento) para una computadora portátil, y en las computadoras centrales de IBM se encuentran disponibles tamaños totales mucho mayores (por ejemplo, L3 o L4).
Investigación actual
Los primeros diseños de caché se centraban exclusivamente en el coste directo de la caché y la RAM , así como en la velocidad media de ejecución. Los diseños de caché más recientes también consideran la eficiencia energética , la tolerancia a fallos y otros objetivos. [ 72 ] [ 73 ]
Hay varias herramientas disponibles para los arquitectos de computadoras que ayudan a explorar las compensaciones entre el tiempo de ciclo de la caché, la energía y el área; el simulador de caché CACTI [ 74 ] y el simulador de conjunto de instrucciones SimpleScalar son dos opciones de código abierto.
Caché multipuerto
Una caché multipuerto es aquella que puede atender varias solicitudes simultáneamente. Al acceder a una caché tradicional, normalmente se utiliza una única dirección de memoria, mientras que en una caché multipuerto se pueden solicitar N direcciones a la vez , donde N es el número de puertos conectados entre el procesador y la caché. La ventaja de esto es que un procesador segmentado puede acceder a la memoria desde diferentes fases de su segmentación. Otra ventaja es que permite el concepto de procesadores superescalares mediante distintos niveles de caché.
Véase también
- Predictor de ramificaciones
- Caché (informática)
- Algoritmos de caché
- Coherencia de caché
- Instrucciones de control de caché
- Jerarquía de caché
- Políticas de ubicación de caché
- precarga de caché
- Dinero (simulador de caché)
- Unidad de instrucciones
- Localidad de referencia
- Memorización
- Jerarquía de memoria
- Microoperación
- asignación sin escritura
- Memoria RAM del bloc de notas
- decodificador con direccionamiento por suma
- Búfer de escritura
Notas
Referencias
- ↑ Torres, Gabriel (12 de septiembre de 2007). "Cómo funciona la memoria caché" .
- ↑ Su, Chao; Zeng, Qingkai (10 de junio de 2021). Nicopolitidis, Petros (ed.). "Estudio de los ataques de canal lateral basados en la caché de la CPU: análisis sistemático, modelos de seguridad y contramedidas" . Security and Communication Networks . 2021 : 1–15 . doi : 10.1155/2021/5559552 . ISSN 1939-0122 .
- ↑ Landy, Barry (noviembre de 2012). "Atlas 2 en el Laboratorio Matemático de Cambridge (y Aldermaston y el Centro CAD)" .
En Cambridge se desarrollaron dos memorias de diodo túnel; una, que funcionaba muy bien, aceleraba la obtención de operandos, y la otra estaba destinada a acelerar la obtención de instrucciones. La idea era que la mayoría de las instrucciones se obedecen en secuencia, por lo que cuando se obtenía una instrucción, esa palabra se colocaba en la memoria esclava en la ubicación dada por la dirección de obtención módulo 32; los bits restantes de la dirección de obtención también se almacenaban. Si la palabra deseada estaba en la memoria esclava, se leía desde allí en lugar de la memoria principal. Esto proporcionaría una gran aceleración para bucles de instrucciones de hasta 32 instrucciones de longitud, y un efecto reducido para bucles de hasta 64 palabras.
- ↑ "Características funcionales del IBM System/360 Modelo 85" (PDF) . IBM . Junio de 1968. A22-6916-1.
- ↑ Liptay, John S. (marzo de 1968). "Aspectos estructurales del modelo System/360 85 - Parte II La caché" (PDF) . IBM Systems Journal . 7 (1): 15– 21. doi : 10.1147/sj.71.0015 .
- ↑ Smith, Alan Jay (septiembre de 1982). "Memorias caché" (PDF) . Computing Surveys . 14 (3): 473– 530. doi : 10.1145/356887.356892 . S2CID 6023466 .
- ↑ "Modificar la arquitectura de las computadoras es una forma de aumentar el rendimiento, sugieren investigadores de IBM". Electronics . 49 (25): 30–31 . Diciembre de 1976.
- 1 2 3 4 Hennessy, John L.; Patterson, David A. (2011). Arquitectura de computadoras: un enfoque cuantitativo . Elsevier. pág. B-9. ISBN 978-0-12-383872-8.
- ↑ White, Bill; De Leon, Cecilia A.; et al. (marzo de 2016). "Introducción técnica a IBM z13 e IBM z13s" (PDF) . IBM. pág. 20.
- ↑ "Hoja técnica del producto: Acelerando la infraestructura de red 5G, desde el núcleo hasta el borde" . Sala de prensa de Intel (Comunicado de prensa). Intel Corporation. 25 de febrero de 2020. Consultado el 18 de abril de 2024.
Caché L1 de 32 KB/núcleo, caché L2 de 4,5 MB por clúster de 4 núcleos y caché LLC compartida de hasta 15 MB.
- ↑ Smith, Ryan. "Intel lanza el Atom P5900: un Atom de 10 nm para redes de acceso de radio" . AnandTech . Archivado del original el 24 de febrero de 2020. Consultado el 12 de abril de 2020 .
- ↑ "Diseño de caché" (PDF) . ucsd.edu . 2010-12-02. pp. 10–15 . Consultado el 2023-01-29 .
- ↑ Megalingam, Rajesh Kannan; Deepu, KB; Joseph, Iype P.; Vikram, Vandana (2009). Diseño de caché asociativa de conjuntos en fase para un menor consumo de energía . 2009 2.ª Conferencia Internacional IEEE sobre Ciencias de la Computación y Tecnologías de la Información. págs. 551–556 . doi : 10.1109/ICCSIT.2009.5234663 . ISBN 978-1-4244-4519-6. S2CID 18236635 .
- ↑ Jahagirdar, Sanjeev; George, Varghese; Sodhi, Inder; Wells, Ryan (2012). "Gestión de energía de la microarquitectura Intel Core de tercera generación, anteriormente conocida como Ivy Bridge" (PDF) . hotchips.org . pág. 18. Archivado del original (PDF) el 29 de julio de 2020. Consultado el 16 de diciembre de 2015 .
- 1 2 Seznec, André (1993). "Un caso para cachés asociativas sesgadas bidireccionales" . ACM SIGARCH Computer Architecture News . 21 (2): 169– 178. doi : 10.1145/173682.165152 .
- 1 2 Kozyrakis, C. "Lección 3: Técnicas avanzadas de almacenamiento en caché" (PDF) . Archivado del original (PDF) el 7 de septiembre de 2012.
- ↑ "Microarquitectura" .
Se ha demostrado que las cachés asociativas sesgadas tienen dos ventajas principales sobre las cachés asociativas de conjuntos convencionales.
- 1 2 Zhang, Chenxi; Zhang, Xiaodong; Yan, Yong (septiembre-octubre de 1997). "Dos esquemas de caché rápidos y de alta asociatividad". IEEE Micro . 17 (5): 40– 49. Bibcode : 1997IMicr..17e..40C . doi : 10.1109/40.621212 .
- ↑ "Guía del programador de la serie ARM Cortex-R" . developer.arm.com . 2014. Consultado el 4 de mayo de 2023 .
- ↑ "Memoria caché predictiva de ruta" .
- ↑ "Memoria caché asociativa multidireccional reconfigurable" . 22 de noviembre de 1994. Consultado el 19 de enero de 2024 .
- ↑ "Solicitud de patente estadounidense para SELECCIÓN DE VÍA DE REEMPLAZO DE CACHÉ DINÁMICA BASADA EN BITS DE ETIQUETA DE DIRECCIÓN (Solicitud n.° 20160350229 emitida el 1 de diciembre de 2016) – Búsqueda de patentes de Justia" . patents.justia.com .
- ↑ Sadler, Nathan N.; Sorin, Daniel L. (2006). "Elección de un esquema de protección contra errores para la caché de datos L1 de un microprocesador" (PDF) . pág. 4.
- ↑ Patterson, David A.; Hennessy, John L. (2009). Organización y diseño de computadoras: la interfaz hardware/software . Morgan Kaufmann. pág. 484. ISBN 978-0-12-374493-7.
- 1 2 3 Cooperman, Gene (2003). "Conceptos básicos de caché" .
- ↑ Dugan, Ben (2002). "Sobre Cache" .
- ↑ Cragon, Harvey G. (1996). Sistemas de memoria y procesadores segmentados . Jones & Bartlett Learning. pág. 209. ISBN 978-0-86720-474-2.
- ↑ O'Neill, RW Experiencia con un sistema de multiprogramación de tiempo compartido con hardware de reubicación dinámica de direcciones . Proc. AFIPS Computer Conference 30 (Spring Joint Computer Conference, 1967). pp. 611– 621. doi : 10.1145/1465482.1465581 .
- ↑ Sumner, FH; Haley, G.; Chenh, ECY (1962). "La unidad de control central de la computadora 'Atlas'". Procesamiento de la información 1962. Actas del Congreso IFIP. Vol. Actas del Congreso IFIP 62. Spartan.
- ↑ Kilburn, T.; Payne, RB; Howarth, DJ (diciembre de 1961). "El supervisor Atlas" . Computadoras: clave para el control total de sistemas . Actas de conferencias. Vol. 20 Actas de la Conferencia Conjunta de Computación del Este Washington, DC Macmillan. págs. 279–294 .
- ↑ Kaxiras, Stefanos; Ros, Alberto (2013). Una nueva perspectiva para la coherencia eficiente de la caché virtual . 40.º Simposio Internacional sobre Arquitectura de Computadoras (ISCA). pp. 535–547 . CiteSeerX 10.1.1.307.9125 . doi : 10.1145/2485922.2485968 . ISBN 9781450320795. S2CID 15434231 .
- ↑ Bottomley, James (2004). "Understanding Caching" . Linux Journal . Recuperado el 2 de mayo de 2010 .
- ↑ Taylor, George; Davies, Peter; Farmwald, Michael (1990). "The TLB Slice - A Low-Cost High-Speed Address Translation Mechanism". ACM SIGARCH Computer Architecture News . 18 (2SI): 355– 363. doi : 10.1145/325096.325161 .
- ↑ Roscoe, Timothy; Baumann, Andrew (2009-03-03). "Advanced Operating Systems Caches and TLBs (263-3800-00L)" (PDF) . systems.ethz.ch . Archivado del original (PDF) el 7 de octubre de 2011. Consultado el 14 de febrero de 2016 .
- ↑ Lin, Jiang; Lu, Qingda; Ding, Xiaoning; Zhang, Zhao; Zhang, Xiaodong; Sadayappan, P. (2008). Obtención de información sobre la partición de caché multinúcleo: Cerrando la brecha entre la simulación y los sistemas reales . 14.º Simposio Internacional IEEE sobre Arquitectura de Computadoras de Alto Rendimiento. Salt Lake City, Utah. pp. 367–378 . doi : 10.1109/HPCA.2008.4658653 .
- ↑ "Carta a Jiang Lin" (PDF) . Archivado del original (PDF) el 21/01/2024.
- ↑ Jouppi, Norman P. (mayo de 1990). "Mejora del rendimiento de la caché de mapeo directo mediante la adición de una pequeña caché totalmente asociativa y búferes de precarga". Actas de la 17.ª Conferencia Internacional Anual sobre Arquitectura de Computadoras . 17.ª Conferencia Internacional Anual sobre Arquitectura de Computadoras, 28-31 de mayo de 1990. Seattle, WA, EE. UU. pp. 364–373 . doi : 10.1109/ISCA.1990.134547 .
- 1 2 "Productos (anteriormente Crystal Well)" . Intel . Archivado del original el 29/09/2013 . Recuperado el 15/09/2013 .
- 1 2 "Análisis de la tarjeta gráfica Intel Iris Pro 5200: prueba con Core i7-4950HQ" . AnandTech . Consultado el 16 de septiembre de 2013 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Cutress, Ian (2 de septiembre de 2015). "Lanzamiento de Intel Skylake para dispositivos móviles y de escritorio, con análisis de arquitectura" . AnandTech. Archivado del original el 4 de septiembre de 2015.
- ↑ Shimpi, Anand Lal (2000-11-20). "La caché del Pentium 4: Intel Pentium 4 de 1,4 GHz y 1,5 GHz" . AnandTech . Archivado del original el 26 de mayo de 2010. Consultado el 30 de noviembre de 2015 .
- 1 2 Fog, Agner (19 de febrero de 2014). "La microarquitectura de las CPU de Intel, AMD y VIA: una guía de optimización para programadores de ensamblador y creadores de compiladores" (PDF) . agner.org . Recuperado el 21 de marzo de 2014 .
- ↑ Kanter, David (26 de agosto de 2010). "Microarquitectura Bulldozer de AMD: continuación del subsistema de memoria" . Real World Technologies .
- ↑ Kanter, David (25 de septiembre de 2010). "Microarquitectura Sandy Bridge de Intel: decodificación de instrucciones y caché de uop" . Real World Technologies .
- 1 2 Solomon, Baruch; Mendelson, Avi; Orenstein, Doron; Almog, Yoav; Ronen, Ronny (agosto de 2001). "Caché de microoperaciones: un frontend con conciencia energética para ISA de longitud de instrucción variable" (PDF) . ISLPED'01: Actas del Simposio Internacional de 2001 sobre Electrónica y Diseño de Bajo Consumo . Simposio Internacional de 2001 sobre Electrónica y Diseño de Bajo Consumo (ISLPED'01), 6-7 de agosto de 2001. Huntington Beach, CA, EE. UU.: Association for Computing Machinery . págs. 4-9 . doi : 10.1109/LPE.2001.945363 . ISBN 978-1-58113-371-4. S2CID 195859085 . Consultado el 06-10-2013 .
- 1 2 Shimpi, Anand Lal (2012-10-05). "Análisis de la arquitectura Haswell de Intel" . AnandTech . Recuperado el 2013-10-20 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Cutress, Ian (18 de agosto de 2016). "Microarquitectura AMD Zen: se revelan los planificadores duales, la caché de microoperaciones y la jerarquía de memoria" . AnandTech . Consultado el 3 de abril de 2017 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ^ Gu, León; Motiani, Dipti (octubre de 2003). "Seguimiento de caché" (PDF) . Consultado el 6 de octubre de 2013 .
- ↑ Niu, Kun (28 de mayo de 2015). "¿Cómo funciona el BTIC (caché de instrucciones de destino de bifurcación)?" . Archivado del original el 7 de abril de 2018. Recuperado el 7 de abril de 2018 .
- ↑ "Intel Smart Cache: Demo" . Intel . Consultado el 26 de enero de 2012 .
- ↑ "Inside Intel Core Microarchitecture and Smart Memory Access" . Intel . 2006. pág. 5. Archivado del original (PDF) el 29/12/2011 . Consultado el 26/01/2012 .
- ↑ "Análisis de la tarjeta gráfica Intel Iris Pro 5200: prueba con Core i7-4950HQ" . AnandTech . Consultado el 25 de febrero de 2014 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ Tian, Tian; Shih, Chiu-Pi (2012-03-08). "Técnicas de software para sistemas multinúcleo con caché compartida" . Intel . Recuperado el 24 de noviembre de 2015 .
- ↑ "Taller virtual de Cornell > Introducción a las arquitecturas de clúster avanzadas > Memoria, caché, interconexiones > Caché de último nivel" .
- ↑ Lempel, Oded (28-07-2013). "Familia de procesadores Intel Core de segunda generación: Intel Core i7, i5 e i3" (PDF) . hotchips.org . págs. 7–10 , 31–45 . Archivado del original (PDF) el 29-07-2020 . Recuperado el 21-01-2014 .
- ↑ Chen, J. Bradley; Borg, Anita; Jouppi, Norman P. (1992). "Un estudio basado en simulación del rendimiento de la TLB" . ACM SIGARCH Computer Architecture News . 20 (2): 114 – 123. doi : 10.1145/146628.139708 .
- ↑ "Explicación de la caché L1 y L2" . amecomputers.com . Archivado del original el 14 de julio de 2014. Consultado el 9 de junio de 2014 .
- 1 2 3 Zheng, Ying; Davis, Brian T.; Jordan, Matthew (10–12 de marzo de 2004). Evaluación del rendimiento de jerarquías de caché exclusivas (PDF) . Simposio Internacional IEEE sobre Análisis de Rendimiento de Sistemas y Software. Austin, Texas, EE. UU. págs. 89–96 . doi : 10.1109/ISPASS.2004.1291359 . ISBN 0-7803-8385-0. Archivado del original (PDF) el 13-08-2012 . Consultado el 09-06-2014 .
- ↑ Jaleel, Aamer; Eric Borch; Bhandaru, Malini; Steely Jr., Simon C.; Emer, Joel (27 de septiembre de 2010). "Lograr un rendimiento de caché no inclusivo con cachés inclusivas" (PDF) . jaleels.org . Consultado el 9 de junio de 2014 .
- ↑ "AMD K8" . Sandpile.org . Archivado del original el 15 de mayo de 2007. Consultado el 2 de junio de 2007 .
- ↑ "Manual de referencia técnica de Cortex-R4 y Cortex-R4F" . arm.com . Consultado el 28 de septiembre de 2013 .
- ↑ "Manual de referencia técnica del controlador de caché L210" . arm.com . Consultado el 28 de septiembre de 2013 .
- ↑ Mahapatra, Nihar R.; Venkatrao, Balakrishna (1999). "El cuello de botella procesador-memoria: problemas y soluciones" (PDF) . Crossroads . 5 (3es): 2–es. doi : 10.1145/357783.331677 . S2CID 11557476. Archivado del original (PDF) el 5 de marzo de 2014. Recuperado el 5 de marzo de 2013 .
- ↑ Manual del sistema GE-645 (PDF) . General Electric . Enero de 1968. Consultado el 10 de julio de 2020 .
- ↑ Características funcionales del IBM System/360 Modelo 67 (PDF) . Tercera edición. IBM . Febrero de 1972. GA27-2719-2.
- ↑ Thornton, James E. (octubre de 1964). "Operación paralela en el controlador de datos 6600" (PDF) . Actas de la conferencia conjunta de informática de otoño del 27 al 29 de octubre de 1964, parte II: sistemas informáticos de muy alta velocidad .
- ↑ IBM (junio de 1968). Características funcionales del IBM System/360 Modelo 85 (PDF) (2.ª ed.). A22-6916-1.
- ↑ Chen, Allan, "La CPU 486: En un vector de vuelo de alto rendimiento", Intel Corporation, Microcomputer Solutions, noviembre/diciembre de 1990, pág. 2
- ↑ Reilly, James, Kheradpir, Shervin, "Una visión general del diseño de hardware de alto rendimiento utilizando la CPU 486", Intel Corporation, Microcomputer Solutions, noviembre/diciembre de 1990, página 20
- ↑ "Familia de microprocesadores Intel Xeon Foster MP" . CPU-World . Archivado del original el 15 de julio de 2023.
- ↑ "Familia de procesadores Intel Xeon E7" . Intel® ARK (Especificaciones del producto) . Intel . Archivado del original el 14/10/2013 . Consultado el 10/10/2013 .
- ↑ Sally Adee (noviembre de 2009). "El diseño del chip frustra un ataque furtivo a los datos" . IEEE Spectrum . 46 (11): 16. doi : 10.1109/MSPEC.2009.5292036 . S2CID 43892134 .
- ↑ Wang, Zhenghong; Lee, Ruby B. (8–12 de noviembre de 2008). Una nueva arquitectura de caché con rendimiento y seguridad mejorados (PDF) . 41.º Simposio Internacional anual IEEE/ACM sobre Microarquitectura. págs. 83–93 . Archivado (PDF) del original el 6 de marzo de 2012.
- ↑ "CACTI" . HP Labs . Archivado del original el 29/01/2023 . Consultado el 29/01/2023 .
Enlaces externos
- Memoria, parte 2: Cachés de CPU : un artículo de Ulrich Drepper en lwn.net que describe las cachés de CPU en detalle.
- Evaluación de la asociatividad en cachés de CPU – Hill y Smith (1989) – introduce la capacidad, el conflicto y la clasificación obligatoria.
- Rendimiento de la caché para los benchmarks SPEC CPU2000 – Hill y Cantin (2003) – Este documento de referencia se ha actualizado varias veces. Presenta de forma exhaustiva y clara resultados de simulación para un conjunto bastante amplio de benchmarks y configuraciones de caché.
- Jerarquía de memoria en sistemas basados en caché. Archivado el 15 de septiembre de 2009 en Wayback Machine – por Ruud van der Pas, 2002, Sun Microsystems – artículo introductorio sobre el almacenamiento en caché de memoria de la CPU.
- Introducción a la memoria caché – por Paul Genua, PE, 2004, Freescale Semiconductor, otro artículo introductorio
- Una caché asociativa de 8 vías , escrita en VHDL.
- Comprender el almacenamiento en caché y el rendimiento de la CPU : un artículo de Jon Stokes en Ars Technica.
- Análisis del procesador IBM POWER4 : un artículo de Pavel Danilov publicado en ixbtlabs.
- ¿Qué es la memoria caché y cuáles son sus tipos?
- Almacenamiento en caché de memoria : una conferencia de la Universidad de Princeton.
- Falacia del vaciado de la caché de la CPU
- unidad central de procesamiento
- Memoria de computadora
- Caché (informática)