¿Qué se entiende por utilizar una barrera de memoria explícita?
fuente
¿Qué se entiende por utilizar una barrera de memoria explícita?
Para obtener ganancias de rendimiento, las CPU modernas a menudo ejecutan instrucciones fuera de orden para aprovechar al máximo el silicio disponible (incluidas las lecturas / escrituras de memoria). Debido a que el hardware refuerza la integridad de las instrucciones, nunca se da cuenta de esto en un solo hilo de ejecución. Sin embargo, para varios subprocesos o entornos con memoria volátil (por ejemplo, E / S mapeadas en memoria), esto puede conducir a un comportamiento impredecible.
Una valla / barrera de memoria es una clase de instrucciones que significan que las lecturas / escrituras de memoria ocurren en el orden esperado. Por ejemplo, una 'valla completa' significa que todas las lecturas / escrituras antes de la valla se realizan antes que las posteriores a la valla.
Tenga en cuenta que las vallas de memoria son un concepto de hardware. En los lenguajes de nivel superior, estamos acostumbrados a tratar con mutex y semáforos; estos pueden implementarse utilizando cercas de memoria en el nivel bajo y no es necesario el uso explícito de barreras de memoria. El uso de barreras de memoria requiere un estudio cuidadoso de la arquitectura del hardware y se encuentra más comúnmente en los controladores de dispositivos que en el código de la aplicación.
El reordenamiento de la CPU es diferente de las optimizaciones del compilador, aunque los artefactos pueden ser similares. Debe tomar medidas independientes para evitar que el compilador reordene sus instrucciones si eso puede causar un comportamiento no deseado (por ejemplo, el uso de la palabra clave volátil en C).
Copiando mi respuesta a otra pregunta, ¿Cuáles son algunos trucos que hace un procesador para optimizar el código? :
fuente
Alpha is known for being the weakest
, ¿por quéweakest
? ¿No es mejor que reordene más, por lo que será una ejecución mucho más rápida? (No soy un usuario alfa, pero estoy preguntando sobre el efecto devery reordering
vsrestricted reordering
). Entonces, ¿cuáles son las desventajas del reordenamiento de lotes?En mi experiencia, se refiere a una barrera de memoria , que es una instrucción (explícita o implícita) para sincronizar el acceso a la memoria entre múltiples subprocesos.
El problema se produce en la combinación de compiladores agresivos modernos (tienen una libertad asombrosa para reordenar las instrucciones, pero generalmente no saben nada de sus subprocesos) y CPU multinúcleo modernas.
Una buena introducción al problema es la " Declaración 'El bloqueo doble verificado está roto' ". Para muchos, fue la llamada de atención para que haya dragones.
Las barreras implícitas de memoria completa generalmente se incluyen en las rutinas de sincronización de subprocesos de la plataforma, que cubren su núcleo. Sin embargo, para la programación sin bloqueos y la implementación de patrones de sincronización livianos y personalizados, a menudo solo necesita la barrera, o incluso una barrera unidireccional.
fuente
Wikipedia lo sabe todo ...
fuente