Está en la página 1de 4

Coherencia de Caché

Javier Jiménez Fonseca


EL-4314 - Arquitectura de Computadores I
Instituto Tecnológico de Costa Rica

22 de noviembre del 2020

El Problema de Coherencia del Caché


Este problema se puede resumir en que un programador espera que exista congruencia con
la memoria compartida, esto quiere decir que si el núcleo A escribe en ”X” el número 15,
el núcleo B cuando lea el dato almacenado en ”X” este debe ser igual a 15. El problema
radica que a nivel de hardware cada núcleo tiene su propio caché, se puede pensar que esto
se solucionarı́a utilizando un caché L1 para los dos núcleos, pero esto harı́a que el caché
se hiciera más grande. Esto provocarı́a que se volviera lento y poco eficiente. Además no
podrı́a atender todas las peticiones de los distintos núcleos.
Sin implementar alguna solución podrı́a suceder lo siguiente: Se tiene que en X el dato
almacenado es 0. A escribe en el espacio ”X” de su caché el número 15. Seguidamente B lee
el dato en ”X” de su caché, genera un miss por lo que trae el dato desde memoria, por lo
tanto, para B ”X” va a valer 0. No hay coherencia entre A y B.

Definición de Coherencia
Esta definición se puede representar en 3 partes:

1. La lectura de la dirección X en el núcleo C1 regresa el valor escrito por la operación


de escritura más reciente a X en el caché de C1 si ningún otro núcleo ha escrito a X
entre la escritura y lectura de esta.

2. Si C1 escribe en X y C2 lee, después de un cierto tiempo, y no hay otras escrituras


entre ambos procesos, la lectura por parte de C2 regresa el valor de que C1 escribió en
X.

3. Las escrituras a la misma dirección son serializadas, esto quiere decir que si C1 escribió
1 y luego 3 en X, C2 debe notar que primero se escribió un 1 y luego un 3.

1
¿Cómo Obtener Coherencia?
Se proponen varias soluciones:
1. No usar cachés (muy malo para el desempeño ya que la memoria principal es muy
lenta).
2. Todos los núcleos usan el mismo caché (mal desempeño ya que la caché tendrı́a que
ser muy grande por lo que la harı́a lenta).
3. Implementar cachés con protocolo write-through (provoca incoherencias ya que no se
actualiza la memoria principal).
4. Utilizar el write update coherence, implica actualizar todos los cachés cada vez que se
realiza una escritura. Esto resolverı́a lo mencionado en la 2da parte de la definición de
coherencia.
5. Hacer que una escritura en caché provoque misses en los demás cachés si intentan
accesar el mismo bloque, a esto se le denomina write invalidate coherence lo que resuelve
lo mencionado en la 2da parte de la definción de coherencia.
6. Para resolver la 3era parte de la definición se puede utilizar un bus compartido por los
cachés, gracias a esto todos los cachés están al tanto de las operaciones que realizan
los demás (a esto se le llama snooping).

Write-Update Snooping Coherence


En resumen, C1 y C2 siempre están vigilando las acciones del otro a través del bus compartido
de caché. Cuando alguno realiza una escritura en caché, el otro se da cuenta de esto y se
actualiza gracias al bus común. Además, se asegura que el orden las escrituras es congruente.

Optimización del Write-Update


Lo ideal es evitar en la medida de lo posible las escrituras. Para ello se aplica un dirty bit,
este bit básicamente indica que ese bloque tiene un valor más actualizado que la memoria.
Cuando otro núcleo quiere leer de un campo que está dirty en otro caché, ese caché le
responde y envı́a el dato más actualizado de lugar de que tenga que ir hasta la memoria
principal para obtener ese dato. Entre los beneficios del dirty bit se encuetran:
• Se escribe en memoria principal solo si se va a reemplazar el bloque entero en caché.
• Se lee desde memoria solo si ningún caché tiene el dirty bit en alto, esto quiere decir
que ningún caché tiene el dato más actualizado.

Update vs Invalidate Coherence


A continuación se resume las acciones que toman ambas coherencias ante ciertos casos:

2
La aplicación Update Invalidate
hace
Ráfaga de escrit- Cada escritura envı́a una actual- La primera escritura inválida los
uras a una misma ización, saturando el bus común demás cachés y las demás solo
dirección y además se consume mucha en- marcan hits.
ergı́a.
Escribe diferentes Hay una actualización por cada La primera escritura inválida los
palabras en el palabra, lo que puede saturar el demás cachés y las demás solo
mismo bloque bus. marcan hits, lo que hace que no
(inicialización de haya un tráfico excesivo en el
caché) bus.
Productor - Con- El productor actualiza cada vez El consumidor solo va a ver
sumidor: Uno crea que actualiza y el consumidor misses y esto implica traer el
y otro lee solo va a obtener hits, lo que es dato desde memoria aumen-
bueno tando el tráfico del bus, es malo.
El thread se mueve Se actualiza el caché del núcleo No hay tráfico innecesario gra-
a otro núcleo viejo provocando demasiado cias a esta implementación.
tráfico en el bus.

Coherencia MSI
A continuación se presentan los estados de la coherencia MSI:

• Invalid (I): bloque presente en el caché pero el bit valid está en 0 o cuando el bloque
no está en el caché.

3
• Shared (S): el bloque puede leer sin ninguna complicación pero si se realiza una escritura
hay que hacer algo.

• Modified (M): puede leerse y escribirse localmente, cualquier otro caso hay que cambiar
de estado.

Coherencia MOSI
Es igual que el MSI, excepto que cuando se está en M y ocurre un snoop a read se pasa
al estado O y no al S. Por lo tanto, no se accesa a la memoria y nada más se da el dato
al solicitante sin actualizar la memoria. El estado es muy parecido al S solo que cuando
ocurre un snoop read se da el dato y solo se da un write-back a la memoria si el bloque es
reemplazado. En resumen, O está dirty, lo que significa que es el valor más actualizado por
lo que este da el dato para que la memoria no lo haga y mejorar los tiempos.

También podría gustarte