требования к выравниванию для атомарных инструкций x86

StackOverflow https://stackoverflow.com/questions/1415256

Вопрос

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

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

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

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

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

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

(выделено мной)

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

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

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

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

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

Это было полезно?

Решение

Тем PDF, из которого вы цитируете выпущен в 1999 году и ЯВНО устарел.

Тем актуальная документация Intel, конкретно Том-3А рассказывает другую историю.

Например, на процессоре 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 и Intel486.The Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, и процессоры семейства P6 обеспечивают сигналы управления шиной, которые позволяют использовать внешнюю память подсистемы для придания разделенного доступа атомарного характера;Тем не менее, доступ к невыровненным данным серьезно влияют на производительность процессора, и их следует избегать

Другие советы

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top