Estoy leyendo Memory Barriers por Paul E. McKenney http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf todo se explica en gran detalle y cuando veo que todo está claro me encuentro con una frase que lo embrutece todo y me hace pensar que no entendí nada Te voy a enseñar el ejemploCercas de memoria - Necesito ayuda para entender
void foo(void)
{
a = 1; #1
b = 1; #2
}
void bar(void)
{
while (b == 0) continue; #3
assert(a == 1); #4
}
digamos que estas dos funciones se ejecutan en un diferentes procesadores. Ahora, lo que podría suceder es almacenar en un # 1 podría ser visto después de la tienda en b # 2 por el segundo procesador, porque las colas del primer procesador se almacenan en "a" y proceden a almacenar instrucciones b. OK, está bien, agregamos una valla de escritura en la línea entre # 1 y # 2, pero este código todavía puede fallar, porque el segundo procesador puede poner en cola el mensaje invalidado, así que agregamos una valla de memoria más (lea esta vez) en la línea entre # 4 y # 4. Mensajes
void foo(void)
{
a = 1; #1
write_memory_barrier();
b = 1; #2
}
void bar(void)
{
while (b == 0) continue; #3
read_memory_barrier();
assert(a == 1); #4
}
esta valer segundo procesador para procesar todo en cola (invalidar una) y leerlo de nuevo mediante el envío leyó el mensaje MESI al primer procesador en # 4. DE ACUERDO. A continuación, el artículo dice
Muchas arquitecturas de CPU, por lo tanto proporcionan más débil memoria de barrera instrucciones que hacen sólo uno o el otro de estos dos. En general, una "barrera de memoria de lectura" marca solo la cola de invalidación y una "barrera de memoria de escritura " marca solo el almacenamiento intermedio. mientras que una barrera de memoria hecha y derecha hace ambas cosas.
Gran, eso está claro, pero después de eso ver esta
El efecto de esto es que una lectura órdenes de barrera memoria sólo cargas en la CPU que ejecuta, de manera que todos los cargas precediendo a la memoria de lectura , la barrera parecerá haber completado antes de cualquier carga después de leer la barrera de memoria . Del mismo modo, una escritura de memoria órdenes de barrera sólo almacena, nuevo en la CPU que ejecuta, y de nuevo para que todas las tiendas anteriores a la barrera de memoria escritura aparecerán a han completado antes de cualquier tienda después de la barrera de la memoria de escritura.
por lo
todas las cargas anteriores a la barrera de la memoria de lectura se parecen haber completado antes de cualquier carga siguiente la barrera de memoria de lectura
que mezcla todo lo que se ha explicado antes. Qué significa eso? ¿Qué carga en la función "barra" debe completarse antes de la carga de "a" # 4? Entiendo que la afirmación puede fallar sin barrera de memoria en esta función solo porque el procesador puede leer un valor anterior, porque aún no logró invalidar su línea de caché, donde se encuentra el objeto "a".
Explicación en detalles sería realmente útil, estoy tratando de entender todo el día.
Muchas gracias de antemano.
Gracias por su respuesta, pero si echamos un vistazo al ejemplo del punto 4.3 en el artículo vemos un ejemplo, cuando en realidad todas las lecturas de b (n. ° 3) preceden a la lectura de una barrera de memoria sin confirmación. 1 ejecuta la afirmación (a == 1) y, dado que el valor anterior de "a" aún está en la memoria caché de la CPU 1, , esta afirmación falla. – confucius
En el código fijo (con barrera de lectura), la CPU 1 ejecuta la afirmación (a == 1) y, desde , la línea de caché que contiene "a" ya no está en Caché de CPU 1 (porque la barrera de lectura forzó a invalidar la línea de caché), transmite un mensaje de "lectura". – confucius
Así que no es solo un pedido, ¿verdad? No veo cómo se podría explicar con solo decir que obliga a ordenar. Creo que hay algo que no entiendo, algunos detalles fundamentales, que no me permite unir toda la información que tengo y obtener la imagen final. – confucius