Подтвердить что ты не робот

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

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

В x86 они реализованы с помощью команды cmpxchg.

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

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

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

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

(акцент мой)

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

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

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

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

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

4b9b3361

Ответ 1

PDF, который вы цитируете из, с 1999 года и Чрезвычайно устаревший.

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

Например, на процессоре Core-i7 вы должны убедиться, что ваши данные не распространяются по линиям кэша, иначе операция НЕ гарантируется как атомарная.

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Руководство разработчика программного обеспечения для разработчиков Intel® 64 и IA-32

Том 3 (3A): Руководство по системному программированию
Январь 2013 г.

8.1.2.2 Блокировка программного обеспечения с контролируемой шиной

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

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

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

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

Ответ 3

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

Ответ 4

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