Barreras de Memoria C++ para Atomics


Soy un novato cuando se trata de esto. ¿Podría alguien proporcionar una explicación simplificada de las diferencias entre las siguientes barreras de memoria?

  • Las ventanas MemoryBarrier();
  • La cerca _mm_mfence();
  • El ensamblaje en línea asm volatile ("" : : : "memory");
  • Lo intrínseco _ReadWriteBarrier();

Si no hay una explicación simple, algunos enlaces a buenos artículos o libros probablemente me ayudarían a entenderlo. Hasta ahora estaba bien con solo usar objetos escritos por otros envolviendo estas llamadas, pero Me gustaría tener una mejor comprensión de mi pensamiento actual que es básicamente a lo largo de las líneas de hay más de una manera de implementar barreras de memoria bajo las cubiertas.

Author: AJG85, 2012-01-13

2 answers

Tanto MemoryBarrier (MSVC) como _mm_mfence (soportados por varios compiladores) proporcionan una cerca de memoria de hardware, que evita que el procesador mueva lecturas y escrituras a través de la cerca.

La principal diferencia es que MemoryBarrier tiene implementaciones específicas de plataforma para x86, x64 e IA64, donde as _mm_mfence usa específicamente la instrucción mfence SSE2, por lo que no siempre está disponible.

En x86 y x64 MemoryBarrier se implementa con un xchg y lock or, respectivamente, y he visto algunos afirman que esto es más rápido que mfence. Sin embargo, mis propios puntos de referencia muestran lo contrario, por lo que aparentemente depende mucho del modelo del procesador.

Otra diferencia es que mfence también se puede usar para ordenar almacenes/cargas no temporales (movntq, etc.).

GCC también tiene __sync_synchronize que genera una valla de hardware.

asm volatile ("" : : : "memory") en GCC y _ReadWriteBarrier en MSVC solo proporcionan una valla de memoria a nivel de compilador, evitando que el compilador reordene los accesos a la memoria. Eso significa que el procesador todavía es libre de reordenar.

Las cercas del compilador generalmente se usan en combinación con operaciones que tienen algún tipo de cercas de hardware implícitas. Por ejemplo, en x86 / x64 todas las tiendas tienen una valla de liberación y las cargas tienen una valla de adquisición, por lo que solo necesita una valla compiladora al implementar carga-adquisición y tienda-liberación.

 28
Author: Timo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-13 03:23:54

Ver mi respuesta aquí en el nivel de hardware semántica de vallas. Lo que no se menciona es que también evitan el reordenamiento de cargas, almacenes o cargas y almacenes(dependiendo de la valla) a través de vallas, tanto a nivel de compilador como a nivel de hardware.

 3
Author: Necrolis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:29:50