Как Intel X86 реализует полный порядок в магазинах - PullRequest
0 голосов
/ 19 июня 2020

X86 гарантирует полный порядок по всем магазинам благодаря своей модели памяти TSO. У меня вопрос, есть ли у кого-нибудь представление о том, как это на самом деле реализовано.

У меня хорошее впечатление, как реализованы все 4 ограждения, поэтому я могу объяснить, как сохраняется локальный порядок. Но 4 ограждения просто дадут PO; он не даст вам TSO (я знаю, что TSO позволяет старым магазинам прыгать впереди новых грузов, поэтому нужны только 3 из 4 ограждений).

Общий порядок всех действий с памятью по одному адресу отвечает за согласованность. Но я хотел бы знать, как Intel (в частности, Skylake) реализует полный порядок в магазинах по нескольким адресам.

1 Ответ

2 голосов
/ 20 июня 2020

Модель памяти x86 TSO в основном состоит из порядка программ плюс буфер хранилища с пересылкой хранилища.

Большинство полученных гарантий теоретически довольно легко реализовать на оборудовании, просто имея буфер хранилища и связная разделяемая память; буфер хранилища изолирует OoO exe c от требований фиксации по порядку (и от хранилищ с ошибками кеширования) и позволяет спекулятивно выполнять сохранения и перезагрузки.

Единственное переупорядочение, которое происходит локально, внутри каждого ядра ЦП, между его обращениями к этому глобально согласованному общему состоянию. (Вот почему локальные барьеры памяти, которые заставляют это ядро ​​ждать, пока что-то произойдет, например, для магазина буфер для слива, может восстановить последовательную согласованность поверх x86 TSO. То же самое применимо даже к более слабым моделям памяти, BTW: просто локальное переупорядочение поверх согласованности MESI.)

Остальные гарантии применяются к каждому ( логично) ядро ​​процессора индивидуально. ( Вопросы и ответы о том, как это может создать синхронизацию между ядрами.)

  • Магазины становятся видимыми в программном порядке : фиксация по порядку из магазина буфер в кэш L1d. (Записи буфера хранилища распределяются в программном порядке во время выдачи / переименования). Это означает, что хранилища промахов кэша должны блокировать буфер хранилища, не позволяя более молодым хранилищам фиксироваться. См. Почему RFO после выхода на пенсию не нарушает упорядочение памяти? для простой ментальной модели этого и некоторых подробностей о том, что Skylake действительно может делать (с фиксацией данных из промахов магазина в LFB во время ожидания строк кеша. чтобы прибыть).

  • Загрузки не переупорядочиваются в более поздних хранилищах : easy: требуется полное завершение загрузки (данные из кэша L1d), прежде чем они могут быть удалены . Поскольку вывод из эксплуатации в порядке, и магазин не может подтвердить L1d до , после он не будет отключен (станет неспекулятивным), мы получаем бесплатный заказ LoadStore 1 .

  • Загрузки берут данные из когерентного кеша (памяти) в программном порядке . Это сложный вопрос: загружает глобальное состояние доступа (кеш) при их выполнении, в отличие от хранилищ, где буфер хранилища может поглощать несоответствие между OoO exe c и фиксацией по порядку. Фактически, если сделать каждую загрузку зависимой от предыдущих загрузок, это предотвратит попадание под промах и лишит многих преимуществ выполнения вне очереди для кода, который задействует память.

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

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

( В терминах C ++ это, по крайней мере, такое же сильное, как acq_rel, но также охватывает поведение вещей, которые могут быть UB в C ++. Например, загрузка частично перекрывает недавнее хранилище с местоположением, которое может также выполняет чтение или запись, позволяя этому ядру загружать значение, которое никогда не появлялось или не появится в памяти для загрузки других потоков. Глобально невидимые инструкции загрузки )

связанные вопросы и ответы:

Сноска 1: Некоторые слабоупорядоченные процессоры OoO exe c могут выполнять упорядочивание LoadStore re , предположительно, позволяя нагрузкам удаляться из ROB, пока загрузка проверяет разрешения и запрашивает строку кэша (на случай промаха), даже если данные еще не поступили. Требуется отдельное отслеживание того, что регистр не готов, а не обычный планировщик инструкций. для приемлемой производительности. Как можно переупорядочить загрузку-> сохранение с помощью фиксации в порядке?

...