2012-06-27 15 views
11

¿Hay algún compilador C o C++ que implemente un modelo de coherencia de memoria "agresivo" para las variables volatile? Por modelo de coherencia "agresiva" me refiero a acompañar todas las escrituras a las variables volatile con barreras de memoria en el código generado.compiladores C y C++ con semántica volátil "agresiva"

AFAIK, este es el comportamiento habitual de los compiladores C o C++ en la plataforma IA64 (Itanium). ¿Qué hay de x86? ¿Existe un compilador que implemente (o se pueda configurar para implementar) un enfoque tipo Itanium para manejar las variables volatile en la plataforma x86?

Editar: estoy mirando el código VS 2005 genera (después de leer los comentarios) y no veo nada que pueda parecerse a cualquier tipo de barrera de memoria al acceder a volatile variables. Esto está perfectamente bien para garantizar la consistencia de la memoria en una plataforma x86 de múltiples núcleos de una sola CPU, gracias a los protocolos de caché MESIF (Intel) y MOESI (AMD).

Sin embargo, esto parece ser insuficiente en una plataforma SMP x86 de varias CPU. Una plataforma SMP requeriría barreras de memoria en el código generado para garantizar la consistencia de la memoria entre las CPU. ¿Qué me estoy perdiendo? ¿Qué quiere decir exactamente Microsoft cuando afirman que ya tienen una semántica de adquisición-liberación en las variables volatile?

+3

[Según Raymond Chen] (https://blogs.msdn.com/b/oldnewthing/archive/2011/04/19/10155452.aspx?Redirected=true) obtienes este comportamiento con VS2005 y más reciente – Praetorian

+2

@ Prætorian: [Según la documentación oficial] (http://msdn.microsoft.com/en-us/library/12a04hfd.aspx) también. ; -] – ildjarn

+0

@AndreyT: ¿Está probando VC++ 2005 o VC++ 2005 SP1? IIRC, VC++ 2005 RTM tenía un error donde 'volátil 'no tenía la semántica esperada, que se corrigió en SP1 y VC++ 2008+. – ildjarn

Respuesta

2

Cabe señalar que las CPU x86 no reordenan cargas con otras cargas ni las almacenan con otras tiendas. Como tal, no son necesarias barreras explícitas.

El compilador MSVC asegurará que las cargas no se reordenan con cargas volátiles y las tiendas no se reordenan con tiendas volátiles (ahora estoy hablando de reordenar las instrucciones de carga y almacenamiento, por supuesto), garantizando la semántica de adquirir y liberar volátiles cargas y tiendas respectivamente.

+0

¿Es eso cierto incluso para la carcasa de múltiples CPU (a diferencia de la carcasa de núcleo único de una CPU)? – AnT

+0

@AndreyT, el orden en que el bus externo ve las cargas es el mismo que el orden de las instrucciones de carga. Lo mismo es cierto para las tiendas. Como señaló, los protocolos de caché garantizan la coherencia. En otras palabras, si CPU1 realiza una tienda S y CPU2 ve esa tienda con su carga L, luego carga por CPU2 después de que L verá todas las tiendas por CPU1 antes de S. Y eso, mi amigo, es semántica de adquisición/liberación :) – avakar

+0

@AndreyT, no me refiero a despotricar, pero me gustaría que el comité de C++ hubiera hecho el estándar de garantía "volátil tiene adquisición/liberación semántica" en lugar de tener ''. – avakar

Cuestiones relacionadas