Опубликован: 08.11.2022 | Доступ: свободный | Студентов: 119 / 0 | Длительность: 06:05:00
Лекция 11:

Кэш-память

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

КЭШ-ПАМЯТЬ МНОГОЯДЕРНЫХ ПРОЦЕССОРОВ

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

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

Рассмотрим пример сбоя, который может произойти при использовании кэш-памяти, не обладающей свойством когерентности. Допустим, что в программе на С есть такая строка int x, y. В оперативной памяти эти переменные размещаются рядом и попадают в один блок, который передается в кэш-память и потом, через некоторое время, "возвращается" в оперативную память из кэш-памяти. Далее предположим, что у нас имеется двухъядерный процессор, и каждое из ядер меняет одну из этих переменных - ядро 1 меняет переменную x, а ядро 2 меняет переменную y (это может происходить, например, в разных потоках нашей программы). Таким образом, процессор выполняет следующие действия.

  1. Ядро 1 читает значение переменной x, записывая в свою кэш-память соответствующий блок оперативной памяти.
  2. Ядро 2 читает значение переменной y, записывая в свою кэш-память тот же блок оперативной памяти (напоминаем, что обе переменные находятся рядом, а кэш-память и оперативная память не могут обмениваться фрагментами памяти, соответствующими только одной переменной, и захватывают лишнее; в этом-то и проблема!).
  3. Ядро 1 записывает новое значение в переменную x в своей кэш-памяти.
  4. Ядро 2 записывает новое значение в переменную y в своей кэш-памяти.
  5. В оперативную память записывается строка кэш-памяти ядра 1; данная строка содержит как измененное значение переменной x, так и прежнее значение переменной y.
  6. В оперативную память записывается строка кэш-памяти ядра 2 данная строка содержит старое значение переменной x, так и измененное значение переменной y.

Очевидно, что на шаге 6 значение переменной x окажется прежним, которое было до того, как ядро 1 изменило эту переменную. Таким образом результаты действий ядра 1 по изменению переменной x окажутся потерянными, что является ошибкой.

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

В качестве примера рассмотрим процессор Intel Core i7 (рис.11.2). Этот процессор имеет трёхуровневую кэш-память. Внутри каждого ядра находится кэш-память первого уровня (L1); она является самой быстрой. Для повышения производительности кэш-память уровня L1 организована по принципу гарвардской архитектуры: машинный код и данные хранятся в ней раздельно. Кэш-память второго уровня (L2) имеет больший объём и меньшее быстродействие, в ней код и данные хранятся вместе. У каждого процессорного ядра имеется своя кэш-память второго уровня, и другие ядра с ней работать не могут. Наконец, кэш-память третьего уровня (L3) является общей для всех ядер, и она оказывается самой большая, но и самой медленной. Посредством кэш-памяти уровня L3 процессор обращается к системной шине для доступа к оперативной памяти.

Организация кэш-памяти в двухъядерном процессоре Intel Core i7

Рис. 11.2. Организация кэш-памяти в двухъядерном процессоре Intel Core i7

Для обеспечения когерентности внутри процессора Intel Core i7 используется внутренняя шина специальной конструкции, которая называется кольцевой сетью. К ней последовательно подключены несколько кэши разных ядер. Получив запрос на предоставление данных, каждый из них решает, обработать ли этот запрос, или передать его дальше. Когда ядро 1 на рис. 11.2 обращается к блоку памяти, копии которого нет в его внутренней кэш-памяти L1, этот запрос обрабатывает его кэш L2. Если требуемые данные нашлись в кэш-памяти L2 ядра 1, то она возвращает их ядру 1. Если же в кэш-памяти L2 ядра 1 не нашлось нужных данных, то запрос кэш-памяти L2 следующего ядра - в данном случае ядра 2. Если в кэш-памяти L2 ядра 1 требуемые данные нашлись, то этот она обрабатывает запрос и возвращает дынные в кэш-память L2 ядра 0. Если ни в одном кэшей L2 ни нашлось требуемых данных, запрос возвращается необработанным ядру 1, и концевая сеть повторно направляет его уже в кэш-память L3 (который в случае промаха обращается уже к оперативной памяти). Как только какое-то из ядер вносит изменения в кэш-данные, кольцевая сеть отправляет остальным ядрам сообщение о том, что копии этих данных в их кэш-памяти потеряли актуальность, и в случае последующих обращений их надо будет запросить у изменившего их ядра. В рассмотренном выше примере с кэшированием двух переменных x и y из разных потоков концевая сеть внесет следующие изменения в действия процессора (в этом примере мы описываем то, как это происходит в процессоре Intel Core i7).

  • На шаге 3) ядро 1 по кольцевой сети сообщает, что все копии блока памяти, за исключением той, которая находится в кэш-памяти ядра 1, становятся неактуальными.
  • На шаге 4), прежде чем менять значение переменной y, ядро 2 запрашивает актуальные данные строки кэш-памяти у ядра 1. Затем меняет значение переменной y. А после изменения сообщает ядру 1, что актуальная копия теперь у него.
  • Шагов 5) и 6) не будет, поскольку ядра процессора Intel Core i7 не взаимодействуют c оперативной памятью самостоятельно. Вместо этого в какой-то момент актуальная копия блока памяти попадёт из кэш-памяти ядра 2 в общую кэш-память L3, а ещё позже из L3 - в оперативную память.

Вопросы

  1. Дайте определение кэш-памяти процессора.
  2. Назовите основные характеристики кэш-памяти.
  3. Что такое механизм отображения кэш-памяти?
  4. Зачем нужна иерархическая кэш-память?
  5. Что такое механизм прямого отображения кэш-памяти?
  6. Что такое механизм ассоциативного отображения кэш-памяти?
  7. Что такое механизм смешанного отображения кэш-памяти?
  8. Опишите процедуру выполнения операции замещении
  9. Расскажите про LRU-стратегию.
  10. Что такое принцип Белэди?
  11. Расскажите, в каких отношениях находится прикладная программа с кэш-памятью?
  12. Что такое принцип локальности?
  13. Приведите пример соблюдения локальности при программировании на языке С.
  14. Приведите пример несоблюдения принципа локальности при программировании на языке С.
  15. Проверьте на практике, что программа, описанная в лекции и не соблюдающая принцип локальности, будет работать медленнее, чем та, в которой этот принцип соблюдается.
  16. Что такое когерентность кэш-памяти?
  17. Расскажите, как с помощью кольцевой сети реализуется когерентность кэш-памяти ядер в процессоре Intel Core i7?

Литература

  1. Орлов С.А., Цилькер Б.Я. Организация ЭВМ и систем: Учебник для вузов. 2-е изд. СПб.: Питер, 2011. 688 с.
  2. Таненбаум Э., Остин Т. Архитектура компьютера. 6-е изд. СПб.: Питер, 2013. 816 с.
  3. Bahn H., Noh, S. H. Characterization of Web reference behavior revisited: Evidence for Dichotomized Cache management // International Conference on Information Networking 2003. Jeju, South Korea: Springer-Verlag. P. 1018-1027.
< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Наталья Ра
Наталья Ра

Здравствуйте! Когда появится возможность сдать экзамен на сертификат?