Политика записи / выделения при записи в кэш-память

Я не смог найти источник, который объясняет, как политика работает в деталях. Комбинации правил записи объяснены в Документе Jouppi для заинтересованных. Вот как я это понял.

  1. Запрос на запись отправляется из процессора в кэш.
  2. Запрос результатов в кеше-мисс.
  3. Блок кеша выделяется для этого запроса в кеше.(Write-Allocate)
  4. Блок запроса записи извлекается из нижней памяти в выделенный блок кэша.(Fetch-on-Write)
  5. Теперь мы можем записать в выделенный и обновленный блок выборки кеша.

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

Должен ли процессор повторять запрос на запись в кэш до тех пор, пока не произойдет попадание? (после выборки блока в выделенный блок кэша)

Если нет, то где хранятся данные запроса на запись?

Изменить: я думаю, что я нашел свой ответ в реализации записи выделения в процессорах K86™. Он напрямую записывается в выделенный блок кэша и позже объединяется с запросом на чтение.

1 ответ

Решение

Он напрямую записывается в выделенный блок кэша и позже объединяется с запросом на чтение.

Нет, это не то, что говорит AMD pdf. Они говорят, что данные хранилища объединяются с только что извлеченными данными из памяти, а затем сохраняются в массив данных кэша L1.

Кэш отслеживает достоверность с гранулярностью строки кэша. Для него нет способа сохранить тот факт, что "байты с 3 по 6 действительны; сохраняйте их, когда данные поступают из памяти". Такая логика слишком велика для репликации в каждой строке массива кэша.

Также обратите внимание, что PDF-файл, который вы нашли, описывает некоторое специфическое поведение их микроархитектур AMD K6, которые были только одноядерными, а некоторые модели имели только один уровень кэш-памяти, поэтому протокол когерентности не требовался. Они описывают K6-III (модель 9), используя MESI между кэшами L1 и L2.


Запись ЦП в кеш должна удерживать данные до тех пор, пока кеш не будет готов принять их. Это не процесс повторной попытки, пока успех. Это больше похоже на то, как кеш уведомляет оборудование хранилища, когда оно готово принять это хранилище (т. Е. У него активна эта строка, и в состоянии Modified, если кеш согласован с другими кешами, использующими протокол MESI).

В реальном процессоре несколько невыполненных промахов могут выполняться сразу (даже без полного спекулятивного выполнения не по порядку). Это называется мисс под мисс. Соединению с кешем ЦП<->требуется буфер для каждой пропущенной ошибки, который может поддерживаться параллельно, для хранения данных хранилища. Например, ядро ​​может иметь 8 буферов и поддерживать 8 невыполненных загрузок или пропусков хранения. 9-я операция с памятью не могла начаться, пока не стал доступен один из 8 буферов. До тех пор данные должны были бы оставаться в очереди хранилища ЦП.

Эти буферы могут быть разделены между загрузками и хранилищами, или могут быть выделенные буферы хранилищ. ОП сообщает, что поиск в буфере магазина нашел много интересного; Одним из примеров является эта часть статьи Википедии MESI.

Кэш L1 действительно является частью ядра ЦП в современных высокопроизводительных разработках. Он очень тесно интегрирован с логикой порядка памяти и должен иметь возможность эффективно поддерживать атомарные операции, такие как lock inc [mem] и много других осложнений (например, переупорядочение памяти). Смотрите, например, https://en.wikipedia.org/wiki/Memory_disambiguation.

Некоторые другие термины:

  • хранить буфер
  • очередь магазина
  • буфер порядка памяти
  • порт записи в кэш / порт чтения в кеш / порт кеша
  • глобально видимый

Относительно отдаленный: интересный пост, посвященный политике адаптивной замены кеша Intel IvyBridge L3, что делает его более устойчивым к удалению ценных данных при сканировании огромного массива.

Другие вопросы по тегам