Вопрос

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

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

Теперь говорят, что при использовании многоядерных платформ требуются ограничения памяти, поскольку из-за неупорядоченного выполнения неверное значение 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?

Это было полезно?

Решение

Этот урок объясняет проблемы: http://www.hpl.hp.com/techreports/compaq-dec/wrl-95-7.pdf

FWIW, где проблемы с упорядочкой памяти происходят на современных процессорах X86, причина в том, что, хотя модель согласованности памяти X86 предлагает довольно прочную согласованность, необходимы явные барьеры для обработки согласованности чтения и записи. Это связано с тем, что называется «буфер магазина».

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

store x
load y

Затем на автобусе процессора это можно рассматривать как

load y
store x

Причиной такого поведения является вышеупомянутый буфер магазина, который является небольшим буфером для записи, прежде чем они выйдут на системную шину. Задержка нагрузки - это OTOH, критическая проблема для производительности, и, следовательно, нагрузка разрешена «прыгать в очередь».

См. Раздел 8.2 в http://download.intel.com/design/processor/manuals/253668.pdf

Другие советы

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

Если вы не установите ограничение памяти, ядра могут работать с неправильными данными, это особенно заметно в сценариях, где несколько ядер будут работать с одними и теми же наборами данных.В этом случае вы можете гарантировать, что, когда CPU 0 выполнит какое-либо действие, все изменения, внесенные в набор данных, теперь будут видны всем другим ядрам, которые затем смогут работать с актуальной информацией.

Некоторые архитектуры, включая вездесущую x86 / x64, предоставляют несколько инструкций по ограничению памяти, включая инструкцию, иногда называемую "полное ограждение".Полное ограждение гарантирует, что все операции по загрузке и хранению , предшествующие ограждению, будут выполнены до любых погрузок и выдача запасов после ограждения.

Если ядро начнет работать с устаревшими данными в наборе данных, как оно вообще сможет получить правильные результаты?Не имело значения, должен ли конечный результат быть представлен так, как если бы все было сделано в правильном порядке.

Ключ находится в буфере хранилища, который находится между кэшем и процессором, и делает это:

Буфер хранения, невидимый для удаленных процессоров

Буфер хранения позволяет сохранять записи в память и / или кэши для оптимизации доступа к межсоединениям

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

Редактировать:

Для кода, который вы использовали в качестве примера, Википедия говорит следующее:

Барьер памяти может быть установлен перед присвоением процессору # 2 значения f чтобы гарантировать, что новое значение x будет видно другим процессорам в момент или до изменения значения f.

Просто чтобы сделать явным то, что подразумевается в предыдущих ответах, это правильно, но отличается от доступа к памяти:

Процессоры могут выполняться не по порядку, Однако они всегда удаляют результаты по порядку

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

Каждое ядро будет действовать так, как если бы доступ к его собственной памяти происходил при выходе из строя, но другие ядра могут видеть эти обращения в разное время.

(На x86 и ARM, я думаю, что этому подвержены только хранилища, но, например, Alpha может загрузить старое значение из памяти.x86 SSE2 содержит инструкции с более слабыми гарантиями, чем обычное поведение x86).

PS.Судя по памяти, заброшенный Sparc ROCK действительно мог выйти из строя, он тратил энергию и транзисторы, определяя, когда это было безвредно.От него отказались из-за энергопотребления и количества транзисторов...Я не верю, что какой-либо процессор общего назначения был куплен для продажи с выходом из строя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top