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

Следующие ключевые моменты (которые проиллюстрированы приведенным выше графическим представлением) кратко расскажут о кэш-памяти, ее важности и способах ее эффективного использования.
- Если ЦП генерирует адрес (который сам является адресом основной памяти) и хочет выполнить какую-то операцию с содержимым, присутствующим в этом конкретном содержимом, то прямой доступ к основной памяти будет трудоемким процессом.
- Причина того, что это отнимает много времени, заключается в том, что ЦП сначала проверит свой сгенерированный адрес в основной памяти, допустим, если ЦП найдет этот конкретный адрес в основной памяти, то впоследствии ЦП выполнит свою операцию над этим операндом (значение, которое равно присутствует по определенному адресу основной памяти).
- Весь этот процесс займет огромное количество времени, что в конечном итоге замедлит работу процессора, а также приведет к повреждению или уничтожению программы.
- Вот почему нам нужна кэш-память, чтобы процессор работал немного быстрее при доступе к любой информации, которую процессор в конечном итоге получит из кэш-памяти, где мы храним наиболее востребованные или необходимые данные, которые нужны процессору для доступа.
- В кэш-памяти мы будем хранить весь блок, необходимый для процессора, и, таким образом, мы уменьшим время доступа к памяти для доступа к определенному контенту из основной памяти, поскольку теперь мы обращаемся к нему через кэш-память.
- Если ЦП попытается получить доступ к блоку основной памяти, который не найден в Кэш-памяти, то ЦП должен будет получить доступ к самой основной памяти для дальнейших операций, которые должны быть выполнены с конкретным блоком основной памяти.
Теперь, когда вы поняли основную концепцию кэш-памяти и то, как это работает, когда ЦП хочет получить доступ к любому адресу основной памяти, давайте перейдем к нашей основной теме рассмотрения — одновременному доступу к кэшу и иерархическому доступу к кэшу.
Типы доступа к кешу: Возможны два типа доступа к кешу всякий раз, когда ЦП хочет получить доступ к определенному адресу основной памяти: одновременный доступ к кешу и иерархический доступ к кешу. Оба они имеют одинаковое представление блоков, но их работа, доступ и, что наиболее важно, их среднее время доступа к памяти соответственно различаются.
1. Одновременный доступ к кешу:
- При одновременном доступе к кэшу запросы к кэш-памяти и основной памяти генерируются одновременно.
- Если адрес, сгенерированный ЦП, обнаружен в кэш-памяти, то он считается попаданием, и тогда ЦП может напрямую получить доступ к адресу основной памяти, а также к его содержимому из самой кэш-памяти и далее, если в кэш-памяти происходят какие-либо изменения в отношении этого конкретного тогда эти изменения будут выполняться в основной памяти также после кэш-памяти.
- Если адрес генерации ЦП не найден в кэш-памяти, то он считается пропущенным, и тогда ЦП должен получить доступ к этому адресу из основной памяти, и, кроме того, этот блок из основной памяти перемещается в кэш-память для будущих ссылок, а также для использования.
- Одновременный доступ к памяти используется для реализации записи через кэш.
Расчет среднего времени доступа к памяти при одновременном доступе –
Если это попадание, ЦП получит доступ к содержимому из самой кэш-памяти, а если это промах, то основная память вступит в действие.
Поэтому среднее время доступа к памяти в случае одновременного доступа будет показано ниже —
- Среднее время доступа к памяти = коэффициент попаданий * время доступа к кэш-памяти + (1 – коэффициент попаданий) * время доступа к основной памяти
Если предположить, что сюда включена локальность ссылки, то мы используем следующую концепцию для определения среднего времени доступа к памяти:
- Среднее время доступа к памяти = коэффициент попаданий * время доступа к кэш-памяти + (1 – коэффициент попаданий) * время, необходимое для доступа к блоку основной памяти.
где время, необходимое для доступа к блоку основной памяти = размер блока * время, необходимое для доступа к основной памяти.
Если предположить, что сюда также включено время передачи блока, то мы используем следующую концепцию для определения среднего времени доступа к памяти:
- Среднее время доступа к памяти = коэффициент попаданий * время доступа к кэш-памяти + (1 — коэффициент попаданий) * (время доступа к кэш-памяти + время, необходимое для доступа к блоку основной памяти)
где Время, необходимое для доступа к блоку основной памяти = размер блока * Время, необходимое для доступа к основной памяти.
Здесь причина использования доступа к кэш-памяти в случае промаха вместе со временем доступа к блоку заключается в том, что нам нужно скопировать блок в кэш-память (если это показано в каком-либо конкретном сценарии).
2. Иерархический доступ к кэшу:
Хотя базовая структура блоков остается похожей на структуру иерархического доступа к кэшу, на самом деле между иерархическим и одновременным доступом к памяти кэша есть несколько различий, которые описаны ниже (в пунктах):
- При иерархическом доступе к кешу в первую очередь осуществляется доступ только к более быстрой памяти (кэш-памяти).
- Впоследствии, если адрес, сгенерированный процессором, не будет найден в Кэш-памяти, то наряду со временем поиска в Кэш-памяти будет учитываться и время доступа к основной памяти.
- По умолчанию многие компьютерные конструкции сделаны с использованием этого иерархического доступа только потому, что этот доступ к кэшу уменьшает среднее время доступа к памяти из-за концепции локальности ссылки (в которой для определенного адреса основной памяти мы просто приводим его предыдущий и его следующий адрес также в виде блокировать, чтобы в будущем требовалось меньше доступа к памяти).
Расчет среднего времени доступа к памяти при иерархическом доступе –
Если это попадание, то ЦП будет получать доступ к содержимому из самой кэш-памяти, а если это промах, то наряду со временем доступа к кэш-памяти также учитывается время доступа к основной памяти.
Поэтому среднее время доступа к памяти в случае иерархического доступа будет показано ниже —
- Среднее время доступа к памяти = коэффициент попаданий * время доступа к кэш-памяти + (1 – коэффициент попаданий) * (время доступа к кэш-памяти + время доступа к основной памяти)
Пример 1: В двухуровневой иерархии, если верхний уровень имеет время доступа 10 нс, а нижний уровень имеет время доступа 60 нс, какова частота совпадений на верхнем уровне, необходимая для получения среднего времени доступа 15 нс?
Объяснение: Согласно примеру, нам дано время доступа к кэшу (верхний уровень) = 10 нс, время доступа к основной памяти (нижний уровень) = 60 нс и среднее время доступа к памяти = 15 нс.
Поэтому мы будем применять проиллюстрированную выше концепцию иерархического доступа (поскольку речь шла о двухуровневой иерархии) для расчета времени доступа к памяти, которое:
Среднее время доступа к памяти = Коэффициент попаданий * Время доступа к кэш-памяти + (1 – коэффициент попаданий) * (Время доступа к кэш-памяти + Время доступа к основной памяти)
15 нс = 10 * коэффициент попаданий + (1 — коэффициент попаданий) * (10 нс + 60 нс)
15 нс-70 нс = -60 * коэффициент попаданий
Соотношение попаданий = 55/60 = 11/12 = 0,9 (ответ)
Если предположить, что сюда включена локальность ссылки, то мы используем следующую концепцию для определения среднего времени доступа к памяти.
- Среднее время доступа к памяти = коэффициент попаданий * время доступа к кэш-памяти + (1 – коэффициент попаданий) * (время, необходимое для доступа к блоку основной памяти + время доступа к кэш-памяти)
где Время, необходимое для доступа к блоку основной памяти = размер блока * Время, необходимое для доступа к основной памяти.
Пример 2 –
В двухуровневой иерархии верхний уровень имеет время доступа 10 нс, а нижний уровень имеет время доступа 50 нс, частота совпадений на верхнем уровне составляет 90%. Если размер блока кеша составляет 16 байт, то какое среднее время доступа к памяти требуется? (Учитывайте, что система использует локальность ссылки)
Объяснение -
Заданное время доступа к кэш-памяти (верхний уровень) = 10 нс
Время доступа к основной памяти (нижний уровень) = 60 нс
Поэтому мы будем применять изученную выше концепцию для расчета среднего времени доступа к памяти, когда мы должны учитывать концепцию локальности ссылки.
- Среднее время доступа к памяти = Коэффициент совпадений * Время доступа к кэш-памяти + (1 – Коэффициент попаданий) * ((Размер блока * Время доступа к основной памяти) + Время доступа к кэш-памяти)
Среднее время доступа к памяти = 10 * 0,9 + (1 - 0,9) * (16 * 5 + 10)
= 9 + (0,1) * (800 + 10)
= 9 + 81 = 90 нс (ответ)
Если предположить, что время передачи блока также включено сюда, то мы используем следующую концепцию для определения среднего времени доступа к памяти.
Среднее время доступа к памяти = коэффициент попаданий * время доступа к кэш-памяти + (1 – коэффициент попаданий) * (время доступа к кэш-памяти + время, необходимое для доступа к блоку основной памяти + время доступа к кэш-памяти)
где Время, необходимое для доступа к блоку основной памяти = размер блока * Время, необходимое для доступа к основной памяти.
Пример 3 –
В двухуровневой иерархии время доступа к кешу составляет 12 нс, а время доступа к основной памяти — 120 нс, процент попаданий в кеш составляет 90%. Если размер блока кеша составляет 16 байт, то каково среднее время доступа к памяти с учетом промаха? (Наказание за промах: время, необходимое для переноса блока основной памяти в кэш-память, когда происходит промах кеша)
Объяснение -
Заданное время доступа к кэш-памяти = 12 нс
Время доступа к основной памяти = 120 нс
Поэтому мы будем использовать изученную выше концепцию для расчета среднего времени доступа к памяти, когда происходит передача блока из основной памяти в кэш-память при промахе кеша.
- Среднее время доступа к памяти = Коэффициент попаданий * Время доступа к кэш-памяти + (1 – Коэффициент попаданий) * (Время доступа к кэш-памяти + (Размер блока * Время доступа к основной памяти) + Время доступа к кэш-памяти из-за блочной передачи)
Среднее время доступа к памяти = 0,9 * 12 = (0,1) * (12 нс + 16 * 120 нс + 12 нс)
= 10,8 нс + 194,4 нс = 205,2 нс (ответ)