threads thread que programacion multihilos multi definicion multithreading concurrency memory-barriers

multithreading - que - processor threads



¿Intel SFENCE tiene semántica de lanzamiento? (1)

LFENCE no tiene semántica de adquisición; SFENCE no tiene semántica de lanzamiento. Hay una buena razón para eso: tener una instrucción de cerca independiente con semántica de adquisición, o semántica de lanzamiento, resulta ser casi completamente inútil. Para que una adquisición / liberación sea útil, debe estar vinculada a una operación de memoria.

Por ejemplo, considere la expresión común para enviar datos entre dos hilos:

  1. El procesador A escribe en un búfer.
  2. El procesador A escribe "verdadero" en una bandera.
  3. El procesador B espera hasta que la bandera sea verdadera.
  4. El procesador B lee el buffer.

Tenga en cuenta que el procesador A debe asegurarse de que su escritura en el marcador se ve después de escribir en el búfer. Ahora supongamos que tenemos una instrucción "RFENCE" que es una valla de liberación. Si ponemos la instrucción inmediatamente después del paso (1), no sirve de nada, porque la escritura en el paso 2 puede migrar hacia arriba sobre RFENCE y hacia arriba sobre el paso 1.

Un argumento similar muestra que una instrucción "AFENCE" que realiza una adquisición es igualmente inútil para garantizar que la lectura de la bandera en el paso 3 no parezca migrar hacia abajo en el paso 4.

Itanium resolvió el problema de forma elegante proporcionando instrucciones de escritura con liberación y carga con adquisición que vinculan la guía a una operación de memoria.

De vuelta a IA-32 e Intel64: si un programa no usa instrucciones "no temporales", entonces las instrucciones restantes se comportan como si cada carga hiciera una "adquisición" y cada tienda hace una "liberación". Consulte la Sección 8.2.3 (y subsecciones) de las arquitecturas Intel® 64 y IA-32 Manual del desarrollador: vol. 3A . Si hay tiendas "no temporales" involucradas, tiene varias formas de hacer cumplir una valla:

  • Utilice SFENCE
  • Usa MEFENCE - algo exagerado
  • Use una instrucción con prefijo LOCK (como "LOCK INC") para escribir la bandera. Las instrucciones con prefijo LOCK implícitamente tienen MFENCEs.
  • Use XCHG, que actúa como si tuviera un prefijo LOCK implícito, para escribir la bandera.

Por ejemplo, si en el idioma anterior, el búfer se escribe utilizando tiendas no temporales, haga que el procesador A emita un SFENCE o MFENCE entre los pasos 1 y 2. O use XCHG para escribir el indicador.

Todas las observaciones anteriores se aplican al hardware. Cuando utilice un lenguaje de alto nivel, asegúrese de que el compilador no dañe el orden crítico de los eventos. La biblioteca de operaciones atómicas C ++ 11 existe para que pueda decirle al compilador y al hardware lo que desea.

Parece que la definición aceptada de semántica de adquisición y lanzamiento es algo como esto: (Citado de http://msdn.microsoft.com/en-us/library/windows/hardware/ff540496(v=vs.85).aspx )

Una operación tiene semántica de adquisición si otros procesadores verán siempre su efecto antes del efecto de cualquier operación posterior. Una operación tiene semántica de liberación si otros procesadores verán el efecto de cada operación anterior antes del efecto de la operación misma.

He leído brevemente sobre la existencia de la mitad de barreras de memoria y supuestamente vienen en sabor de adquirir barreras y liberar barreras siguiendo la misma semántica descrita anteriormente.

Buscando ejemplos reales de instrucciones de hardware, encontré SFENCE. Y este blog ( http://peeterjoot.wordpress.com/2009/12/04/intel-memory-ordering-fence-instructions-and-atomic-operations/ ) dice que es una forma de liberación / barrera:

Intel proporciona una instrucción de valla bidireccional MFENCE, una valla de adquisición LFENCE y una valla de liberación SFENCE.

Sin embargo, al leer la definición de SFENCE, no parece proporcionar la semántica de lanzamiento en el sentido de que no se sincroniza con las cargas en absoluto? Mientras que la semántica de liberación, como lo entiendo, define el orden con respecto a todas las operaciones de memoria (cargas y almacenamientos).