La contaminación de la caché describe situaciones en las que un programa informático en ejecución carga datos en la caché de la CPU de forma innecesaria, lo que provoca que otros datos útiles se eliminen de la caché a niveles inferiores de la jerarquía de memoria , lo que degrada el rendimiento. Por ejemplo, en un procesador de múltiples núcleos , un núcleo puede reemplazar los bloques recuperados por otros núcleos en la memoria caché compartida, o los bloques precargados pueden reemplazar los bloques de la memoria caché obtenidos por demanda.
Ejemplo
Considere la siguiente ilustración:
T [0] = T [0] + 1; para i en 0 .. tamaño de (CACHE) C [i] = C [i] + 1; T [0] = T [0] + C [tamaño de (CACHE) -1];
(Las suposiciones aquí son que la caché está compuesta de un solo nivel, está desbloqueada, la política de reemplazo es pseudo-LRU , todos los datos se pueden almacenar en caché, la asociatividad establecida de la caché es N (donde N> 1) y como máximo un registro de procesador está disponible para contener valores de programa).
Justo antes de que comience el ciclo, T [0] se obtendrá de la memoria al caché, su valor se actualizará. Sin embargo, a medida que se ejecuta el bucle, debido a que el número de elementos de datos al que hace referencia el bucle requiere que toda la memoria caché se llene hasta su capacidad, el bloque de memoria caché que contiene T [0] debe ser desalojado. Por lo tanto, la próxima vez que el programa solicite la actualización de T [0], la caché falla y el controlador de la caché tiene que solicitar al bus de datos que vuelva a traer el bloque de caché correspondiente de la memoria principal .
En este caso, se dice que la caché está "contaminada". Cambiar el patrón de acceso a datos colocando la primera actualización de T [0] entre el bucle y la segunda actualización puede eliminar la ineficiencia:
para i en 0 .. tamaño de (CACHE) C [i] = C [i] + 1; T [0] = T [0] + 1; T [0] = T [0] + C [tamaño de (CACHE) -1];
Soluciones
Aparte de la reestructuración del código mencionada anteriormente, la solución para la contaminación de la caché es asegurarse de que solo se almacenen en la caché los datos de alta reutilización. Esto se puede lograr mediante el uso de instrucciones especiales de control de caché , soporte del sistema operativo o soporte de hardware.
Ejemplos de instrucciones de hardware especializadas incluyen "lvxl" proporcionado por PowerPC AltiVec . Esta instrucción carga un valor de 128 bits de ancho en un registro y marca el bloque de caché correspondiente como "utilizado menos recientemente", es decir, como el principal candidato para el desalojo ante la necesidad de desalojar un bloque de su conjunto de caché. Para usar apropiadamente esa instrucción en el contexto del ejemplo anterior, los elementos de datos referenciados por el ciclo tendrían que ser cargados usando esta instrucción. Cuando se implementa de esta manera, la contaminación de la caché no tendría lugar, ya que la ejecución de dicho bucle no provocaría el desalojo prematuro de T [0] de la caché. Esto se evitaría porque, a medida que avanza el bucle, las direcciones de los elementos en C se asignarían de la misma forma de caché, dejando intactos los datos más antiguos (pero no marcados como "usados menos recientemente") en el otro sentido (s ). Solo los datos más antiguos (no pertinentes para el ejemplo dado) serían desalojados de la caché, de la cual T [0] no es miembro, ya que su actualización ocurre justo antes del inicio del ciclo.
De manera similar, al utilizar el soporte del sistema operativo (SO), las páginas de la memoria principal que corresponden a la matriz de datos C pueden marcarse como "inhibidas de almacenamiento en caché" o, en otras palabras, no almacenables en caché. De manera similar, a nivel de hardware, se pueden usar esquemas de omisión de caché que identifican datos de baja reutilización según el patrón de acceso al programa y los omiten de la caché. Además, la caché compartida se puede particionar para evitar interferencias destructivas entre aplicaciones en ejecución. La compensación en estas soluciones es que los esquemas basados en SO pueden tener una gran latencia que puede anular la ganancia que se puede lograr evitando la contaminación de la caché (a menos que la región de memoria no se haya almacenado en caché para empezar), mientras que las técnicas basadas en hardware pueden no tener un valor global. vista del flujo de control del programa y patrón de acceso a la memoria .
Importancia creciente
El control de la contaminación de la caché ha ido cobrando mayor importancia debido a que siguen aumentando las penalizaciones provocadas por el llamado " muro de la memoria ". Los fabricantes de chips continúan ideando nuevos trucos para superar la cada vez mayor latencia relativa de memoria a CPU. Lo hacen aumentando el tamaño de la caché y proporcionando formas útiles para que los ingenieros de software controlen la forma en que los datos llegan y permanecen en la CPU. El control de la contaminación de la caché es uno de los numerosos dispositivos disponibles para el programador (principalmente integrado). Sin embargo, también se utilizan otros métodos, la mayoría de los cuales son propietarios y muy específicos de hardware y aplicaciones.