Я знаю, что современные процессоры могут работать не по порядку, однако они всегда удаляют результаты по порядку, как описано в Википедии.
«Вне очереди процессоры заполняют эти« слоты »вовремя другими готовыми инструкциями, затем переупорядочивают результаты в конце, чтобы казалось, что инструкции были обработаны как обычно».
Теперь при использовании многоядерных платформ требуется ограничить память, потому что из-за выполнения Out of Order здесь может быть напечатано неправильное значение x.
Processor #1:
while f == 0
;
print x; // x might not be 42 here
Processor #2:
x = 42;
// Memory fence required here
f = 1
Теперь мой вопрос: поскольку вышедшие из строя процессоры (ядра в случае многоядерных процессоров, как я полагаю) всегда удаляют результаты по порядку, тогда в чем необходимость заборов памяти. Разве ядра многоядерного процессора не видят результаты, удаленные только с других ядер, или они также видят результаты, которые находятся на лету?
Я имею в виду, что в приведенном выше примере, когда Процессор 2 в конечном итоге удалит результаты, результат x должен стоять перед f, верно? Я знаю, что во время исполнения вне очереди он мог изменить f до x, но он не должен был удалить его до x, верно?
Теперь с упорядоченным упразднением результатов и механизмом согласованности кеша, зачем вам когда-либо понадобились ограждения памяти в x86?
print
. Некоторые ограждения могут быть ненужными на определенных платформах, но любой исходный код должен содержать оба ограждения (которые могут компилироваться в noops). - person cmaster - reinstate monica   schedule 27.12.2017