assembly locking x86 intel memory-fences

assembly - Intel 64 y IA-32 | Operaciones atómicas que incluyen semántica de adquisición/liberación



locking x86 (2)

Según el Manual del desarrollador de software Intel 64 e IA-32 Architectures, el Prefijo de señal LOCK "asegura que el procesador tiene uso exclusivo de cualquier memoria compartida mientras se afirma la señal". Eso puede ser una forma de un bus o un bloqueo de caché.

Pero, y esa es la razón por la que hago esta pregunta, no está claro para mí si este Prefijo también proporciona alguna barrera de memoria.

Estoy desarrollando NASM en un entorno de múltiples procesadores y necesito implementar operaciones atómicas con adquisición y / o semántica de lanzamiento opcionales.

Entonces, ¿necesito usar las instrucciones MFENCE, SFENCE y LFENCE o sería redundante?


No, no es necesario utilizar las instrucciones MFENCE, SFENCE and LFENCE en relación con el prefijo LOCK .

MFENCE, SFENCE and LFENCE garantizan la visibilidad de la memoria en todos los núcleos de la CPU. Por ejemplo, la instrucción MOV no se puede usar con el prefijo LOCK , por lo que para asegurarnos de que todos los núcleos de la CPU puedan ver el resultado del movimiento de la memoria, debemos asegurarnos de que el caché de la CPU se vacíe a la RAM y que lleguemos con las instrucciones de la cerca.

EDITAR: más sobre las operaciones atómicas bloqueadas del manual de Intel:

OPERACIONES ATÓMICAS BLOQUEADAS

Los procesadores IA-32 de 32 bits admiten operaciones atómicas bloqueadas en ubicaciones en la memoria del sistema. Estas operaciones se usan generalmente para administrar estructuras de datos compartidos (como semáforos, descriptores de segmentos, segmentos de sistema o tablas de páginas) en los que dos o más procesadores pueden intentar modificar simultáneamente el mismo campo o bandera. El procesador usa tres mecanismos interdependientes para llevar a cabo operaciones atómicas bloqueadas:

• Operaciones atómicas garantizadas

• Bloqueo de bus, usando la señal LOCK # y el prefijo de instrucción LOCK

• Protocolos de coherencia de caché que aseguran que las operaciones atómicas se pueden llevar a cabo en estructuras de datos en caché (bloqueo de caché); este mecanismo está presente en los procesadores de la familia Pentium 4, Intel Xeon y P6

Estos mecanismos son interdependientes de las siguientes maneras. Ciertas transacciones básicas de memoria (como leer o escribir un byte en la memoria del sistema) siempre están garantizadas para ser manejadas atómicamente. Es decir, una vez que se inicia, el procesador garantiza que la operación se completará antes de que otro procesador o agente de bus tenga acceso a la ubicación de la memoria. El procesador también admite el bloqueo de bus para realizar operaciones de memoria seleccionadas (como una operación de lectura, modificación y escritura en un área compartida de memoria) que, por lo general, deben manejarse atómicamente, pero no se manejan automáticamente de esta manera. Debido a que las ubicaciones de memoria frecuentemente utilizadas a menudo se almacenan en caché en los cachés L1 o L2 de un procesador, las operaciones atómicas a menudo se pueden llevar a cabo dentro de los cachés de un procesador sin hacer valer el bloqueo del bus. Aquí los protocolos de coherencia de caché del procesador aseguran que otros procesadores que almacenan en caché las mismas ubicaciones de memoria se administren adecuadamente mientras se realizan las operaciones atómicas en las ubicaciones de memoria en caché.


No. De los manuales IA32 (Volumen 3A, Capítulo 8.2: Pedido de memoria ):

Las lecturas o escrituras no pueden reordenarse con instrucciones de E / S, instrucciones bloqueadas o instrucciones de serialización.

Por lo tanto, no se necesita una instrucción de valla con instrucciones bloqueadas.