Сколько инструкций по барьерам памяти имеет процессор 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
Другие вопросы по тегам