Кеш процесора
Кеш мікропроцесора— кеш (надоперативна пам'ять), що використовується мікропроцесором комп'ютера зменшення середнього часу доступу до комп'ютерної пам'яті. Є одним із верхніх рівнів ієрархії пам'яті [1] . Кеш використовує невелику, дуже швидку пам'ять (зазвичай типу SRAM), яка зберігає копії даних, що часто використовуються з основної пам'яті. Якщо більшість запитів у пам'ять буде оброблятися кешем, середня затримка звернення до пам'яті буде наближатися до затримок роботи кешу.
Дані між кешем і пам'яттю передаються блоками фіксованого розміру, також звані лініями кеша (англ. cache line) або блоками кеша.
Збільшення розміру кеш-пам'яті може позитивно впливати на продуктивність багатьох додатків [2] , хоча в деяких випадках ефект незначний [3] . Робота кеш-пам'яті зазвичай прозора для програміста, проте для її ефективного використання в деяких випадках застосовуються спеціальні алгоритмічні прийоми, що змінюють порядок обходу даних в ОЗП або підвищують локальність (наприклад, при блоковому множенні матриць) [4] .
Зміст
Для додавання даних у кеш після кеш-промаху може знадобитися витіснення (evict) раніше записаних даних. Для вибору ряду кешу, що заміщується, використовується евристика, званаполітика заміщення(англ. replacement policy ). Основною проблемою алгоритму є передбачення, який рядок найімовірніше не знадобиться для наступних операцій. Якісні прогнози складні, і апаратні кеші використовують прості правила, такі як LRU. Позначка деяких областей пам'яті якнекешуються(англ. non cacheable ) покращує продуктивність за рахунок заборони кешування даних, що рідко використовуються. Промахи для такої пам'яті не створюють копію даних укеші.
Існують також змішані політики. Кеш може бути з наскрізним записом (англ. write-through ), але зменшення кількості транзакцій на шині записи можуть тимчасово поміщатися у чергу і об'єднуватися друг з одним.
Дані основної пам'яті можуть змінюватися як процесором, а й периферією, використовує прямий доступом до пам'яті, чи іншими процесорами в многопроцессорной системі. Зміна даних призводить до старіння їх копії в кеші (станstale). В іншій реалізації, коли один процесор змінює дані в кеші, копії цих даних у кешах інших процесорів будуть позначені як stale. Для підтримки вмісту кількох кешів у актуальному стані використовується спеціальний протокол кеш когерентності.
Структура запису у кеші
Типова структура запису в кеші
| Блок даних | тег | біт актуальності |
Блок даних (кеш-лінія) містить безпосередню копію даних із основної пам'яті. Біт актуальності означає, що цей запис містить актуальну (найсвіжішу) копію.
| тег | індекс | зміщення |
Асоціативність
У порядку погіршення (збільшення тривалості перевірки на влучення) та покращення (зменшення кількості промахів):
- кеш прямого відображення (англ. direct mapped cache) - найкращий час попадання і, відповідно, найкращий варіант для великих кешів;
- 2-канальний множинно-асоціативний кеш англ. 2-way set associative cache;
- 2-канальний skewed асоціативний кеш.
- 4-канальний множинно-асоціативний кеш (англ. 4-way set associative cache);
- повністю асоціативний кеш, анг. fully associative cache - найкращий (найнижчий) відсоток промахів (miss rate) і найкращий варіант при надзвичайно високих витратах при промаху (miss penalty).
Псевдоасоціативний кеш
Види промахів
Промах читання з кешу інструкцій.Зазвичай дає дуже велику затримку, оскільки процесор не може продовжувати виконання програми (принаймні, поточного потоку виконання) і змушений простоювати в очікуванні завантаження інструкції з пам'яті.
Промах читання з кешу даних.Зазвичай дає меншу затримку, оскільки інструкції, які не залежать від запитаних даних, можуть продовжувати виконуватися, поки запит обробляється в основній пам'яті. Після отримання даних із пам'яті можна продовжувати виконання залежних інструкцій.
Промах із запису в кеш даних.Зазвичай дає найменшу затримку, оскільки запис може бути поставлений у чергу і наступні інструкції практично не обмежені у своїх можливостях. Процесор може продовжувати свою роботу, крім випадків промаху із запису з повністю заповненою чергою.
Категорії промахів (Three Cs)
Важливо також помітити, що перші системи віртуальної пам'яті були дуже повільними, тому що вони вимагали перевірки таблиці сторінок (що зберігається в основній ОЗП) перед будь-яким програмним зверненням на згадку. Без використання кешування для відображення такі системи зменшують швидкість роботи з пам'яттю приблизно в 2 рази. Тому використання TLB дуже важливе і іноді його додавання до процесорів передувало появі звичайних кешів даних та інструкцій.
Швидкість цих дій (затримка завантаження з пам'яті) є критично важливою для продуктивності процесорів, і тому більшість сучасних L1-кешівє віртуально індексованими, що, як мінімум, дозволяє блоку MMU виробляти запит у TLB одночасно з запитом даних їх кеш-пам'яті.