Si tengo una CPU con dos núcleos, cada núcleo tiene su propio caché L1, ¿es posible que Core1 y Core2 almacenen en caché la misma parte de la memoria al mismo tiempo?
Si es posible, ¿cuál será el valor de la memoria principal si tanto Core1 como Core2 han editado su valor en caché?
Respuesta1
Si tengo una CPU con dos núcleos, cada núcleo tiene su propio caché L1, ¿es posible que Core1 y Core2 almacenen en caché la misma parte de la memoria al mismo tiempo?
Sí. El rendimiento sería terrible si este no fuera el caso. Considere dos subprocesos que ejecutan el mismo código. Quieres ese código en ambas cachés L1.
Si es posible, ¿cuál será el valor de la memoria principal si tanto Core1 como Core2 han editado su valor en la caché?
El valor anterior estará en la memoria principal, lo cual no importará ya que ninguna CPU lo leerá. Antes de expulsar un valor modificado del caché, se debe escribir en la memoria. Generalmente alguna variante delprotocolo MESIse utiliza. En la implementación tradicional de MESI, si un valor se modifica en un caché, no puede estar presente en ningún otro caché en ese mismo nivel.
Respuesta2
Sí, esto (tener dos cachés en la misma región de memoria) puede suceder, en realidad es un problema que ocurre mucho en la práctica. Hay varias soluciones, por ejemplo:
- los dos cachés pueden comunicarse para asegurarse de que no estén en desacuerdo
- puede tener algún tipo de supervisor que monitoree todos los cachés y los actualice en consecuencia
- Cada procesador monitorea las áreas de memoria que ha almacenado en caché y, cuando detecta una escritura, descarta su caché (ahora no válida).
El problema se llamacoherencia de caché. ElArtículo de Wikipedia sobre el tema.tiene una buena descripción general del problema y las posibles soluciones.
Respuesta3
Para responder a la pregunta del título, depende de cuál sea el protocolo de almacenamiento en caché. Si se trata de escritura diferida, la caché sólo se devolverá a la memoria principal cuando el controlador de caché no tenga más remedio que colocar un nuevo bloque de caché en un espacio ya ocupado. El bloque que ocupaba previamente el espacio se elimina y su valor se vuelve a escribir en la memoria principal.
El otro protocolo es de escritura directa. En ese caso, cada vez que el bloque de caché se escribe en el nivel n, se actualiza el bloque correspondiente en el nivel (n+1). (Es similar en concepto a llenar un formulario con papel carbón debajo; todo lo que escriba arriba se copia en la hoja de abajo). Esto es más lento porque obviamente implica más operaciones de escritura, pero los valores entre cachés son más consistentes. En el esquema de reescritura, sólo la caché de nivel más alto tendría el valor más actualizado para un bloque de memoria en particular.