Имеет ли значение, что в x86 неупорядоченные инструкции не читаются и не записываются? - PullRequest
0 голосов
/ 27 июня 2018

Документация mfence гласит следующее:

Выполняет сериализацию для всей загрузки из памяти и инструкции хранения в памяти, которые были выпущены до MFENCE инструкция. Эта операция сериализации гарантирует, что каждая нагрузка и сохранить инструкцию, которая предшествует инструкции MFENCE в программе заказ становится глобально видимым перед любой загрузкой или сохранением инструкции который следует инструкции MFENCE.

Насколько я знаю, в x86 нет команды заборов, которая бы препятствовала переупорядочению команд без чтения и записи.

Теперь, если в моей программе есть только один поток, даже если инструкции переупорядочены, все равно может показаться, что инструкции выполняются по порядку.

Но что, если в моей программе несколько потоков, и в одном из потоков неупорядоченные инструкции не для чтения и записи не будут переупорядочены, другие потоки заметят это переупорядочение (я предполагаю, что ответ Нет , или иначе была бы инструкция забора, чтобы остановить переупорядочивание инструкций не для чтения и не записи, или, может быть, я что-то упустил)?

1 Ответ

0 голосов
/ 27 июня 2018

заметят ли другие потоки это изменение порядка

Нет, кроме производительности (синхронизация или прямое измерение с помощью счетчиков производительности HW). Или микроархитектурные побочные каналы (например, давление порта ALU для логических ядер, которые совместно используют физическое ядро ​​с Hyperthreading / SMT): один поток может рассчитать сам , чтобы узнать кое-что о том, что выполняет другой аппаратный поток.

Единственный "нормальный" способ для потоков наблюдать что-либо друг о друге - загружать данные, которые хранятся в других потоках.

Даже порядок загрузки виден только косвенно (благодаря тому, как он влияет на то, что другой поток решит сохранить позже).


Насколько я знаю, в x86 нет команды заборов, которая бы препятствовала переупорядочению команд без чтения и без записи.

На процессорах Intel (но не AMD) lfence делает это . В руководстве Intel говорится, что это , а не , просто деталь реализации. Это действительно гарантировано для будущих микроархитектур.

Справочное руководство по набору инструкций Intel LFENCE :

LFENCE не выполняется до тех пор, пока все предыдущие инструкции не будут выполнены локально, и никакая более поздняя инструкция не начнет выполнение до завершения LFENCE.

(завершено локально = удалено из ядра, вышедшего из строя, т.е. покидает РОБ).

lfence не особенно полезен в качестве фактического барьера нагрузки, поскольку x86 не допускает слабо упорядоченные нагрузки из памяти WB (только из WC). (Даже movntdqa или prefetchnta не могут создавать слабо упорядоченные нагрузки из обычной памяти WB.) Так что в отличие от sfence, lfence в принципе никогда не требуется для упорядочения памяти, только для его специальных эффектов как lfence; rdtsc. Или для смягчения Призрака, чтобы блокировать спекулятивное выполнение мимо него.


Но в качестве детали реализации, на процессорах Intel, включая, по крайней мере, Skylake, mfence является барьером для выполнения не по порядку. См. Является ли загрузка и хранение единственными инструкциями, которые переупорядочиваются? для этого и многое другое.

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