logo
Методичка

3.2 Организация кэш-памяти

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

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

Кэш-память имеет совокупность строк (cache-lines), каждая из которых состоит из фиксированного количества адресуемых единиц памяти (байтов, слов), хранящихся в основной памяти как ячейки с последовательными адресами. Типичный размер кэш-строки: 16, 64, 128, 256 байтов.

Так как в кэш-памяти находятся копии ячеек основной памяти, работа с кэш-памятью при доступе к памяти по чтению и записи различается. Чтение данных из кэш-памяти не вызывает никаких проблем. Данные, если они есть в кэш-памяти, передаются процессору. В этом случае говорят о попадании (hit) процессора в кэш-память. Если копии данных с требуемым адресом нет в кэш-памяти, то говорят о промахе (miss) процессора и выполняют доставку копии требуемых данных в кэш-память.

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

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

Другой способ предполагает отображение изменений в основной памяти только в момент замены кэш-строки в кэш-памяти. Если данные по адресу памяти, в который необходимо произвести запись, находятся в кэш-памяти, то идет запись только в кэш-память. При отсутствии данных в кэш-памяти производится запись сразу в основную память. Такой режим работы кэш памяти получил название "обратная запись" (write-back) или "отложенная запись".

Существуют также "буферная сквозная запись" (buffed write through), при которой запросы на изменение в основной памяти буферизуются и не задерживают процессор на время операции записи в память. Эта запись выполняется по мере возможности доступа контроллера кэш-памяти к основной памяти.

Наиболее часто используются три способа организации кэш-памяти, отличающиеся объемом аппаратуры, требуемой для их реализации. Это, так называемая, кэш-память с прямым отображением (direct-mapped cache), множественно ассоциативная кэш-память (set-associative cache) и ассоциативная кэш-память (fully associative cache).

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

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

При этом устанавливается однозначное соответствие между адресом элемента основной памяти и возможным расположением этого элемента в кэш памяти, а именно: элемент памяти всегда располагается в кэш-строке, задаваемой полем "номер строки" адреса, и находится на позиции строки, задаваемой полем "смещение" адреса.

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

Проверка того, что имеет место: попадание или промах в кэш-память определяется анализом значения тега кэш-строки, номер которой равен значению поля "номер строки" адреса. Если тег строки кэш-памяти равен полю "тег" адреса, то элемент данных содержится в кэш-памяти. В этом случае адресуемая ячейка памяти имеет копию значения в кэш-строке в позиции, определяемой полем "смещение" адреса.

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

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

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

Ассоциативная кэш-память использует двухкомпонентное представление адреса: группа старших разрядов трактуется как тег, а группа младших разрядов - как смещение в кэш-строке.

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

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

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

Множественно-ассоциативная кэш-память комбинирует оба описанных подхода: кэш-память состоит из набора ассоциативных блоков кэш-памяти. Средний компонент адреса задает, в отличие от прямо адресуемой кэш памяти, не номер строки, а номер одного из ассоциативных блоков. При поиске данных ассоциативное сравнение тегов выполняется только для набора блоков (возможна организация кэш-памяти, когда таких наборов несколько), номера которых совпадают со средним компонентом адреса. По количеству n ассоциативных блоков кэш-память называется n‑входовой. Обычно n выбирается равным 4 и более.

Типовая иерархия памяти для однопроцессорных архитектур выглядит следующим образом: