2012-01-15 14 views
5

Supongamos que hay dos hilos ejecutándose en x86 CPU0 y CPU1 respectivamente. Hilo que se ejecuta en la CPU0 ejecuta los siguientes comandos:¿Están dos tiendas de CPU consecutivas en x86 en el caché manteniendo el orden?

A=1 
B=1 

línea de caché que contiene un principio propiedad de CPU1 y que contiene B propiedad de CPU0.

Tengo dos preguntas:

  1. Si he entendido bien, ambas tiendas se pondrán en memoria intermedia de almacenamiento de la CPU. Sin embargo, para la primera tienda A=1, la memoria caché de la CPU1 debe invalidarse, mientras que la segunda tienda B=1 puede enjuagarse inmediatamente ya que la CPU0 posee la línea de caché que la contiene. Sé que la CPU x86 respeta las órdenes de la tienda. ¿Eso significa que B=1 no se escribirá en el caché antes del A=1?

  2. Supongamos en CPU1 los siguientes comandos se ejecutan:

mientras que (B = 0);
impresión A

¿Es suficiente con añadir solamente lfence entre las while y print comandos en CPU1 sin añadir un sfence entre A=1 y B=1 en CPU0 conseguir 1 siempre impreso en x86?

while (B=0); 
lfence 
print A 
+0

Incluso si x86 lo garantiza, ¿por qué correr el riesgo? ¿Por qué no usar las barreras adecuadas? –

+1

Zan, puede ser una ventaja en muchos lugares si la CPU lo garantiza. Por ejemplo, los spinlocks se implementan sin usar ningún prefijo de bloqueo en kernel porque pueden permitírselo. Y la valla no es la solución a esta pregunta, de lo contrario, uno necesita usar un candado adecuado. – Saurabh

+0

La respuesta a la ** 1ª pregunta: Sí **. La respuesta a la pregunta ** 2-nd: sí, pero solo en el ensamblador (no en C/C++) **. Como se dijo correctamente, 'LFENCE' aquí no es necesario en x86 - proporciona consistencia de adquisición automáticamente. Tenga en cuenta que la CPU x86 no puede reordenar 'load' y las siguientes instrucciones, pero C/C++ puede reordenarlo. En C++, debes usar ** adquirir consistencia **: 'extern std :: atomic B;' 'while (B.load (std :: memory_order_acquire) == 0);' 'std :: cout << A; http://en.cppreference.com/w/cpp/atomic/memory_order – Alex

Respuesta

8

En x86, todos los procesadores observan las escrituras de un solo procesador en el mismo orden. No es necesario delimitar en su ejemplo, ni en ningún programa normal en x86. Su programa:

while(B==0); // wait for B == 1 to become globally observable 
print A;  // now, A will always be 1 here 

Lo que ocurre exactamente en la caché es específico del modelo. Se pueden producir todo tipo de trucos y comportamientos especulativos en la memoria caché, pero el comportamiento observable siempre sigue las reglas.

Consulte la Guía de programación del sistema Intel, Volumen 3, sección 8.2.2. para los detalles sobre ordenar la memoria.

Cuestiones relacionadas