mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
КЛ16-17. Исправление ссылок и правки текста
* Правка картинок * Правка текста * Правка текста Л16 * Правки текста Л17 * Правки картинок в Л16
This commit is contained in:
@@ -37,18 +37,18 @@
|
||||
|
||||
## Иерархия памяти
|
||||
|
||||
**Иерархия памяти** - это объединение разных типов памяти с целью получения большой, дешевой, и быстрой памяти, с чем можно более подробно ознакомиться на *(рис. 2)*. Наивысший уровень иерархии (**Cache**) обычно является наиболее быстрым и наименее емким, в то время как нижний уровень обычно имеет наибольший объем, но и наибольшую задержку (**Secondary (external) Memory**).
|
||||
**Иерархия памяти** — это объединение разных типов памяти с целью получения большой, дешевой и быстрой памяти, с чем можно более подробно ознакомиться на *(рис. 2)*. Наивысший уровень иерархии (**Cache**) обычно является наиболее быстрым и наименее емким, в то время как нижний уровень обычно имеет не только наибольший объем, но и наибольшую задержку (**Secondary (external) Memory**).
|
||||
|
||||

|
||||

|
||||
|
||||
*Рис. 2. Схема расположения разных типов памяти и пирамида иерархии памяти.*
|
||||
|
||||
**SRAM** (Static Random-Access Memory) - тип быстрой полупроводниковой памяти, который сохраняет данные без необходимости периодического обновления. Используется в кэш-памяти процессоров из-за своей высокой скорости.
|
||||
**DRAM** (Dynamic Random-Access Memory) - тип полупроводниковой памяти, который требует периодического обновления для сохранения данных.
|
||||
**SSD** (Solid-State Drive) - устройство хранения данных, работающее на основе NAND-памяти.
|
||||
**HDD** (Hard Disk Drive) - устройство хранения данных, использует магнитные диски для записи и чтения данных, имеет больший объем по сравнению с SSD, но скорость доступа к данным обычно ниже.
|
||||
**SRAM** (Static Random-Access Memory) — тип быстрой полупроводниковой памяти, который сохраняет данные без необходимости периодического обновления. Используется в кэш-памяти процессоров из-за своей высокой скорости.
|
||||
**DRAM** (Dynamic Random-Access Memory) — тип полупроводниковой памяти, который требует периодического обновления для сохранения данных.
|
||||
**SSD** (Solid-State Drive) — устройство хранения данных, работающее на основе NAND-памяти.
|
||||
**HDD** (Hard Disk Drive) — устройство хранения данных, использует магнитные диски для записи и чтения данных, имеет больший объем по сравнению с SSD, но скорость доступа к данным обычно ниже.
|
||||
|
||||
Несмотря на то, что кэш-память во много раз быстрее основной памяти, она еще в большее число раз меньше её. Разумеется объем кэша меняется от процессора к процессору, но для определенности возьмем следующий пример: допустим, в процессорной системе кэш 32МБ, а объем оперативной памяти — 32ГБ. Получается, кэш меньше основной памяти в 1024 раза. Как же так получается, что обращаясь в кэш, процессор умудряется получать именно те данные, которые запрашивал? Ведь если вероятность того, что кэш содержит нужные процессору данные составляет 1/1024-ую, то он будет ухудшать производительность системы, а не улучшать ее. Этому способствует такое явление как **локальность данных**.
|
||||
Несмотря на то что кэш-память во много раз быстрее основной памяти, она еще в большее число раз меньше её. Разумеется, объем кэша меняется от процессора к процессору, но для определенности возьмем следующий пример: допустим, в процессорной системе кэш 32МБ, а объем оперативной памяти — 32ГБ. Получается, кэш меньше основной памяти в 1024 раза. Как же так получается, что, обращаясь в кэш, процессор умудряется получать именно те данные, которые запрашивал? Ведь если вероятность того, что кэш содержит нужные процессору данные, составляет 1/1024-ую, то он будет ухудшать производительность системы, а не улучшать ее. Этому способствует такое явление как **локальность данных**.
|
||||
|
||||
## Локальность данных
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
- Где могут быть размещены данные в кэш-памяти? ([**Размещение строки в разных видах кэшах-памяти**](#существует-3-вида-кэш-памяти))
|
||||
- Как найти данные в кэш-памяти? ([**Идентификация строки**](#идентификация-строки))
|
||||
- Какие данные нужно заместить, при заполненной кэш-памяти? ([**Алгоритмы замещение строки**](#алгоритмы-замещения-данных))
|
||||
- Какие данные нужно заместить при заполненной кэш-памяти? ([**Алгоритмы замещение строки**](#алгоритмы-замещения-данных))
|
||||
- Что происходит при записи в кэш-память? ([**Стратегия записи**](#стратегии-чтения-и-записи-в-кэш))
|
||||
|
||||
## Характеристики кэш-памяти
|
||||
@@ -79,10 +79,10 @@
|
||||
*Порция перемещения данных между разными уровнями иерархии памяти.*
|
||||
- Количество строк (блоков) – ***B*** = C/b
|
||||
- Степень ассоциативности – ***N***
|
||||
*Количество места в кэш-памяти на которое претендует конкретная строка. Каждая ячейка может располагаться только в одном наборе, один набор может состоять из нескольких строк - это и есть степень ассоциативности.*
|
||||
*Количество места в кэш-памяти, на которое претендует конкретная строка. Каждая ячейка может располагаться только в одном наборе, один набор может состоять из нескольких строк — это и есть степень ассоциативности.*
|
||||
|
||||
**Наборы в кэш-памяти**:
|
||||
Кэш дробится на подгруппы, которые называются наборами. Особенность наборов заключается в том, за каждой ячейкой памяти закреплен свой набор. Иными словами, ячейка памяти может быть загружена не в любое место кэша.
|
||||
Кэш дробится на подгруппы, которые называются наборами. Их особенность заключается в том, что каждая ячейка памяти закреплена за своим набором. Иными словами, ячейка памяти может быть загружена не в любое место кэша.
|
||||
|
||||
- Кэш ***состоит из S наборов***, каждый из которых содержит одну или несколько строк.
|
||||
- Взаимосвязь между адресом в памяти и расположением в кэш называется ***отображением***.
|
||||
@@ -124,14 +124,14 @@
|
||||
|
||||
### Идентификация строки
|
||||
|
||||
Каждая ячейка памяти претендует только на свой набор и имеет свой уникальный адрес. На *(рис. 5)* подробнее рассмотрим как уникальный адрес делится на несколько частей:
|
||||
Каждая ячейка памяти претендует только на свой набор и имеет свой уникальный адрес. На *(рис. 5)* подробнее рассмотрим, как уникальный адрес делится на несколько частей:
|
||||
|
||||

|
||||
|
||||
*Рис. 5. Схематичное представление разделения уникального адреса ячейки памяти на составляющие части.*
|
||||
|
||||
где
|
||||
Первые 2 бита (**Byte Offset**) - смещение внутри слова
|
||||
Первые 2 бита (**Byte Offset**) — смещение внутри слова
|
||||
Следующие три бита (**Set**) указывают, на какой набор претендует ячейка памяти.
|
||||
Оставшиеся 10 бит представляют собой **Tag**, с помощью которого определяется, находится ли ячейка в кэш-памяти или нет.
|
||||
|
||||
@@ -177,7 +177,7 @@ done:
|
||||
|
||||
*Рис. 7. Визуализация процесса выполнения ассемблерного кода, иллюстрирующая проблему вытеснения ячейки памяти с адресами 4 и 24.*
|
||||
|
||||
Соответственно **MR** в данном случае будет 100%:
|
||||
Соответственно, **MR** в данном случае будет 100%:
|
||||
|
||||

|
||||
|
||||
@@ -185,22 +185,22 @@ done:
|
||||
|
||||
Идея множественно-ассоциативного кэша заключается в наличии нескольких строк внутри одного набора. Увеличив ассоциативность, мы теперь имеем двухсекционный кэш (**Way 1** и **Way 0**) *(рис. 8)*. Каждая ячейка памяти может претендовать на любую из этих двух секций, и, в таком случае, вытеснения не произойдет.
|
||||
|
||||

|
||||

|
||||
|
||||
*Рис. 8. Структура множественно-ассоциативного кэша. Отображены две ассоциативные секции — Way 1 и Way 0 — внутри одного набора.*
|
||||
|
||||
Но такой кэш *(рис. 9)* сразу будет работать медленнее из-за появившегося мультиплексора на выходе, более сложен в реализации, увеличивается сложность вычислений.
|
||||
Но такой кэш *(рис. 9)* сразу будет работать медленнее из-за появившегося мультиплексора на выходе, он более сложен в реализации, кроме того, увеличивается сложность вычислений.
|
||||
**Тот же пример:**
|
||||
|
||||

|
||||
|
||||
*Рис. 9. При обращении к адресам 0x4 и 0x24 видно, что ячейки памяти могут быть распределены по разным секциям (Way 1 и Way 0), что предотвращает вытеснение.*
|
||||
|
||||
Теперь у нас будет два промаха в первом цикле, а уже на следующих, мы без проблем сможем обращаться к обеим ячейкам, таким образом теперь MR = 20%
|
||||
Теперь у нас будет два промаха в первом цикле, а уже на следующих мы без проблем сможем обращаться к обеим ячейкам. Таким образом, теперь MR = 20%
|
||||
|
||||
## Полностью ассоциативный кэш
|
||||
|
||||
В полностью ассоциативном кэше *(рис. 10)* мы оставляем **только один набор**, то есть любая ячейка из памяти, может попасть в любую секцию, в таком варианте кэша отлично решается проблема вытеснения, но этим самым реализация становится крайне объемной и медленной, поэтому он находит применение в более специфических местах.
|
||||
В полностью ассоциативном кэше *(рис. 10)* мы оставляем **только один набор**, то есть любая ячейка из памяти может попасть в любую секцию. В таком варианте кэша отлично решается проблема вытеснения, однако реализация становится крайне объемной и медленной, поэтому он находит применение в более специфических местах.
|
||||
|
||||

|
||||
|
||||
@@ -208,17 +208,19 @@ done:
|
||||
|
||||
### Длина строки (блока)
|
||||
|
||||
Если процессор не находит в кэше данные той ячейки памяти, к которой он обращался, он забирает эти данные из основной памяти, одновременно перемещая их в кэш. Как вы знаете, благодаря **пространственной локальности** высока вероятность того, что вскоре процессор обратится и к соседним ячейкам памяти. Поэтому эффективно будет переместить в кэш данные не только этой ячейки памяти, но и данные ячеек памяти, лежащих рядом с ней, образуя **блок данных**. Таким образом, кэш оперирует данными не на уровне ячеек памяти (**слов**), а на уровне блоков ячеек (**строк**). В простейшем случае, в одной строке находится одно слово, т.е. кэш загружает только ту ячейку памяти, к которой он обращался.
|
||||
Если процессор не находит в кэше данные той ячейки памяти, к которой он обращался, он забирает эти данные из основной памяти, одновременно перемещая их в кэш. Как вы знаете, благодаря **пространственной локальности** высока вероятность того, что вскоре процессор обратится и к соседним ячейкам памяти. Поэтому эффективно будет переместить в кэш данные не только этой ячейки памяти, но и данные ячеек памяти, лежащих рядом с ней, образуя **блок данных**. Таким образом, кэш оперирует данными не на уровне ячеек памяти (**слов**), а на уровне блоков ячеек (**строк**). В простейшем случае в одной строке находится одно слово, т.е. кэш загружает только ту ячейку памяти, к которой он обращался.
|
||||
|
||||

|
||||
|
||||
*Рис. 11. Схематическое представление деления адреса в контексте длины строки (или блока) кэша.*
|
||||
|
||||
Здесь *(рис. 11)* у нас есть адрес делится на чуть большее количество секций, байтовое смещение (**Bite Offsets**) для байта внутри одного слова, смещение блока (**Block Offsets**) т.е. смещение внутри строки, бит для выбора набора (**Set**) и 27 бит под **Tag**.
|
||||
Здесь *(рис. 11)* у нас адрес делится на чуть большее количество секций, байтовое смещение (**Bite Offsets**) для байта внутри одного слова, смещение блока (**Block Offsets**) т.е. смещение внутри строки, бит для выбора набора (**Set**) и 27 бит под **Tag**.
|
||||
|
||||
**Плюсы**:
|
||||
При обращении к одной инструкции из кэша автоматически загружаются и следующие три инструкции, что обеспечивает быстрый доступ к большому объему данных.
|
||||
**Минусы**: Пропускная способность канала между процессором и памятью. Промах с длинной строкой будет стоить дороже, чем промах с одним словом.
|
||||
**Плюсы**:
|
||||
При обращении к одной инструкции из кэша автоматически загружаются и следующие три инструкции, что обеспечивает быстрый доступ к большому объему данных.
|
||||
|
||||
**Минусы**:
|
||||
Пропускная способность канала между процессором и памятью. Промах с длинной строкой будет стоить дороже, чем промах с одним словом.
|
||||
|
||||
**Вернемся к первому примеру:**
|
||||
|
||||
@@ -245,21 +247,23 @@ done:
|
||||
## Алгоритмы замещения данных
|
||||
|
||||
- **LRU** (Least Recently Used) – наиболее давнего использования +
|
||||
*Рассмотрим на примере двухсекционного кэша *(рис. 13)*, где у нас добавляется дополнительный бит (**U** - used) куда помещается номер секции, которая сейчас не использовалась. Т.е. если сейчас мы записываем в секцию 0 то в этот бит попадает 1, и если потребуется какую то из ячеек убрать, то устройство управления этим кэшем, выберет ту ячейку, которая указана в поле U.*
|
||||
*Рассмотрим на примере двухсекционного кэша *(рис. 13)*, где у нас добавляется дополнительный бит (**U** - used), куда помещается номер секции, которая сейчас не использовалась. Т.е. если сейчас мы записываем в секцию 0, то в этот бит попадает 1, и, если потребуется какую-то из ячеек убрать, устройство управления этим кэшем выберет ту ячейку, которая указана в поле U.*
|
||||
|
||||

|
||||
|
||||
*Рис. 13. Схема работы алгоритма замещения данных LRU на примере двухсекционного кэша.*
|
||||
|
||||
- **PLRU** (Pseudo-Least Recently Used) – псевдо наиболее давнего использования +/–
|
||||
*Все секции делятся пополам, которые устроены по алгоритму LRU, а внутри конкретная ячейка выбирается случайным образом.*
|
||||
*Все секции, которые устроены по алгоритму LRU, делятся пополам, а внутри конкретная ячейка выбирается случайным образом.*
|
||||
- **FIFO** (First In First Out) – замещение в порядке очереди
|
||||
*Данные выходят в том же порядке, в котором заходили.*
|
||||
*Данные выходят в том же порядке, в котором поступали.*
|
||||
- **LFU** (Least Frequently Used) – наименее частого использования +
|
||||
*С каждой секцией ассоциирован счетчик, и при каждом обращении к секции, счетчик у конкретной ячейки увеличивается. Замещается ячейка с наименьшим числом счетчика.*
|
||||
*С каждой секцией ассоциирован счетчик, при каждом обращении к секции счетчик у конкретной ячейки увеличивается. Замещается ячейка с наименьшим числом счетчика.*
|
||||
- **RND** (Random Replacement) – замена случайной строки –
|
||||
- **CLOCK** – циклический список с указателем +
|
||||
*С каждой ячейкой ассоциирован бит, когда к ячейка обращаются, этот бит устанавливается в 1, а при необходимости замещения алгоритм начинает просматривать, что закреплено за конкретной секцией, если 1, то она меняется на 0 и так далее, пока снова не наткнется 0, тогда замещает эту ячейку.*
|
||||
*Каждой ячейке ассоциирован отдельный бит, устанавливаемый в 1 при обращении к ячейке. В случае необходимости замещения, алгоритм начинает по порядку просматривать данные биты:*
|
||||
- *в случае, если бит равен 1, то он сбрасывается в 0;*
|
||||
- *в случае, если бит равен 0, замещается ассоциированная с этим битом ячейка*.
|
||||
|
||||
Количество промахов на 1000 обращений к памяти:
|
||||
|
||||
@@ -273,15 +277,15 @@ done:
|
||||
- Чтение с параллельной выборкой (look-aside)
|
||||
- Чтение со сквозным просмотром (look-through)
|
||||
- Стратегии записи
|
||||
- Сквозная запись (write-through) - пишем сразу и в кэш и в память
|
||||
- Сквозная запись (write-through) — пишем сразу и в кэш, и в память
|
||||
- Сквозная запись с отображением
|
||||
- Сквозная запись без отображения
|
||||
- Буферизированная сквозная запись - пишем сразу и в кэш и в память, но через буфер
|
||||
- Отложенная запись (write-back) - пишем только при вытеснении из кэша
|
||||
- В среднем на 10% эффективнее сквозной записи. Чаще используется
|
||||
- Буферизированная сквозная запись — пишем сразу и в кэш, и в память, но через буфер
|
||||
- Отложенная запись (write-back) — пишем только при вытеснении из кэша
|
||||
- В среднем на 10% эффективнее сквозной записи. Чаще используется.
|
||||
|
||||
**Многоуровневый кэш.**
|
||||
Для чего нужны уровни кэша *(рис. 15)*? Давайте проверим если ли прирост производительности с помощью AMAT.
|
||||
Для чего нужны уровни кэша *(рис. 15)*? Давайте проверим, есть ли прирост производительности с помощью AMAT.
|
||||
|
||||

|
||||
|
||||
@@ -302,7 +306,7 @@ MR<sub>L2</sub> = 20%
|
||||
Многоуровневый кэш может быть построен по одному из двух принципов:
|
||||
|
||||
- Инклюзивный кэш.
|
||||
*В более низких уровнях памяти, содержится копия тех что выше.*
|
||||
*В более низких уровнях памяти содержится копия тех, что выше.*
|
||||
- Эксклюзивный кэш.
|
||||
*На более низких уровнях памяти нет копии верхнего уровня.*
|
||||
|
||||
|
Reference in New Issue
Block a user