2012-01-27 14 views
7

Tengo un conjunto y prueba xchg basado en bloqueo de ensamblaje. mi pregunta es:Necesitamos mfence cuando usamos xchg

¿Necesitamos usar cercas de memoria (mfence, sfence o lfence) cuando se utiliza xchg instrucción?

Editar:

64 plataforma de bits: con Intel Nehalem

+1

¿Qué plataforma/CPU? –

Respuesta

11

Como se dijo en las otras respuestas, el prefijo de bloqueo es implícito, así que no hay ningún problema en el nivel del ensamblador. El problema puede estar en el nivel C (o C++) cuando lo usa como ensamblador en línea. Aquí debe asegurarse de que el compilador no vuelva a ordenar las instrucciones con respecto a su xchg. Si se está empleando gcc (o primos) lo más habitual es hacer algo como:

__asm__ __volatile__("xchgl %1, %0" 
         : "=r"(ret) 
         : "m"(*point), "0"(ret) 
         : "memory"); 

que se declare la instrucción tan volátil y agregue el clobber "memoria".

+4

+1 para el clobber de "memoria". –

5

xchg está garantizada para compilar en algo, que asegure la consistencia en el nivel de hardware.

+0

Supongo que el downvote proviene del uso de "compilar" en lugar de "ensamblar" o lo que sea: Lección aprendida: Polish my english. Aunque estoy de acuerdo con el contenido. –

+0

Suponiendo que usa el prefijo LOCK, por supuesto. –

+8

@Daniel: Según [esto] (http://stackoverflow.com/questions/3144335/on-a-multicore-x86-is-a-lock-necessary-as-a-prefix-to-xchg) the ' el prefijo lock' está implícito para 'xchg' y, por lo tanto, no es explícitamente necesario para x86. – Grizzly

12

De acuerdo con el Capítulo 8 autobús de bloqueo, de la Intel 64 y 3A Manual, Volumen IA-32 arquitecturas de software del desarrollador

El modelo de memoria de pedidos evita cargas y almacenamientos de ser reordenado con bloqueada instrucciones que se ejecutan antes o después.

Por lo tanto, la instrucción XCHG bloqueada actúa como una barrera de memoria, y no se necesita ninguna barrera adicional.

+1

Sí, de acuerdo con la sección 8.1.2.2 del manual mencionado, la instrucción 'XCHG' siempre está bloqueada si hace referencia a la memoria, incluso si no hay un prefijo LOCK especificado para ella. Por lo tanto, la regla de ordenamiento de memoria mencionada anteriormente debería aplicarse y no se necesita ninguna barrera adicional. – Eugene

-1

xchg instrucción tiene un prefijo de bloqueo implícito según los manuales de Intel.

Cuestiones relacionadas