Una caché de víctimas es una caché pequeña, generalmente totalmente asociativa , ubicada en la ruta de recarga de una caché de CPU . Almacena todos los bloques expulsados de ese nivel de caché y se propuso originalmente en 1990. En las arquitecturas modernas, esta función generalmente la realizan las cachés de nivel 3 o nivel 4.
El almacenamiento en caché de víctimas es una técnica de hardware para mejorar el rendimiento de los cachés propuesta por Norman Jouppi . Como se menciona en su artículo: [1]
El almacenamiento en caché de errores coloca un caché completamente asociativo entre el caché y su ruta de recarga. Los errores en el caché que afectan al caché de errores tienen una penalización de un ciclo, a diferencia de una penalización de varios ciclos sin el caché de errores. El almacenamiento en caché de víctimas es una mejora del almacenamiento en caché de errores que carga el caché pequeño completamente asociativo con la víctima de un error y no con la línea de caché solicitada. [1]
Una caché de víctima es una caché de hardware diseñada para reducir los errores de conflicto y mejorar la latencia de aciertos para cachés mapeados directamente. Se utiliza en la ruta de recarga de una caché de nivel 1, donde cualquier línea de caché expulsada de la caché se almacena en caché en la caché de víctima. Como resultado, la caché de víctima se llena solo cuando se expulsan datos de la caché de nivel 1. Cuando se produce un error en la caché de nivel 1, la entrada omitida se verifica en la caché de víctima. Si el acceso produce un acierto, se intercambian los contenidos de la línea de caché de nivel 1 y la línea de caché de víctima correspondiente.
Aunque inicialmente fue propuesto por Jouppi para mejorar el rendimiento de la caché de un caché de nivel 1 mapeado directamente, los microprocesadores actuales con jerarquía de caché de varios niveles emplean caché de nivel 3 o nivel 4 para actuar como caché víctima para el caché que se encuentra por encima de él en la jerarquía de memoria. Crystal Well [2] de Intel de sus procesadores Haswell introdujo una caché de nivel 4 en el paquete que sirve como caché víctima para el caché de nivel 3 del procesador. [3] Una caché de nivel 3 de 4 a 12 MB se utiliza como caché víctima en los microprocesadores POWER5 (IBM).
A medida que la arquitectura y la tecnología del hardware avanzaron, el rendimiento y la frecuencia del procesador aumentaron a un ritmo mucho más rápido que los tiempos de ciclo de la memoria, lo que generó una brecha de rendimiento significativa. El desafío de la creciente latencia de la memoria en comparación con la velocidad del procesador se ha abordado incorporando una memoria caché de alta velocidad.
Las cachés de mapeo directo tienen un tiempo de acceso más rápido que las cachés de asociación de conjuntos . Sin embargo, en las cachés de mapeo directo, cuando varios bloques de caché en la memoria se asignan a la misma línea de caché, terminan expulsándose entre sí cada vez que se accede a uno de ellos. Este problema, conocido como el problema del conflicto de caché, surge debido a la asociatividad limitada de la caché. Aumentar la asociatividad de la caché puede mitigar este problema, pero existen complejidades de implementación y limitaciones en cuanto a cuánto se puede aumentar la asociatividad. Para abordar el problema del conflicto de caché dentro de las limitaciones de la asociatividad de caché limitada, a menudo se utiliza una caché víctima.
A continuación se muestra el comportamiento de un caché víctima en su respectiva interacción con el caché de nivel correspondiente:
Accedido a caché: sin acción
Error de caché, víctima afectada: el bloque que está en el caché de la víctima y el que está en el caché se reemplazan entre sí. Esta nueva entrada en el caché de la víctima se convierte en el bloque usado más recientemente.
Caché perdido, víctima perdido: el bloque se lleva al caché desde el siguiente nivel. El bloque expulsado del caché se almacena en el caché de la víctima.
Consideremos una caché L1 mapeada directamente con bloques A y B que apuntan al mismo conjunto. Está vinculada a una caché víctima totalmente asociativa de 2 entradas con bloques C y D en ella.
El rastro a seguir: A, B, A, B...
En el diagrama, podemos ver que, en caso de que se produzca un impacto en la caché de la víctima (VC), se intercambian los bloques A y B. El bloque de VC menos utilizado recientemente permanece tal como está. Por lo tanto, da una ilusión de asociatividad a la caché L1 mapeada directamente, lo que a su vez reduce los errores de conflicto.
En el caso de dos cachés, L1 y L2 con política de caché exclusiva (L2 no almacena en caché las mismas ubicaciones de memoria que L1), L2 actúa como caché víctima para L1.
Al medir la mejora del rendimiento mediante el uso de la caché de víctimas, Jouppi [1] asumió una caché de mapeo directo de nivel 1 aumentada con una caché completamente asociativa. Para el conjunto de pruebas que utilizó, en promedio, el 39% de los errores de caché de datos de nivel 1 se encuentran como errores de conflicto, mientras que en promedio, el 29% de los errores de instrucción de nivel 1 se encuentran como errores de conflicto. [1] Dado que los errores de conflicto representan un gran porcentaje de los errores totales, por lo tanto, proporcionar asociatividad adicional al aumentar la caché de nivel 1 con una caché de víctimas seguramente mejorará la tasa total de errores significativamente.
Los resultados experimentales se deducen considerando un caché de 32 Kb, de 2 vías y totalmente asociativo, mapeado directamente, aumentado con un caché de víctima de 256 bloques (8 KB) y ejecutando en él 8 puntos de referencia SPEC 95 seleccionados aleatoriamente. [4] Si bien los resultados no se pueden generalizar para todos los puntos de referencia, agregar un caché de víctima proporciona una reducción de la tasa de errores que varía del 10 % al 100 % para toda la configuración de caché. [4] Sin embargo, los retornos parecen estabilizarse más allá del tamaño del caché de víctima de 50 bloques, lo que prueba así la observación de Jouppi [1] de que los beneficios del caché de víctima alcanzan una meseta después de los primeros bloques de víctima. [4]
Se ha descubierto que la reducción de la tasa de errores para un tamaño de caché de 64 KB es significativamente menor, lo que demuestra que el almacenamiento en caché de las víctimas no es escalable indefinidamente. [4]
Al comparar varias configuraciones de caché, se descubrió que en ciertos casos agregar un caché de víctima pequeño puede brindar un beneficio de rendimiento equivalente al observado al multiplicar el tamaño del caché por 2. [4]