Почему LOCK является полным барьером на x86? - PullRequest
4 голосов
/ 21 февраля 2020

Почему префикс LOCK создает полный барьер на x86? (И, таким образом, он опустошает буфер хранилища и имеет последовательную согласованность)

Для операций LOCK / read-modify-write полный барьер не требуется и исключительного доступа к строке кэша кажется достаточным , Это выбор дизайна или есть какое-то другое ограничение?

1 Ответ

6 голосов
/ 21 февраля 2020

Долгое время go, до Intel 80486, процессоры Intel не имели встроенных кэш-памяти или буферов записи. Таким образом, все записи сразу становятся видимыми по всему миру, и вам не нужно было никуда расходовать магазины. Заблокированная транзакция выполняется путем полной блокировки шины для всего адресного пространства.

В процессорах 486 и Pentium буферы записи были добавлены в кристалл, а некоторые модели также имеют внутрикристальный кэш. Сначала рассмотрим модели, которые не имеют встроенных кэшей. Все записи временно удерживаются в буферах записи на кристалле до тех пор, пока они не будут записаны на шину, когда она доступна, или не произойдет событие сериализации. Помните, что транзакции atomi c RMW используются для получения эксклюзивного доступа к программным структурам или аппаратным ресурсам. Таким образом, если процессор выполняет заблокированную транзакцию, не должно случиться так, что процессор думает, что ему предоставлено право владения ресурсом, но тогда другой процессор также каким-то образом заканчивает тем, что также получает владение. Если часть записи заблокированной транзакции буферизуется в буфере записи, а затем блокировка шины отменяется, ничто не мешает другим агентам одновременно получать доступ к ресурсу. По сути, часть записи должна быть видимой для всех других агентов, и способ сделать это - не буферизовать ее. Но модель памяти x86 требует, чтобы все записи становились глобально видимыми по порядку (на этих процессорах не было слабого упорядочения). Таким образом, для того, чтобы сделать часть записи заблокированной транзакции наблюдаемой в глобальном масштабе, все буферизованные записи также должны быть выполнены глобально наблюдаемыми в том же порядке.

Некоторые модели 486 и все процессоры Pentium имеют встроенные кэши. Но на этих процессорах не было поддержки блокировок кеша. Вот почему заблокированные транзакции не могли быть кэшированы на этих процессорах, потому что единственный способ гарантировать атомарность состоял в том, чтобы обойти кеш и заблокировать шину. После получения блокировки шины выполняется одна или несколько записей в зависимости от выравнивания и размера области памяти назначения. Буферы записи все еще должны быть очищены перед снятием блокировки шины.

В Pentium Pro внесены некоторые важные изменения, включая слабо упорядоченные записи, буферы объединения записи и блокировку кэша. То, что называлось «буферами записи», обычно называют буферами хранилища на более современных микроархитектурах. Заблокированная транзакция использует блокировку кеша на этих процессорах, но блокировка кеша не может быть снята до тех пор, пока заблокированное хранилище не будет передано из буфера хранилища в кеш, что делает хранилище глобально наблюдаемым, что обязательно требует того, чтобы все предыдущие хранилища наблюдались глобально. Эти события должны происходить в таком порядке. Тем не менее, я не думаю, что заблокированные транзакции должны сериализовать слабо упорядоченные записи, но Intel решила сделать их таким образом. Возможно, потому что Intel хотела удобную инструкцию, которая истощает буферы W C на PPro при отсутствии выделенного забора магазина.

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