требования выравнивания для атомарных команд x86 - PullRequest
35 голосов
/ 12 сентября 2009

Microsoft предлагает функцию InterlockedCompareExchange для выполнения атомарных операций сравнения и замены. Существует также _InterlockedCompareExchange свойственная .

На x86 они реализованы с использованием инструкции cmpxchg.

Однако, читая документацию по этим трем подходам, они, похоже, не согласны с требованиями выравнивания.

Справочное руководство Intel ничего не говорит о выравнивании (кроме этого , если включена проверка выравнивания и выполняется ссылка на невыровненную память, генерируется исключение)

Я также посмотрел префикс lock, в котором конкретно указано, что

Целостность префикса LOCK не зависит от выравнивания поля памяти.

(акцент мой)

Таким образом, Intel, похоже, говорит, что выравнивание не имеет значения. Операция будет атомарной, несмотря ни на что.

Внутренняя документация _InterlockedCompareExchange также ничего не говорит о выравнивании, однако функция InterlockedCompareExchange утверждает, что

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

Так что дает? Являются ли требования выравнивания для InterlockedCompareExchange просто для того, чтобы убедиться, что функция будет работать даже на CPU до 486, где инструкция cmpxchg недоступна? Вероятно, это основано на приведенной выше информации, но я хотел бы убедиться, прежде чем положиться на нее. :)

Или ISA требует выравнивания, чтобы гарантировать атомарность, и я просто смотрю неправильные места в справочных руководствах Intel?

Ответы [ 4 ]

10 голосов
/ 20 марта 2013

x86 не требует выравнивания для инструкции cmpxchg. Тем не менее, выравнивание рекомендуется для производительности. Это не должно вызывать удивления, так как обратная совместимость означает, что программное обеспечение, написанное с руководством 14 лет назад, все еще будет работать на современных процессорах.

Почему именно Microsoft требует выравнивания, не ясно из их документации. Это может быть для производительности или для поддержки архитектур RISC, или для обоих.

Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32
Том 3 (3А): Руководство по системному программированию
Январь 2013

8.1.2.2 Программно управляемая блокировка шины

Для явного форсирования семантики LOCK программное обеспечение может использовать префикс LOCK со следующими инструкциями, когда они используются для изменения области памяти. [...]

• Инструкции обмена (XADD, CMPXCHG и CMPXCHG8B).
• Для инструкции XCHG автоматически принимается префикс LOCK.
• [...]

[...] На целостность блокировки шины не влияет выравнивание поле памяти. Семантика LOCK соблюдается столько же циклов шины при необходимости обновить весь операнд. Тем не менее, это рекомендуется что заблокированные доступы должны быть выровнены по своим естественным границам для лучшего производительность системы:

• Любая граница для 8-битного доступа (заблокирована или иным образом).
• 16-битная граница для доступа к заблокированным словам.
• 32-разрядная граница для заблокированного доступа к двойному слову.
• 64-разрядная граница для заблокированных обращений к четырем словам.

10 голосов
/ 03 марта 2011

PDF, который вы цитируете с , взят с 1999 года и ЯВНО устарел.

Обновленная документация Intel , в частности Volume-3A , рассказывает другую историю.

Например, на процессоре Core-i7 вы ДОЛЖНЫ быть уверены, что ваши данные не выходят за пределы строк кэша, иначе операция НЕ гарантированно будет атомарной.

На томе 3A, Системное программирование, для x86 / x64 Intel четко заявляет:

8.1.1 Гарантированные атомные операции

Процессор Intel486 (и более новые процессоры с тех пор) гарантирует, что следующее Основные операции с памятью всегда будут выполняться атомарно:

  • Чтение или запись байта
  • Чтение или запись слова, выровненного по 16-битной границе
  • Чтение или запись двойного слова, выровненного по 32-битной границе

Процессор Pentium (и более новые процессоры с тех пор) гарантирует, что следующее дополнительные операции с памятью всегда будут выполняться атомарно:

  • Чтение или запись четырех слов, выровненных по 64-битной границе
  • 16-битный доступ к не кэшированным областям памяти, которые вписываются в 32-битную шину данных

Процессоры семейства P6 (и более новые процессоры с тех пор) гарантируют, что следующее дополнительная операция с памятью всегда будет выполняться атомарно:

  • Нераспределенные 16-, 32- и 64-битные обращения к кешируемой памяти, которые помещаются в кеш линия

Доступ к кешируемой памяти, разделенной по строкам кеша и границам страниц. Intel Core 2 Duo, Intel® Atom ™, Intel Core не гарантируют атомарность Процессоры Duo, Pentium M, Pentium 4, семейство Intel Xeon, P6, Pentium и Intel 486. Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, и процессоры семейства P6 обеспечивают сигналы управления шиной, которые позволяют внешнюю память подсистемы для разделения доступа на атомарном уровне; однако доступ к данным без выравнивания будет серьезно повлиять на производительность процессора и следует избегать

5 голосов
/ 12 сентября 2009

См. этот вопрос SO : естественное выравнивание важно для производительности и требуется для архитектуры x64 (поэтому речь идет не только о системах PRE-x86, но и системах POST-x86 - x64 все еще может быть немного нишевый случай, но в конце концов его популярность растет ;-); возможно, именно поэтому Microsoft документирует это по мере необходимости (трудно найти документы о том, решил ли MS форсировать проблему выравнивания, включив проверку выравнивания - это может варьироваться в зависимости от версии Windows; заявив в документах, что выравнивание требуется, MS сохраняет свобода навязывать его в некоторых версиях Windows, даже если они не навязывали его другим).

3 голосов
/ 26 ноября 2009

Интерфейсы Microsoft Interlocked API также применяются к ia64 (пока он еще существует). На ia64 не было префикса блокировки, только инструкции cmpxchg.acq и cmpxchg.rel (или fetchadd и другие подобные beasties), и все они требовали выравнивания, если я правильно помню.

...