¿Escritura no simultánea frente a escritura simultánea en caché?

93

Tengo entendido que la principal diferencia entre los dos métodos es que en el método de "escritura directa" los datos se escriben en la memoria principal a través de la caché inmediatamente, mientras que en la "escritura diferida" los datos se escriben en un "último tiempo".

Todavía tenemos que esperar la memoria en "último tiempo", entonces ¿Cuál es el beneficio de la "escritura directa"?

Naftaly
fuente
@EricWang Creo que quieres decir que write backtiene un mejor rendimiento.
wlnirvana
@wlnirvana Sí, tienes razón, es mi error administrativo. Lo eliminaría y agregaría un nuevo comentario aquí para evitar engaños en el futuro.
Eric Wang
6
En pocas palabras, write backtiene un mejor rendimiento, porque escribir en la memoria principal es mucho más lento que escribir en el caché de la CPU, y los datos pueden ser cortos durante (los medios pueden cambiar nuevamente antes y no es necesario poner la versión anterior en la memoria). Es complejo, pero más sofisticado, la mayor parte de la memoria en la CPU moderna utiliza esta política.
Eric Wang
Veo que se ha dado una respuesta explicativa. Le aconsejo que consulte las etiquetas Write-Allocate, Write-NoAllocate después de cubrir el algoritmo de escritura diferida.
Çağlayan DÖKME
La respuesta a su pregunta es que con el almacenamiento en caché de escritura simultánea, cuando se escribe dentro del mismo bloque, solo se necesita una escritura en la memoria principal. Vea mi respuesta para más detalles.
qwr

Respuestas:

111

El beneficio de la escritura directa en la memoria principal es que simplifica el diseño del sistema informático. Con la escritura simultánea, la memoria principal siempre tiene una copia actualizada de la línea. Entonces, cuando se realiza una lectura, la memoria principal siempre puede responder con los datos solicitados.

Si se utiliza la escritura diferida, a veces los datos actualizados se encuentran en la memoria caché del procesador y, a veces, en la memoria principal. Si los datos están en la memoria caché de un procesador, entonces ese procesador debe evitar que la memoria principal responda a la solicitud de lectura, porque la memoria principal puede tener una copia obsoleta de los datos. Esto es más complicado que la escritura completa.

Además, la escritura directa puede simplificar el protocolo de coherencia de la caché porque no necesita el estado Modificar . El estado Modificar registra que la caché debe volver a escribir la línea de la caché antes de invalidar o desalojar la línea. En la escritura simultánea, una línea de caché siempre se puede invalidar sin volver a escribir, ya que la memoria ya tiene una copia actualizada de la línea.

Una cosa más: en un software de arquitectura de escritura diferida que escribe en registros de E / S asignados en memoria, se deben realizar pasos adicionales para asegurarse de que las escrituras se envíen inmediatamente fuera de la caché. De lo contrario, las escrituras no son visibles fuera del núcleo hasta que otro procesador lee la línea o la línea es expulsada.

Craig S. Anderson
fuente
7
Para las E / S asignadas en memoria, esas direcciones generalmente se asignan como no almacenadas en caché. La escritura directa también se puede usar para aumentar la confiabilidad (por ejemplo, si L1 solo tiene protección de paridad y L2 tiene ECC). La escritura directa también es más popular para los cachés más pequeños que utilizan la asignación sin escritura (es decir, un error de escritura no asigna el bloque al caché, lo que reduce potencialmente la demanda de capacidad L1 y ancho de banda de lectura / relleno L1 L2) ya que gran parte del hardware El requisito de escritura directa ya está presente para dicha escritura.
Paul A. Clayton
1
¿Es posible verificar si mi método de caché en mi núcleo es de escritura diferida o de escritura continua?
ArtificiallyIntelligence
4
Puede ser engañoso decir que la escritura diferida es más compleja porque el procesador debe evitar que la memoria principal responda a la solicitud de lectura. Es más que el caché realiza un seguimiento de qué datos son datos (no alineados con la memoria principal) y cuáles no mediante el uso de "bit (s) sucios", por lo que es posible no verificar la memoria principal en absoluto.
steviejay
Comando @Shaowu "lshw" que muestra capacidades de caché como "escritura interna asíncrona"
mug896
Sigo sin entender cuáles son los pasos reales que se utilizan en la reescritura, pero sé que es complicado ... ¿Podría proporcionar más recursos / detalles al respecto?
qwerty9898
10

Veamos esto con la ayuda de un ejemplo. Supongamos que tenemos un caché mapeado directamente y se usa la política de escritura. Entonces tenemos un bit válido, un bit sucio, una etiqueta y un campo de datos en una línea de caché. Supongamos que tenemos una operación: escribe A (donde A se asigna a la primera línea de la caché).

Lo que sucede es que los datos (A) del procesador se escriben en la primera línea de la caché. Se establecen los bits válidos de bit y tag. El bit sucio se establece en 1.

El bit sucio simplemente indica que la línea de caché se escribió desde la última vez que se introdujo en la caché.

Ahora suponga que se realiza otra operación: leer E (donde E también se asigna a la primera línea de caché)

Dado que tenemos caché mapeado directo, la primera línea puede simplemente ser reemplazada por el bloque E que se traerá de la memoria. Pero dado que el bloque escrito por última vez en la línea (bloque A) aún no está escrito en la memoria (indicado por el bit sucio), el controlador de caché primero emitirá una escritura de nuevo en la memoria para transferir el bloque A a la memoria, luego reemplazará la línea con el bloque E emitiendo una operación de lectura en la memoria. El bit sucio ahora se establece en 0.

