Буфер хранилища отправляет сообщение о недействительности чтения или недействительное сообщение req?
Я думаю, чтобы процессор продолжал выполнять последующие инструкции, буфер хранилища должен выполнить часть обработки MESI, чтобы получить согласованность кеша, потому что последнее значение хранится в буфере хранилища, а не в кеше. Таким образом, буфер хранилища отправляет сообщения о недействительности или недействительности чтения REQ и сбрасывает последнее значение в кэш после получения ACK.
И Кэш не может этого сделать.
Правильный ли мой анализ и результат?
Или вся обработка MESI должна выполняться кешем?
1 ответ
В большинстве проектов буфер хранилища напрямую не отправляет недействительные запросы и обычно даже не отслеживается1 внешними запросами. То есть он является частью частной / основной стороны домена когерентности и поэтому не должен участвовать в когерентности. Вместо этого буфер хранилища в конечном итоге взаимодействует с первым уровнем подсистемы кэширования, который сам будет отвечать за различные части протокола MESI.
Как именно это взаимодействие работает, конечно , зависит от дизайна. Простая схема может обрабатывать только одно хранилище за раз: самое старое, которое находится в начале буфера хранилища, и выполняет RFO для этого адреса, а после завершения переходит к следующему элементу. Более сложный дизайн может посылать RFO для нескольких "предстоящих" запросов в буфере хранилища в попытке использовать больше MLP. Точный механизм неясен для меня на x86: в некоторых сценариях хранилища на L2 работают довольно плохо, но я уверен, что куча неудач с хранилищами в ОЗУ будет работать намного лучше, чем при последовательной обработке.
1 Существуют некоторые исключения, например, одновременная многопоточность (гиперпоточность в x86), которая включает в себя два логических ядра, совместно использующих все уровни кэша и, следовательно, возможность использовать обычные механизмы когерентности кэша, может потребовать отслеживания буфера хранилища.