InterlockedExchange и выравнивание памяти - PullRequest
7 голосов
/ 19 мая 2009

Меня смущает, что Microsoft говорит, что для InterlockedExchange требуется выравнивание памяти, однако в документации Intel говорится, что для LOCK выравнивание памяти не требуется. Я что-то упустил или что-то еще? спасибо

из библиотеки Microsoft MSDN

Платформа SDK: библиотеки DLL, процессы и потоки InterlockedExchange

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

из Руководства разработчика программного обеспечения Intel;

  • Инструкция по блокировке Заставляет сигнал процессора LOCK # быть утвержденным во время выполнения сопровождающей инструкции (превращает инструкцию в элементарную инструкцию). В многопроцессорной среде сигнал LOCK # гарантирует, что процессор использует исключительно любую совместно используемую память , пока сигнал утверждается.

    На целостность префикса LOCK не влияет выравнивание поля памяти. Блокировка памяти наблюдается для произвольно смещенных полей.

  • Упорядочение памяти в P6 и более поздних семействах процессоров

    Заблокированные инструкции имеют общий порядок.

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

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

Ответы [ 4 ]

6 голосов
/ 17 июня 2009

Когда-то Microsoft поддерживала WindowsNT на процессорах, отличных от x86, таких как MIPS, PowerPC и Alpha. Все эти процессоры требуют выравнивания для своих взаимосвязанных инструкций, поэтому Microsoft включила в свою спецификацию требование, чтобы эти примитивы были переносимыми для разных архитектур.

1 голос
/ 29 мая 2009

Эй, Я ответил на несколько вопросов, связанных с этим, также имейте в виду;

  1. Существует NO уровень байтов InterlockedExchange там IS 16-битный короткий Однако InterlockedExchange.
  2. Дискретность документации, на которую вы ссылаетесь, вероятно, просто недосмотр документации.
  3. Если вы хотите сделать атомарный доступ на уровне байтов / бит, есть ARE множество способов сделать это с существующими внутренними компонентами, Interlocked [And8 | Or8 | Xor8]
  4. Любая операция, при которой вы выполняете блокировку с высокой производительностью (с использованием кода, который вы обсуждали), не должна выполняться без выравнивания ( производительность анти-паттерна )
  5. xchg (оптимизированная инструкция с неявным префиксом LOCK, оптимизированная благодаря возможности кешировать блокировку и избежать полной блокировки шины для основной памяти). МОЖЕТ делать 8-битные операции с блокировкой.

Я чуть не забыл, от Intel TBB , они имеют определение Load / Store 8bit без использования явной или явной блокировки (в некоторых случаях);

.code 
    ALIGN 4
    PUBLIC c __TBB_machine_load8
__TBB_machine_Load8:
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
    mov ecx,4[esp]
    test ecx,7
    jne load_slow
    ; Load within a cache line
    sub esp,12
    fild qword ptr [ecx]
    fistp qword ptr [esp]
    mov eax,[esp]
    mov edx,4[esp]
    add esp,12
    ret

EXTRN __TBB_machine_store8_slow:PROC
.code 
    ALIGN 4
    PUBLIC c __TBB_machine_store8
__TBB_machine_Store8:
    ; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
    mov ecx,4[esp]
    test ecx,7
    jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp
    fild qword ptr 8[esp]
    fistp qword ptr [ecx]
    ret
end

Во всяком случае, надеюсь, что это прояснит для вас кое-что.

1 голос
/ 21 мая 2009

Даже если префикс блокировки не требует выравнивания памяти, а операция cmpxchg, которая, вероятно, используется для реализации InterlockedExchange (), не требует выравнивания, если ОС включила проверку выравнивания, тогда cmpxchg вызовет проверку выравнивания исключение (AC) при выполнении с невыровненными операндами. Проверьте документы для cmpxchg и аналогичных, просматривая список исключений защищенного режима. Я не знаю наверняка, что в Windows включена проверка выравнивания, но меня это не удивит.

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

Я не понимаю, откуда исходит ваша информация Intel.

Для меня совершенно ясно, что Intel МНОГО заботится о выравнивании и / или охвате строк кэша.

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

В томе 3-I, Системное программирование, для 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 обеспечивают сигналы управления шиной, которые позволяют внешнюю память подсистемы для разделения доступа на атомарном уровне; однако доступ к данным без выравнивания будет серьезно повлиять на производительность процессора и его следует избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...