InterlockedExchange и выравнивание памяти

Я смущен, что Microsoft заявляет, что выравнивание памяти требуется для InterlockedExchange однако, в документации Intel говорится, что выравнивание памяти не требуется для БЛОКИРОВКИ. Я пропускаю что-то, или безотносительно?спасибо

от Microsoft MSDN Library

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

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

от Intel Software Developer’s Manual;

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

    Целостность префикса БЛОКИРОВКИ не затронута выравниванием поля памяти. Блокировка памяти наблюдается для произвольно неправильно выровненных полей.

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

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

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

    Целостность блокирования шины не затронута выравниванием поля памяти. Семантика БЛОКИРОВКИ сопровождается для стольких же циклов шины по мере необходимости для обновления всего операнда. Однако это, рекомендуют, чтобы заблокировал доступы быть выровненные на их естественных границах для лучшей производительности системы: • Любая граница для 8-разрядного доступа (заблокированный или иначе). • 16-разрядная граница для заблокированных доступов слова. • 32-разрядная граница для заблокированных доступов двойного слова. • 64-разрядная граница для заблокированных quadword доступов.

8
задан Peter Cordes 27 November 2019 в 07:01
поделиться

3 ответа

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

1
ответ дан 5 December 2019 в 22:20
поделиться

Я хочу дополнить этот ответ следующим утверждением - я ничего не знаю о Фортране или Matlab

Однако я думаю, что вы почти отвечаете на свой вопрос в своем вопросе.

Зачем вам это? не использовать научный язык для написания ядра. Вы бы использовали наиболее подходящий язык для поставленной задачи. Ядро лучше всего писать на C, так как оно лучше подходит для работы с низкоуровневыми задачами, такими как ядра (работа с управлением памятью и т. Д.)

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

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

оптимизирован за счет возможности блокировки кеша и предотвращения полной блокировки шины к основной памяти). CAN выполняет 8-битные операции с блокировкой.

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

.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
ответ дан 5 December 2019 в 22:20
поделиться

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

6
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: