2012-06-27 6 views
11

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

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

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

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

+3

[Согласно Raymond Chen] (https://blogs.msdn.com/b/oldnewthing/archive/2011/04/19/10155452.aspx?Redirected=true), вы получите это поведение с VS2005 и новее – Praetorian

+2

@ Prætorian: [Согласно официальной документации] (http://msdn.microsoft.com/en-us/library/12a04hfd.aspx). ; -] – ildjarn

+0

@AndreyT: Вы тестируете VC++ 2005 или VC++ 2005 SP1? У IIRC, VC++ 2005 RTM была ошибка, в которой 'volatile' не имела ожидаемой семантики, которая была исправлена ​​в SP1 и VC++ 2008+. – ildjarn

ответ

2

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

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

+0

Это правда даже для многопроцессорного корпуса (в отличие от одноядерного многоядерного корпуса)? – AnT

+0

@AndreyT, порядок, в котором внешняя шина видит нагрузки, совпадает с порядком загрузки инструкций. То же самое можно сказать о магазинах. Как вы отметили, протоколы кэширования обеспечивают согласованность. Другими словами, если CPU1 выполняет хранилище S, а CPU2 видит, что он сохраняет свою нагрузку L, тогда загрузка CPU2 после L будет видеть все магазины по CPU1 до S. И это, мой друг, семантику получения/выпуска :) – avakar

+0

@AndreyT, я не хочу говорить, но я бы хотел, чтобы комитет C++ сделал гарантию «volatile имеет получение/выпуск семантики» вместо того, чтобы придумывать «». – avakar