ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 6790
Скачиваний: 22
372
ється на основі асоціативного пошуку. Тут так само, як це було зроблено для прямого відображення, k-розрядне поле адреси блоку в основній пам'яті розбивається на дві частини: поле тега г та поле номера блоку s (рис. 10.12b), причому тег вказує номер секції основної пам'яті, а в полі номера блоку вказується номер блоку в секції основної пам'яті та відповідно в кеш пам'яті.
Для наведеного вище прикладу, коли кількість блоків в основній пам'яті рівна 225, а в кеш пам'яті - 29, причому кількість блоків в секторі кеш пам'яті рівна 2, маємо: повна розрядність адреси п = ЗО, причому поле адреси блоків основної пам'яті займає k = 25 розрядів, поле номера тега (тобто номера секції в основній пам'яті) г .= 17 розрядів, поле номера блоку в секції (в кеш пам'яті) п = 8 розрядів, поле адреси слова в блоці m = 5 розрядів (рис. 10.12b).
Контролер кеш пам'яті за допомогою восьми середніх розрядів слова адреси звертається до визначеного цими розрядами блоку власної пам'яті. Зрозуміло, що шуканий в такий спосіб блок завжди присутній в кеш пам'яті. Адже кеш пам'ять вміщує 512 блоків. Але вміст віднайденого блоку кеш пам'яті може бути копією не одного, а одного з декількох дозволених на копіювання блоків основної пам'яті. Наприклад, до нульового блоку кеш пам'яті дозволено копіювати вміст наступних блоків основної пам'яті: 0, 64, 128, 192, 256 і т. д. Усього до кожного блоку кеш пам'яті можна скопіювати вміст одного з 217 = 131072 блоків основної пам'яті, оскільки ємність основної пам'яті в 131072 разів перевищує ємність кеш пам'яті. Для того, щоб визначити, чи є поточне наповнення вказаного блоку кеш пам'яті відповідним до запиту процесора, використовують вміст старших 17 бітів адреси основної пам'яті.
Потрібно відзначити, що якраз частково-асоціативне відображення найчастіше використовується в сучасних комп'ютерах, причому кількість блоків в одній секції кеш пам'яті зазвичай не перевищує чотирьох. Основною перевагою тут є те, що кеш пам'ять поєднує переваги пам'яті з довільним та з асоціативним доступом (рис. 10.13).
373
При даному способі відображення кожен рядок кеш пам'яті вміщує наступну інформацію: тег, який вказує вміст блоку якої секції основної пам'яті переписано до даного блоку кеш пам'яті, розряд достовірності (valid bit V), який вказує, чи вміст даного блоку кеш пам'яті дійсно належить блоку основної пам'яті, вказаному s розрядами поля адреси, розряд модифікації (dirty bit D), який інформує про внесення змін до вмісту блоку кеш пам'яті, а також вміст блоку основної пам'яті, вказаного s розрядами поля адреси. Коли процесору потрібний операнд із блоку з певною адресою, контролер кеш пам'яті вибирає з секторів пам'яті тегів відповідні номеру блоку в кеш пам'яті теги, та порівнює 'їх з відповідними г розрядами адреси, в яких вказано тег. При наявності в кеш пам'яті відповідного тега, та при одиничному значенні розряду достовірності, кеш пам'ять видає сигнал підтвердження попадання та надає доступ до відповідного блоку.
10.2.5. Порядок заміщення блоків в кеш пам'яті з асоціативним відображенням
Для запису з основної пам'яті до кеш пам'яті вмісту нового блоку в ній потрібно знайти блок, вміст якого має бути заміщений. При використанні прямого відображення такий блок є наперед визначеним. При використанні повністю асоціативного та частково-асоціативного відображення, коли в деякий блок в кеш пам'яті може бути записаний вміст довільного блоку, або деякої множини блоків основної пам'яті, потрібно використати відповідний алгоритм заміщення.
Основна мета стратегії заміщення - утримувати в кеш пам'яті вміст блоків основної пам'яті, до яких найбільш імовірні звернення в найближчому майбутньому, і заміщувати вміст блоків, доступ до яких відбудеться пізніше, або взагалі не відбудеться. Очевидно, що оптимальним буде алгоритм, який заміщує вміст того блоку, звернення до якого в майбутньому відбудеться пізніше, ніж до будь-якого іншого блоку кеш пам'яті. На жаль, такий прогноз здійснити практично неможливо, тому використовують ряд стратегій, кожна з яких вигідніша в відповідному конкретному випадку. При цьому, для досягнення високої швидкості заміщення, алгоритми заміщення реалізуються апаратними засобами.
374
Серед безлічі можливих алгоритмів заміщення найпоширенішими є чотири, що розглядаються далі у порядку зменшення їх відносної ефективності.
Найбільш ефективним є алгоритм заміщення LRU (Least Recently Used), який передбачає заміщення блоків з найдавнішим використанням, оскільки він базується на властивості часової локальності. За цим алгоритмом заміщується вміст того блоку кеш пам'яті, до якого найдовше не було звернення. Найвідоміші два способи апаратурної реалізації цього алгоритму. У першому з них за кожним блоком кеш пам'яті закріплюють лічильник. До вмісту всіх лічильників через певні інтервали часу додається одиниця. При зверненні до блоку його лічильник встановлюється в нульовий стан. Таким чином, найбільше число буде в лічильнику того блоку, до якого найдовше не було звернень, і вміст цього блоку є першим кандидатом на заміщення. Другий спосіб реалізується за допомогою черги, куди у порядку заповнення блоків кеш пам'яті заносяться посилання на ці блоки. При кожному зверненні до блоку посилання на нього переміщується в кінець черги. В результаті першим в черзі кожного разу опиняється посилання на блок, до якого найдовше не було звернень. Вміст саме цього блоку перш за все і заміщується.
Інший можливий алгоритм заміщення - алгоритм, що працює за принципом "перший увійшов, перший вийшов" (FIFO - First In First Out). Тут заміщується вміст блоку, що найдовше знаходився в кеш пам'яті. Алгоритм легко реалізується за допомогою розглянутої раніше черги, з тією лише різницею, що після звернення до блоку положення відповідного посилання в черзі не змінюється.
Ще один алгоритм - заміна вмісту блоку, що найменше використовувався (LFU - Least Frequently Used). Заміщується вміст того блоку в кеш пам'яті, до якого було менше всього звернень. Принцип можна реалізувати, пов'язавши кожен блок з лічильником звернень, до вмісту якого після кожного звернення додавати одиницю. Головним претендентом на заміщення є вміст блоку, лічильник якого містить найменше число.
Простий алгоритм заміщення - довільний вибір блоку для заміни його вмісту. Блок, вміст якого замінюється, вибирається випадковим чином. Це може бути реалізовано, наприклад, за допомогою лічильника, вміст якого збільшується на одиницю з кожним тактовим імпульсом, незалежно від того, що мало місце - попадання чи промах. Значення в лічильнику визначає блок, вміст якого буде замінено в повністю асоціативній кеш пам'яті, або воно визначає блок в межах сектора, вміст якого буде замінено в частково-асоціативній кеш пам'яті. Даний алгоритм використовується вкрай рідко.
Частіше попереднього використовують алгоритм випадкового заміщення вмісту блоків кеш пам'яті за значенням лічильника випадкових чисел, оскільки за ефективністю він є близьким до алгоритму LRU та простішим за нього в реалізації.
70.2.6. Підвищення ефективності кеш пам'яті
Характеристики, які використовують при оцінці ефективності ієрархічної організації пам'яті, підходять і для оцінки ефективності кеш пам'яті. До цих характеристик належать наступні:
-
коефіцієнт попадань - відношення числа попадань до загального числа звернень процесора до основної пам'яті, де під попаданням розуміється виявлення в кеш пам'яті потрібної інформації, при зверненні до основної пам'яті;
-
коефіцієнт промахів - відношення числа промахів до загального числа звернень процесора до основної пам'яті, де під промахом розуміється відсутність в кеш пам'яті
375
потрібної інформації, при зверненні до основної пам'яті. Якщо позначити коефіцієнт попадань через kh, а коефіцієнт промахів через km, то залежність між ними можна виразити наступною формулою: km= 1 - kh;
-
час звернення при попаданні - час, необхідний для пошуку потрібної інформації в кеш пам'яті (включаючи з'ясування, чи є звернення попаданням), плюс час на фактичне зчитування даних;
-
втрати на промах - час, потрібний для заміни блоку в кеш пам'яті на блок з потрібними даними, розташований в основній пам'яті;
■ середній час доступу до
основної пам'яті, який визначається з
виразу:
tav
= th +
kmtp,
де th- час звернення при попаданні,
tp-
втрати на промах.
Таким чином, чим менше промахів, тим вища ефективність використання кеш пам'яті. Розглянемо типи промахів до кеш пам'яті та підходи до зменшення їх кількості й пов'язаних з ними втрат. Існує три типи промахів: обов'язкові, ємнісні та конфліктні. Обов'язкові промахи - це промахи, які виникають при початковому зверненні до основної пам'яті. Зрозуміло, що перший доступ до кеш пам'яті обов'язково буде промахом. Для зменшення кількості цього типу промахів потрібно збільшувати розмір блоків в кеш пам'яті.
Ємнісні промахи пов'язані з обмеженим розміром кеш пам'яті. Для зменшення кількості цього типу промахів потрібно збільшувати розмір кеш пам'яті.
Конфліктні промахи пов'язані з ефективністю алгоритму заміщення блоків в кеш пам'яті. Для зменшення кількості цього типу промахів потрібно збільшувати асоціативність кеш пам'яті, аж до використання для її реалізації повністю асоціативної пам'яті.
На рис. 10.14 наведено залежність величини коефіцієнта промахів від ємності кеш пам'яті та від кількості блоків в одному секторі кеш пам'яті з використанням частково-асоціативного відображення при виконанні набору тестових програм SPEC 92.
Таким чином, збільшення розміру блоку кеш пам'яті понижує кількість обов'язкових промахів, але збільшує втрати на промах, через зростання часу пересилання блоку інформації. Крім того, якщо ємність кеш пам'яті невелика, то збільшення розміру блоку збільшує кількість конфліктних промахів через зменшення кількості блоків та секторів.