Компиляторы C и C++ с "агрессивной" изменчивой семантикой

есть ли какие-либо компиляторы C или C++, которые реализуют "агрессивную" модель согласованности памяти для volatile переменные? Под "агрессивной" моделью согласованности я имею в виду сопровождение всех записей volatile переменные с барьерами памяти в сгенерированный код.

AFAIK, это обычное поведение для компиляторов C или C++ на платформе IA64 (Itanium). Насчет х86? Есть ли компилятор, который реализует (или может быть настроен для реализации) Itanium-подобный подход к обработке volatile переменные на платформе x86?

Edit: Я смотрю на код VS 2005 генерирует (после прочтения комментариев), и я не вижу ничего, что напоминало бы какой-либо барьер памяти при доступе volatile переменные. Это отлично подходит для обеспечения согласованности памяти на однопроцессорной многоядерной платформе x86 из-за протоколов кэша MESIF (Intel) и MOESI (AMD).

однако этого, похоже, недостаточно на многопроцессорной платформе SMP x86. - Платформа SMP потребует барьеров памяти в сгенерированном коде для обеспечения согласованности памяти между процессорами. Что я упускаю? Что именно означает Microsoft, когда они утверждают, что у них уже есть семантика acquire-release на volatile переменные?

1 ответов


следует отметить, что процессоры x86 не переупорядочивают ни нагрузки с другими нагрузками, ни магазины с другими магазинами. Как таковой, никаких явных барьеров не требуется.

компилятор MSVC гарантирует, что нагрузки не будут переупорядочены с летучими нагрузками, а магазины не будут переупорядочены с летучими магазинами (я сейчас говорю о переупорядочении загрузки и инструкций по хранению, конечно), таким образом гарантируя получение и выпуск семантики для летучих нагрузок и магазинов соответственно.