Каким образом микро-архитектурно реализуется свойство транзитивности / кумулятивности барьеров памяти? - PullRequest
3 голосов
/ 19 сентября 2019

Я читал о том, как работает модель памяти x86, и о значении инструкций барьера на x86, а также о сравнении с другими архитектурами, такими как ARMv8.Как в архитектуре x86, так и в архитектуре ARMv8, кажется (без каламбура), что модели памяти учитывают транзитивность / совокупность, то есть, если ЦП 1 видит накопления по ЦП0, а ЦП2 видит накопления по ЦП1, что могло произойти, только если ЦП1 видел накопления ЦП0,тогда CPU2 также должен увидеть хранилище CPU0.Примерами, на которые я ссылаюсь, являются примеры 1 и 2 в разделе 6.1 знаменитой статьи Пола МакКенни (хотя и в старом, то же самое есть в его последней книге кулинарных рецептов http://www.puppetmastertrading.com/images/hwViewForSwHackers.pdf). Если я правильно понимаю, x86 использует хранилищеочереди (или буферы порядка хранения), чтобы упорядочить хранилища (и для других оптимизаций микроархивов), прежде чем они станут глобально видимыми (т.е. записаны в L1D). Мой вопрос заключается в том, как арка x86 (и другие арки) реализует (микроархитектурно)свойство транзитивности? Очередь хранилищ гарантирует, что хранилища конкретного ЦП отображаются глобально в определенном порядке, но что обеспечивает порядок хранилищ, созданных одним ЦП, упорядоченных с хранилищами, созданными разными ЦП?

1 Ответ

6 голосов
/ 19 сентября 2019

На x86 есть только один домен когерентности.Хранилища становятся видимыми для всех других ядер в одно и то же время, когда они фиксируются в кеше L1d.Этого вместе с MESI в целом достаточно, чтобы дать нам общий порядок хранения, с которым могут согласиться все потоки.

Некоторые ISA (включая PowerPC) не имеют этого свойства (на практике из-за пересылки в хранилище дляудаленное хранилище в физическом ядре, через потоки SMT).Таким образом, mo_relaxed хранилища из 2 потоков могут быть просмотрены в другом порядке 2 другими читателями на практике на оборудовании POWER. Будут ли две атомарные записи в разные места в разных потоках всегда рассматриваться в одном и том же порядке другими потоками? (Предположительно, барьеры на блоке PowerPC при пересылке.)

Модель памяти ARM, используемая для разрешенияэто IRIW (Независимый Читатель Независимый Автор) переупорядочение, но на практике никогда не существовало ARM HW, который сделал это.ARM удалось укрепить свою модель памяти, чтобы гарантировать, что все ядра согласовывают глобальный порядок для хранилищ, выполняемых несколькими другими ядрами.

(Переадресация хранилища по-прежнему означает, что ядро ​​ делает , которое видит магазинэто сразу, задолго до того, как оно станет глобально видимым. И, конечно, упорядочение нагрузки требуется, чтобы ядра могли сказать, что они видели что-то о том, что они наблюдали при упорядочении независимых записей.)


Если все ядра должны договориться о глобальном упорядочении магазинов, то (в вашем примере) просмотр магазина из Core2 подразумевает, что Core1, должно быть, уже произошел, и что вы тоже можете его видеть.

(Предполагая, что Core2 использовал соответствующие барьеры или загрузочную загрузку или хранилище релиза, чтобы убедиться, что его хранилище произошло после его загрузки, которая видела хранилище Core1.)


Возможно также связано:

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