Out of Order Execution and Memory Fences

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

"Процессоры 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?

10
задан MetallicPriest 8 September 2011 в 11:12
поделиться