6

Con respecto a esta pregunta, solo estoy interesado en x86 y x86-64.

Para MSVC 2005, la documentación para __faststorefence dice: "Garantías que cada tienda precedente es visible globalmente antes de cualquier posterior tienda."

Para MSVC 2008 y 2010, se cambió a: "Garantías que cada anterior referencia de memoria, incluyendo tanto la carga y almacenamiento referencias a memoria, es visible globalmente antes de que cualquier referencia posterior memoria."

La forma en que se escribe esta última, implica en mi opinión que esto también bloquearía el reordenamiento de cargas de la CPU antes que las tiendas más antiguas. Esto es diferente de la primera definición, lo que implica que lo intrínseco es solo para tratar con el bloqueo o el reordenamiento de tiendas no temporales con tiendas más antiguas (el único otro reordenamiento x86 (-64) lo hace).

Sin embargo, a continuación, la documentación parece contradecirse: "En la plataforma x64, esta rutina genera una instrucción que es un valla tienda más rápido que el instrucción sfence Utilice esta intrínseca en lugar de _mm_sfence en la plataforma x64. "

Esto implica que todavía tiene una funcionalidad parecida a la de una barrera, y por lo tanto las cargas se pueden reordenar con almacenes más antiguos. Entonces, ¿cuál es? ¿Alguien puede aclarar mi confusión?

PD: buscando una versión GCC de esta función, me encontré con long local; __asm__ __volatile__("lock; orl $0, %0;" : : "m"(local)); pero creo que es de código de 32 bits; ¿cuál sería el análogo de 64 bits?
¿Cuál es el comportamiento de __faststorefence?

+7

¿Puedes posiblemente dar un título de pregunta mejor que '__faststorefence'? –

+1

@JaredFarrish: ¿Mejor tarde que nunca? :) – GManNickG

Respuesta

2

La versión de GCC que cita es equivalente al código que genera MSVC. Se basa en el hecho de que la arquitectura del procesador x86/x86-64 especifica que las cargas y los almacenes no se reordenan con una instrucción de edición LOCK.

No estoy seguro de si esto se aplica a las tiendas no temporales, ya que, en general, las restricciones del modelo de memoria no se aplican a esas instrucciones.

+0

Hola Anthony, gracias por la respuesta. Lo que no está claro es por qué la documentación para este intrínseco especifica que es más rápido en la plataforma x64, en lugar de en 32 y 64. ¿Significa implicar que una instrucción bloqueada es más barata que una defensa solo en x86-64? Además, si evita que se reordenen tanto las cargas como las tiendas, ¿es esto una valla suficiente para la coherencia secuencial (excluyendo el caso de las tiendas no temporales)? –

+1

Este intrínseco solo está disponible en MSVC en x86-64; No sé por qué. Yo esperaría que tenga el mismo costo en x86-64 que en x86 con respecto a 'MFENCE', ya que la arquitectura es esencialmente la misma. Si ignora las tiendas no temporales, entonces esta es una valla suficiente para la coherencia secuencial. –

Cuestiones relacionadas