Каким образом барьеры / ограждения и приобретение, высвобождение семантики реализуются микроархитектурно? - PullRequest
5 голосов
/ 24 сентября 2019

Множество вопросов ТАК и статьи / книги, такие как https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.2018.12.08a.pdf, Статьи Прешинга, такие как https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/ и вся его серия статей, говорят об упорядочении памяти абстрактно, с точки зрения упорядоченности и видимостигарантии, предоставляемые различными типами барьеров.Мой вопрос заключается в том, как эти барьеры и семантика упорядочения памяти реализованы на архитектуре x86 и ARM micro?

Для барьеров хранилище-хранилище, как на x86, буфер хранилища поддерживает программный порядок хранилищ и передает их вL1D (и, следовательно, сделать их глобально видимыми в том же порядке).Если буфер магазина не упорядочен, т.е. не поддерживает их в программном порядке, как реализуется барьер магазина?это просто "маркировка" буфера хранилища таким образом, чтобы он сохранялся до фиксации барьера в связном домене кэша до сохранения после?или же барьер памяти фактически очищает буфер хранилища и останавливает все инструкции до завершения очистки?Может ли это быть реализовано в обоих направлениях?

Как предотвратить переупорядочение нагрузки под нагрузкой?Трудно поверить, что x86 выполнит все загрузки по порядку!Я предполагаю, что нагрузки могут выполняться не по порядку, но зафиксировать / удалить в порядке.Если это так, если процессор выполняет 2 загрузки в 2 разных местах, как одна загрузка гарантирует, что она получила значение, скажем, от T100, а следующая - от или после T100?Что делать, если первая загрузка отсутствует в кеше и ожидает данные, а вторая загрузка достигает и получает свое значение.Когда load 1 получает свое значение, как оно гарантирует, что полученное значение не из более нового хранилища, в котором загружается значение 2?если нагрузки могут выполняться не по порядку, как обнаруживаются нарушения порядка в памяти?

Аналогичным образом, как реализуются барьеры хранения нагрузки (неявные во всех нагрузках для x86) и как барьеры загрузки хранилища (такие как mfence)) реализовано?то есть что инструкции dmb ld / st и just dmb выполняют микроархитектурно на ARM и что каждая загрузка и каждое хранилище и инструкция mfence выполняют микроархитектурно на x86 для обеспечения упорядочения памяти?

1 Ответ

2 голосов
/ 24 сентября 2019

Многое из этого было рассмотрено в других вопросах и ответах, но здесь я приведу краткое изложение.(И искать ссылки для добавления).Тем не менее, хороший вопрос, полезно собрать все это в одном месте.


На x86 каждая нагрузка asm является загрузочной загрузкой .Чтобы реализовать это эффективно, современные x86 HW спекулятивно загружаются раньше, чем разрешено, а затем проверяют это предположение.(Потенциально может привести к возникновению ошибки в конвейере неправильной спекуляции порядка памяти.) Чтобы отслеживать это, Intel называет комбинацию буферов загрузки и хранения «Буфер порядка памяти».

Слабо упорядоченные ISA не должныПредположим, что они могут просто загружаться в любом порядке.


Порядок хранения в x86 поддерживается только разрешением сохранения хранилищ из буфера хранилища в L1d в программном порядке.

По крайней мере, на процессорах Intel запись буфера хранилища выделяется для хранилища при его выдаче (из внешнего интерфейса в ROB + RS).У всех мопов должна быть выделена запись ROB для них, но у некоторых мопов также должны быть выделены другие ресурсы, такие как записи буфера загрузки или хранения, RAT-записи для регистров, которые они читают / записывают и т. Д.

Так что я думаю, что сам буфер хранилища заказан .Когда выполняется сохранение адреса хранилища или данных хранилища, оно просто записывает адрес или данные в свою уже выделенную запись буфера хранилища.Поскольку commit (освобождение записей SB) и allocate расположены в программном порядке, я предполагаю, что это физически круговой буфер с головой и хвостом, как ROB.(И в отличие от RS).


Отказ от LoadStore в основном бесплатен : загрузка не может быть снята до тех пор, пока она не будет выполнена (данные взяты из кэша).Магазин не может совершать операции до после , когда он закрывается.Изъятие по порядку автоматически означает, что все предыдущие загрузки выполняются до того, как магазин «градуирован» и готов к фиксации.

Слабо упорядоченный uarch, который на практике может выполнять переупорядочивание хранилища, может загружать табло: пусть ониУйдите в отставку, как только они не будут исправны, но до того, как данные поступят.

Это кажется более вероятным для ядра в порядке, но IDK.Таким образом, вы можете получить загрузку, которая будет удалена, но место назначения регистра все равно остановится, если что-то попытается прочитать его до того, как данные действительно поступят.Мы знаем, что обычные ядра на практике работают таким образом, не требуя загрузки до завершения , прежде чем последующие инструкции могут быть выполнены.(Вот почему программная конвейерная обработка с использованием большого количества регистров так ценна на таких ядрах, например, для реализации memcpy. Считывание результата загрузки сразу на упорядоченном ядре разрушает параллелизм памяти.)

Каквозможно ли переупорядочение load-> store с фиксацией по порядку? углубляется в этот порядок, по порядку или вне очереди.


Инструкции барьера

Единственная барьерная инструкция, которая делает что-либо для обычных хранилищ, - это mfence, которая на практике останавливает операции памяти (или весь конвейер) до тех пор, пока буфер хранилища не будет очищен. Является ли загрузка и хранение единственной инструкцией, которая переупорядочивается? охватывает поведение Skylake-с-обновленным микрокодом, действующее как lfence.

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

относящиеся:

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