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?
Respuesta
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.
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)? –
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. –
- 1. ¿cuál es el comportamiento esperado?
- 2. ¿Cuál es el comportamiento de la división de enteros?
- 3. ¿Cuál es el comportamiento predeterminado del Método Equals?
- 4. ¿Cuál es la causa de este extraño comportamiento de Java?
- 5. Comportamiento de retroceso en la instrucción Python, ¿cuál es el comportamiento correcto de imprimir un '\ b' en el código?
- 6. ¿Cuál es el comportamiento del especificador de conversión `p` con el puntero` NULL`?
- 7. ¿Cuál es el comportamiento de Thread.join() en Java si el objetivo aún no se ha iniciado?
- 8. ¿Cuál es la mejor manera de anular el comportamiento de destrucción de ActiveRecord de Rails?
- 9. ¿Cuál es el comportamiento estándar de flotación: justo después de flotar: izquierda?
- 10. ¿Cuál es la forma correcta de cambiar el comportamiento de una etiqueta <a>?
- 11. ¿Cuál es el comportamiento de rubí Hash # de mezcla cuando se utiliza con un bloque
- 12. ¿Cuál es la mejor herramienta para admitir el desarrollo impulsado por el comportamiento en Python?
- 13. ¿Cuál es el comportamiento indefinido/no especificado común para C con el que te encuentras?
- 14. cakephp: ¿cuál es la diferencia entre el modelo y el comportamiento?
- 15. ¿cuál es el comportamiento estándar cuando la etiqueta < button > hace clic? ¿enviará el formulario?
- 16. Es el comportamiento del retorno x ++; definido?
- 17. ¿Es (++ i) ++ comportamiento indefinido?
- 18. ¿Cuál es el comportamiento predeterminado de MySQL JOIN, INNER u OUTER?
- 19. JPA: ¿Cuál es el comportamiento de la fusión con la colección inicializada perezosa?
- 20. ¿Cuál es el comportamiento adecuado para un agente de Paxos en este escenario?
- 21. ¿Cuál es el fundamento del comportamiento de la palabra clave "this" en JavaScript?
- 22. ¿Cuál es el comportamiento de usuario más irracional del que ha sido testigo?
- 23. prevenir el comportamiento de anclaje
- 24. el comportamiento de "Identificación const"
- 25. ¿Cuál es el método predeterminado de HTTP?
- 26. ¿Cuál es la diferencia en el comportamiento indefinido entre C++ 03 y C++ 11?
- 27. ¿Cuál es el comportamiento correcto cuando ambas texturas, 1D y 2D, están vinculadas en OpenGL?
- 28. ¿Es este comportamiento indefinido const_cast?
- 29. ¿Cuál es el verbo = "*"?
- 30. ¿Cuál es el significado de []
¿Puedes posiblemente dar un título de pregunta mejor que '__faststorefence'? –
@JaredFarrish: ¿Mejor tarde que nunca? :) – GManNickG