Сколько инструкций по барьерам памяти имеет процессор x86?
Я обнаружил, что у процессора x86 есть следующие инструкции по защите памяти: mfence
, lfence
, а также sfence
,
В процессоре x86 есть только эти три инструкции для барьеров памяти или есть еще?
2 ответа
sfence
(SSE1) и mfence
/ lfence
(SSE2) являются единственными инструкциями, которые названы для их функциональности ограничения / барьера памяти. Если вы не используете NT загружает или хранит и / или память WC, только mfence
необходим для упорядочения памяти.
(Обратите внимание, что lfence
на процессорах Intel (но не AMD) также является барьером для неупорядоченного исполнения, поэтому он может сериализоваться rdtsc
, и полезно для смягчения Призрака, чтобы предотвратить спекулятивное выполнение.)
lock
инструкции как lock add [mem], eax
также полные барьеры памяти. Есть ли у блокировки xchg такое же поведение, как у mfence?, (Хотя, возможно, не так сильно, как mfence
для заказа загрузок NT из памяти WC: обеспечивают ли заблокированные инструкции барьер между слабо упорядоченным доступом?). xchg [mem], reg
имеет неявное lock
префикс, так что это тоже барьер.
В моем тестировании на Skylake, lock
Инструкции ed блокируют переупорядочение хранилищ NT с обычными хранилищами с этим кодом https://godbolt.org/g/7Q9xgz. xchg
кажется, хороший способ сделать seq-cst store, особенно на оборудовании Intel, таком как Skylake, где mfence
также блокирует неупорядоченное выполнение чистых инструкций ALU, таких как lfence
: Смотрите дно этого ответа
Для хранилищ последовательной согласованности или полных барьеров на 32-битных целевых объектах без SSE компиляторы обычно используют lock or [esp], 0
или другая не блокируемая инструкция только для эффекта барьера памяти. Это то что g++7.3 -O3 -m32 -mno-sse
делает для std::atomic_thread_fence(std::memory_order_seq_cst);
,
Полная сериализация инструкций, таких как cpuid
также являются полными барьерами памяти, опустошающими буфер хранилища и очищающими конвейер. Есть ли у блокировки xchg такое же поведение, как у mfence? имеет соответствующие цитаты из руководства Intel.
От: https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-273.html
Привилегированные инструкции сериализации - INVD, INVEPT, INVLPG, INVVPID, LGDT, LIDT, LLDT, LTR, MOV для управления регистром, MOV (для отладки регистра), WBINVD и WRMSR.
Исключения:
MOV CR8
не сериализуетсяWRMSR
MSR IA32_TSC_DEADLINE (индекс MSR 6E0H) и MSR X2APIC (индексы MSR с 802H по 83FH) не сериализуются.Непривилегированные команды сериализации - CPUID, IRET и RSM
in
/ out
(и их строковые версии ins
а также outs
) являются полными барьерами памяти, а также частично сериализуются (например, lfence
). В документах говорится, что они задерживают выполнение следующей команды до "фазы данных" транзакции ввода / вывода.
Вы правы, только три функции барьера памяти на процессоре x86:
LFENCE
SFENCE
MFENCE