Por tanto, la política de reescritura no garantiza que el bloque sea el mismo en la memoria y su línea de caché asociada. Sin embargo, siempre que la línea esté a punto de ser reemplazada, primero se realiza una escritura.

Una política de escritura completa es todo lo contrario. Según esto, la memoria siempre tendrá un dato actualizado. Es decir, si se escribe el bloque de caché, la memoria también se escribirá en consecuencia. (sin uso de trozos sucios)

Rajat
fuente
7

tal vez este artículo pueda ayudarte a vincular aquí

Escritura simultánea: la escritura se realiza de forma sincrónica tanto en la memoria caché como en el almacén de respaldo.

Escritura no simultánea (o escritura diferida): la escritura se realiza solo en la caché. Un bloque de caché modificado se vuelve a escribir en la tienda, justo antes de reemplazarlo.

Escritura simultánea: cuando se actualizan los datos, se escriben tanto en la memoria caché como en el almacenamiento de fondo. Este modo es fácil de operar, pero es lento en la escritura de datos porque los datos deben escribirse tanto en la memoria caché como en el almacenamiento.

Escritura no simultánea: cuando se actualizan los datos, solo se escriben en la caché. Los datos modificados se escriben en el almacenamiento de fondo solo cuando los datos se eliminan de la caché. Este modo tiene una velocidad de escritura de datos rápida, pero los datos se perderán si ocurre un corte de energía antes de que los datos actualizados se escriban en el almacenamiento.

Shengmin Zhao
fuente
3

La escritura no simultánea y la escritura simultánea describen las políticas cuando se produce un acierto de escritura , es decir, cuando la memoria caché tiene la información solicitada. En estos ejemplos, asumimos que un solo procesador está escribiendo en la memoria principal con caché.

Escritura simultánea : la información se escribe en la memoria caché y en la memoria, y la escritura finaliza cuando ambos han terminado. Esto tiene la ventaja de ser más simple de implementar, y la memoria principal siempre es consistente (sincronizada) con la caché (para el caso de un procesador, si algún otro dispositivo modifica la memoria principal, entonces esta política no es suficiente), y un error de lectura nunca resulta en escrituras en la memoria principal. La desventaja obvia es que cada golpe de escritura tiene que realizar dos escrituras, una de las cuales accede a la memoria principal más lenta.

Escritura no simultánea: la información se escribe en un bloque de la caché. El bloque de caché modificado solo se escribe en la memoria cuando se reemplaza (en efecto, una escritura diferida ). Un bit especial para cada bloque de caché, el bit sucio , marca si el bloque de caché se ha modificado o no mientras estaba en el caché. Si no se establece el bit sucio, el bloque de caché está "limpio" y un error de escritura no tiene que escribir el bloque en la memoria.

La ventaja es que las escrituras pueden ocurrir a la velocidad de la caché, y si se escribe dentro del mismo bloque, solo se necesita una escritura en la memoria principal (cuando se reemplaza el bloque anterior). Las desventajas son que este protocolo es más difícil de implementar, la memoria principal puede no ser consistente (no sincronizada) con la caché, y las lecturas que resultan en reemplazo pueden causar escrituras de bloques sucios en la memoria principal.

Las políticas para un error de escritura se detallan en mi primer enlace.

Estos protocolos no se ocupan de los casos con múltiples procesadores y múltiples cachés, como es común en los procesadores modernos. Para ello, se requieren mecanismos de coherencia de caché más complicados . Los cachés de escritura directa tienen protocolos más simples, ya que una escritura en el caché se refleja inmediatamente en la memoria.

Buenos recursos:

qwr
fuente
0

La escritura diferida es más compleja y requiere un protocolo de coherencia de caché (MOESI) complicado, pero vale la pena, ya que hace que el sistema sea rápido y eficiente.

El único beneficio de Write-Through es que hace que la implementación sea extremadamente simple y no se requiere un protocolo de coherencia de caché complicado.

Gaurav Toshniwal
fuente
1
WT todavía necesita un protocolo de coherencia. Una tienda de un núcleo aún necesita invalidar las copias en otras cachés para que no sigan leyendo datos obsoletos de forma indefinida. Atomic RMW necesita un soporte especial. Todo esto es más fácil con WT, creo, pero la coherencia requerida sigue siendo algo complicada.
Peter Cordes
O tal vez estaba hablando de un sistema de un solo núcleo con una jerarquía de caché de L1 / L2 (y tal vez más). En ese caso, realmente no tiene que usar MESI / MOESI para cachés internos que se recuperan a través de cachés externos, a menos que desee admitir DMA coherente en caché que pueda acceder a la dirección de caché más externa. Pero aún necesita coherencia para que una escritura DMA invalide el caché interno.
Peter Cordes
1
El protocolo de coherencia de caché solo es necesario si es necesario admitir múltiples cachés / procesadores o si algo afecta la memoria como DMA. La escritura directa tiene sus ventajas incluso para sistemas con un solo procesador, a saber, la velocidad de escritura.
qwr
Para DMA, el sistema operativo puede vaciar explícitamente la caché después de la E / S. Al ser software, es menos eficiente.
qwr