2010-10-22 23 views
11

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.

Respuesta

10

¿Qué significa?

Esto significa que si usted tiene:

read 
read 
read 
READ BARRIER 
read 
read 
read 

entonces la barrera de lectura actúa como un "punto de unión" dividiendo estas lecturas en dos lotes. Todas las lecturas que preceden a la barrera de lectura se habrán realizado antes de que se inicie cualquier lectura que siga a la barrera de lectura.

¿Qué cargas en bar() deben completarse antes de que comience la carga de a (# 4)?

Todas las lecturas de b (# 3) están forzadas a preceder a cualquier lectura de a (# 4). Esto significa que a no se lee hasta que b ya no sea 0. Debido a que foo() utiliza una barrera de escritura para asegurarse de que a ya se cambió a (n. ° 1) cuando se cambia b (n. ° 2). Por lo tanto, las dos barreras trabajan juntas para garantizar que la declaración de afirmación siempre tenga éxito.

+0

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

+0

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

+0

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

Cuestiones relacionadas