Un caché de CPU es una pieza de hardware que reduce el tiempo de acceso a los datos en la memoria al mantener una parte de los datos utilizados con frecuencia de la memoria principal en un 'caché' de memoria más pequeño y más rápido.
El rendimiento de un sistema informático depende del rendimiento de todas las unidades individuales, que incluyen unidades de ejecución como unidades de números enteros, de ramificación y de punto flotante, unidades de E/S, bus, cachés y sistemas de memoria. La brecha entre la velocidad del procesador y la velocidad de la memoria principal ha crecido exponencialmente. Hasta 2001-05, la velocidad de la CPU, medida por la frecuencia de reloj, crecía anualmente un 55%, mientras que la velocidad de la memoria solo crecía un 7%. [1] Este problema se conoce como el muro de la memoria. La motivación para una caché y su jerarquía es salvar esta brecha de velocidad y superar el muro de la memoria.
El componente crítico en la mayoría de las computadoras de alto rendimiento es la memoria caché. Dado que la memoria caché existe para salvar la brecha de velocidad, su medición y métricas de rendimiento son importantes para diseñar y elegir varios parámetros como el tamaño de la memoria caché, la asociatividad, la política de reemplazo, etc. El rendimiento de la memoria caché depende de los aciertos y errores de la memoria caché, que son los factores que crean restricciones al rendimiento del sistema. Los aciertos y errores de la memoria caché son la cantidad de accesos a la memoria caché que realmente encuentran esos datos en la memoria caché, y los errores de la memoria caché son aquellos accesos que no encuentran el bloque en la memoria caché. Estos aciertos y errores de la memoria caché contribuyen al término tiempo de acceso promedio (AAT), también conocido como AMAT ( tiempo promedio de acceso a memoria ), que, como sugiere el nombre, es el tiempo promedio que se tarda en acceder a la memoria. Esta es una métrica importante para la medición del rendimiento de la memoria caché, porque este número se vuelve altamente significativo y crítico a medida que aumenta la velocidad del procesador.
Otra métrica útil para probar el rendimiento es la ley de potencia de los errores de caché . Te da la cantidad de errores cuando cambias el tamaño de la caché, dado que se conoce la cantidad de errores para uno de los tamaños de caché. De manera similar, cuando quieres probar el rendimiento de la caché en términos de errores en diferentes asociatividades, se utiliza el perfil de distancia de pila .
El aumento del rendimiento del procesador debido a la jerarquía de caché depende de la cantidad de accesos a la caché que satisfacen las solicitudes de bloque de la caché (accesos a la caché) en comparación con los que no lo hacen. Los intentos fallidos de leer o escribir datos de la caché (errores de caché) dan como resultado un acceso a la memoria principal o de nivel inferior, lo que aumenta la latencia. Existen tres tipos básicos de errores de caché conocidos como las 3C [2] y algunos otros errores de caché menos populares.
Cada bloque de memoria, cuando se hace referencia por primera vez, provoca un error obligatorio. Esto implica que la cantidad de errores obligatorios es la cantidad de bloques de memoria distintos a los que se hizo referencia alguna vez. A veces también se los llama errores en frío . Los errores en frío no se pueden evitar a menos que se obtenga previamente el bloque .
Se ha observado que un aumento del tamaño de bloque hasta cierto punto para aprovechar la localidad espacial conduce a una disminución de los errores en frío. El aumento del tamaño de bloque conduce a la precarga de palabras cercanas en un bloque y evita futuros errores en frío. Aumentar demasiado el tamaño de bloque puede conducir a la precarga de datos inútiles, lo que aumenta el número de errores en frío.
Los errores de conflicto ocurren cuando los datos requeridos estaban previamente en la memoria caché, pero fueron expulsados. Estos expulsiones ocurren porque otra solicitud fue asignada a la misma línea de caché. Generalmente, los errores de conflicto se miden restando la cantidad de errores en una memoria caché con asociatividad limitada por la cantidad de errores de una memoria caché completamente asociativa del mismo tamaño y tamaño de bloque de memoria caché.
Dado que los errores de conflicto se pueden atribuir a la falta de asociatividad suficiente, aumentar la asociatividad hasta cierto punto (la asociatividad de 8 vías es casi tan efectiva como la totalmente asociativa) disminuye la cantidad de errores de conflicto; sin embargo, este enfoque aumenta el tiempo de acceso a la caché y consume mucha más energía que una caché asociativa establecida.
Una pérdida de capacidad se produce debido al tamaño limitado de una caché y no a la función de mapeo de la caché. Cuando el conjunto de trabajo, es decir, los datos que son importantes actualmente para el programa, es más grande que la caché, se producen con frecuencia pérdidas de capacidad. De las 3 C, las pérdidas de capacidad son las más difíciles de identificar y se pueden considerar como pérdidas no obligatorias en una caché completamente asociativa. En un sistema de un solo procesador, las pérdidas que existen después de restar la cantidad de pérdidas obligatorias y las pérdidas por conflicto se pueden clasificar como pérdidas de capacidad.
Dado que las pérdidas de capacidad pueden atribuirse al tamaño limitado de una memoria caché, una forma sencilla de reducir la cantidad de dichas pérdidas es aumentar el tamaño de la memoria caché. Aunque este método es muy intuitivo, conlleva un mayor tiempo de acceso y un aumento del área de la memoria caché y de su consumo de energía. Además, después de un cierto tamaño de memoria caché, la cantidad de pérdidas se satura y no disminuye ni siquiera al aumentar el tamaño de la memoria caché.
Los tres tipos de errores anteriores solo abordan errores de un solo procesador.
El grupo 3C de errores de caché se puede ampliar a 4C cuando se trata de un sistema multiprocesador con caché, siendo la cuarta C los errores de coherencia. El recuento de errores de coherencia es la cantidad de accesos a la memoria que fallan porque una línea de caché que de otro modo estaría presente en la caché del hilo ha sido invalidada por una escritura de otro hilo. [3] La coherencia en un sistema multiprocesador se mantiene si solo está presente una copia de un bloque de memoria o si todas las copias tienen el mismo valor. Incluso si todas las copias del bloque de memoria no tienen el mismo valor, no necesariamente conduce a un error de coherencia. Un error de coherencia ocurre cuando los hilos ejecutan cargas de modo que observan los diferentes valores del bloque de memoria. [4]
El problema de la coherencia es complejo y afecta la escalabilidad de los programas paralelos. Para solucionar este problema, debe existir un orden global de todos los accesos a la memoria en la misma ubicación en todo el sistema.
El grupo de 4C de errores de caché se puede ampliar aún más a 5C cuando el sistema multiprocesador incluye un directorio de coherencia organizado como una caché, es decir, que puede reemplazar entradas. Esta quinta C significa Cobertura. [5] El recuento de errores de cobertura es la cantidad de accesos a la memoria que fallan porque una línea de caché que de otro modo estaría presente en la caché del procesador se ha invalidado como consecuencia de un desalojo de directorio. Si el directorio no puede rastrear una línea de caché debido a su capacidad limitada, la línea debe invalidarse de la caché de los procesadores para mantener la Coherencia .
Las actividades del sistema, como interrupciones , cambios de contexto y llamadas al sistema, hacen que el proceso se suspenda y se altere su estado de caché. Cuando se reanuda la ejecución del proceso, sufre errores de caché para restaurar el estado de caché que se alteró. Estos errores se denominan errores relacionados con el sistema. [2]
Además, los errores de caché debidos al cambio de contexto se pueden clasificar en dos categorías que se describen a continuación.
Cuando se produce un cambio de contexto, se modifica el estado de la caché y se reemplazan algunos de sus bloques. Los errores en el acceso a estos bloques se denominan errores reemplazados.
Es posible que algunos bloques de la memoria caché no se reemplacen debido a un cambio de contexto, pero sí se modifica su actualidad. Se dice que se producen errores de reordenación cuando se producen debido a un cambio de actualidad y no debido a que se reemplacen los bloques. Sin embargo, cuando el proceso suspendido reanuda la ejecución, los bloques reordenados no provocan errores de cambio de contexto cuando ningún otro error hace que se expulsen estos bloques reordenados.
Los errores relacionados con el sistema se vuelven significativos cuando se produce un cambio de contexto con regularidad. Aumentar el tamaño de la caché conduce a una disminución de la capacidad y de los errores por conflictos, pero se ha observado que conduce a un aumento de los errores relacionados con el sistema si la caché sigue siendo más pequeña que el conjunto de trabajo de los procesos que comparten la caché. Por lo tanto, reducir la cantidad de errores relacionados con el sistema presenta un desafío.
Estos fallos de caché se correlacionan directamente con el aumento de ciclos por instrucción (CPI). Sin embargo, la cantidad de efecto que los fallos de caché tienen en el CPI también depende de cuánto del fallo de caché se puede superponer con los cálculos debido al ILP ( paralelismo a nivel de instrucción ) y cuánto de él se puede superponer con otros fallos de caché debido al paralelismo a nivel de memoria . [2] Si ignoramos ambos efectos, entonces el tiempo de acceso a memoria promedio se convierte en una métrica importante. Proporciona una medida del rendimiento de los sistemas y jerarquías de memoria. Se refiere al tiempo promedio que toma realizar un acceso a memoria. Es la suma del tiempo de ejecución para las instrucciones de memoria y los ciclos de bloqueo de memoria. El tiempo de ejecución es el tiempo para un acceso a caché, y los ciclos de bloqueo de memoria incluyen el tiempo para atender un fallo de caché y acceder a niveles inferiores de memoria. Si se conocen la latencia de acceso, la tasa de fallos y la penalización por fallo, el tiempo de acceso a memoria promedio se puede calcular con:
donde es la latencia de acceso del caché de nivel uno, es la tasa de errores del caché de nivel uno y son los ciclos adicionales que tarda en atenderse un error en un nivel superior en comparación con un acierto en un nivel superior, y se calcula con:
Esta fórmula se puede ampliar aún más y utilizar de forma recursiva para todos los niveles adicionales en la jerarquía de memoria para obtener el . [6]
La ley de potencia de los errores de caché muestra una tendencia en los errores de capacidad en una aplicación particular del programa, que se ve afectada por el tamaño de la caché. Esta observación empírica condujo a la forma matemática de la ley de potencia, que muestra la relación entre la tasa de errores y el tamaño de la caché. Puede expresarse como
donde M es la tasa de errores para una caché de tamaño C y M 0 es la tasa de errores de una caché de referencia. El exponente α es específico de la carga de trabajo y normalmente varía de 0,3 a 0,7, con un promedio de 0,5. La ley de potencia se validó en bastantes pruebas comparativas del mundo real. [7]
Esta relación muestra que solo una pequeña fracción de los errores de caché se pueden eliminar si se aumenta constantemente el tamaño de la caché. Esta ley es válida solo para un cierto rango finito de tamaños de caché, hasta el cual la tasa de errores no se estabiliza. La tasa de errores finalmente se estanca en un cierto tamaño de caché lo suficientemente grande y, después de eso, la relación no brinda estimaciones correctas.
El perfil de distancia de pila es una mejor representación de cómo los errores de caché se ven afectados por el tamaño de la caché. La ley de potencia de los errores de caché solo mostró una aproximación aproximada de lo mismo. Un perfil de distancia de pila captura el comportamiento de reutilización temporal de una aplicación en una caché totalmente asociativa o asociativa por conjuntos. [8]
Las aplicaciones que muestran un comportamiento de reutilización más temporal generalmente acceden a datos que se usaron más recientemente. Supongamos que la asociatividad de una caché es . Para recopilar la información del perfil de distancia de pila de esta caché, suponiendo que tiene una política de reemplazo LRU, se utilizan contadores que comienzan desde hasta y un contador adicional , que lleva el recuento de los errores. El contador se incrementa cuando hay un acierto en el camino y el contador se incrementa en cada error. El perfil de distancia de pila muestra la tendencia de los aciertos, disminuyendo desde los datos usados más recientemente hasta los menos usados recientemente. Usando esta información del perfil de distancia de pila, el error de caché para una caché con asociatividad y política de reemplazo LRU, donde se puede calcular como
Esta información de perfilación tiene la limitación de que solo puede capturar la reutilización temporal en diferentes asociatividades. Para otros fines, la reutilización temporal debe estudiarse con mayor detalle.
{{cite book}}
: CS1 maint: varios nombres: lista de autores ( enlace ){{cite journal}}
: Requiere citar revista |journal=
( ayuda ){{cite book}}
: CS1 maint: varios nombres: lista de autores ( enlace ){{cite book}}
: CS1 maint: varios nombres: lista de autores ( enlace )