Я знаю, что современные процессоры могут работать не по расписанию, но они всегда выводят результаты из строя, как описано в Википедии.
"Процессоры Oder вовремя заполняют эти "слоты" другими готовыми инструкциями, затем в конце заново заказывают результаты, чтобы казалось, что инструкции были обработаны как обычно. "
Теперь говорят, что при использовании многоядерных платформ требуются заборы памяти, так как из-за выполнения 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
Теперь мой вопрос в том, так как Out of Order Processors (Ядра в случае многоядерных процессоров, я предполагаю) всегда сбрасывают результаты In-Order, тогда в чем же необходимость в ограждениях памяти. Разве ядра многоядерного процессора не видят результатов, выведенных из строя только другими ядрами, или они также видят результаты, которые находятся в полете?
Я имею в виду в примере, который я приводил выше, когда процессор 2 в конечном итоге выводит результаты из строя, результат x должен прийти раньше f , верно? Я знаю, что во время исполнения вне ордера он мог изменить f до x, но он не должен был сойти с ордера до x, верно?
Теперь, когда In-Order вывел результаты и механизм когерентности кэша на место, зачем вам когда-либо понадобились заборы памяти в x86?