Гарантии упорядочения памяти и правильная практика программирования - PullRequest
5 голосов
/ 04 апреля 2011

Что касается порядка, который я опишу ниже, у меня есть несколько связанных вопросов.

  1. Учитывая эти гарантии упорядочения, мне не нужны явные заборы во многих местах. Однако, как я могу выразить «забор» компилятору, в частности GCC? То есть гарантия заказа программы действует только при условии, что оптимизатор не меняет порядок моей программы.

  2. Существуют ли распространенные / популярные новые чипы с ядрами общего назначения, которые не дают таких гарантий?

  3. Я немного запутался в C ++ 0x с его идеей чередования. Должен ли я использовать «атомарный» класс, чтобы использовать эти гарантии, или в проекте есть какой-то другой аспект, который также предоставляет способ использовать эти гарантии?


Порядок в памяти

И Intel, и AMD, по крайней мере с x86_64, гарантируют, что загрузка памяти будет последовательной по отношению к операциям хранения, выполняемым на одном процессоре. То есть, если какой-то процессор выполняет эти хранилища:

  1. Магазин A <- 1 </li>
  2. Магазин B <- 2 </li>
  3. Магазин C <- 3 </li>

В тот момент, когда какой-то другой процессор видит C (3), он гарантированно также видит предыдущие хранилища A (1) и B (2). Теперь видимость между процессорами может чередоваться, но порядок сохранения от любого данного процессора также будет последовательным.

Они также имеют транзитивные гарантии, когда Процессор 0 считывает значение, сохраненное Процессором 1, а затем записывает значение, что Процессор 2, читающий новое значение, должен также видеть это значение из Процессора 1.

Игнорировать особые случаи, связанные с IO и специальными устройствами. Меня интересуют только общие гарантии памяти: мой порядок здесь как раз тот, который меня больше всего интересует, поскольку он имеет наибольшее значение для параллельных алгоритмов.

Ответы [ 3 ]

2 голосов
/ 04 апреля 2011

Владение этими видами операций важно для построения операционных систем SMP и для связи с определенными видами оборудования.Документация по ядру Linux предоставляет отличный обзор предмета, а также конкретные решения, используемые ядром.Я настоятельно рекомендую взглянуть на их файл memory-barriers.txt .

0 голосов
/ 04 апреля 2011

Даже если платформа гарантирует последовательную согласованность, вам всегда потребуется какая-то синхронизация для предотвращения условий гонки , когда более одного потока обращается к одной и той же области памяти и хотя бы к одному изих пишет в это.C ++ 0x предлагает три способа реализации такой синхронизации:

  1. Взаимное исключение - std::mutex и связанные классы
  2. Атомные переменные - std::atomic<T>
  3. Явная памятьбарьеры - std::atomic_thread_fence.

Последние два принимают параметр порядка памяти , обеспечивающий дополнительную гибкость (только для экспертов!) на платформах, которые не гарантируют последовательную согласованность, но этоне относится к x86.

0 голосов
/ 04 апреля 2011

Для самых надежных гарантий того, что ваши магазины и грузы будут выполняться в точно требуемом порядке, вам может потребоваться прибегнуть к asm блокам в вашем коде и явно написать свои инструкции mov.

...