Pregunta

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

Pero, y esa es la razón por la que estoy haciendo esta pregunta, no está claro para mí, si este prefijo también proporciona algún barrador de memoria.

Estoy desarrollando con NASM en un entorno multiprocesador y necesito implementar operaciones atómicas con semántica de adquisición y/o liberación opcionales.

Entonces, ¿necesito usar las instrucciones Mfence, Sfence y Lfence o esto sería redundante?

¿Fue útil?

Solución

No, no hay necesidad de usar instrucciones MFENCE, SFENCE and LFENCE en relación con LOCK prefijo.

MFENCE, SFENCE and LFENCE La instrucción garantiza la visibilidad de la memoria en todos los núcleos de CPU. A instancias de la MOV La instrucción no se puede usar con LOCK Prefijo, para asegurarnos de que el resultado del movimiento de la memoria sea visible para todos los núcleos de CPU, debemos asegurarnos de que la caché de la CPU esté enjuagada a RAM y que llegamos con las instrucciones de la cerca.

EDITAR: Más sobre 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 generalmente se utilizan para administrar estructuras de datos compartidas (como semáforos, descriptores de segmentos, segmentos de sistema o tablas de página) en las que dos o más procesadores pueden intentar simultáneamente modificar el mismo campo o indicador. El procesador utiliza tres mecanismos interdependientes para llevar a cabo operaciones atómicas bloqueadas:

• Operaciones atómicas garantizadas

• Bloqueo de bus, utilizando la señal de bloqueo y el prefijo de instrucciones de bloqueo

• Protocolos de coherencia de caché que aseguran que las operaciones atómicas se puedan 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. Siempre se garantiza que ciertas transacciones de memoria básica (como leer o escribir un byte en la memoria del sistema) se manejarán atómicamente. Es decir, una vez iniciado, 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 del bus para realizar operaciones de memoria seleccionadas (como una operación de lectura-modificación-escritura en un área de memoria compartida) que generalmente necesita ser manejado atómicamente, pero no se manejan automáticamente de esta manera. Debido a que las ubicaciones de memoria de uso frecuente 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 afirmar 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 administran correctamente, mientras que las operaciones atómicas se realizan en ubicaciones de memoria en caché.

Otros consejos

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

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

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

El problema aún ocurre cuando Intel_lock1.c (disponible en la URL anterior) se compila en Linux con GCC 5 o 7 sin ninguno de los args '-d_with_clflush_' o '-d_with_hle_' (de modo que no se usan clflush* ni hle xacquire)-el El ensamblador mutex_lock ahora parece:

# 74 "intel_lock1.c" 1
    LFENCE
    lock subl   $1, lck(%rip)
    rep nop
    SFENCE

Entonces, estoy tratando de reemplazar la cerca {L, S} con Mfence.

Sin embargo, todavía no entiendo cómo dos hilos pueden terminar con el mismo valor de -1 *lck.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top