каналів прямого відображення, де контролер кеша приймає рішення про те, в який з рядків набору помістити черговий блок даних.
У простішому випадку кожний блок з основної пам'яті поміщається в один з двох рядків (Two Way Set Associative Cache). Такий кеш містить два банки пам'яті й тегів. Структуру двоканального набірно-асоціативного кеша показано на рис. 2.2.
Рис. 2.2. Структура двоканального набірно-асоціативного кеша
Номер набору, тобто індекс, в якому відображено необхідний блок даних, однозначно визначається середньою частиною адреси, як номер рядка в кеші прямого відображення. Рядок набору, який відображає необхідний блок, визначається порівнянням тегів, паралельно виконуваним для всіх каналів кеша. З кожним набором пов'язана також ознака, що визначає рядок набору, який підлягає заміщенню новим блоком даних у випадку кеш-промаху. На заміщення обирається той рядок, до якого довше всього не зверталися. Воно виконується згідно з алгоритмом LRU (Least Recently Used). За відносно великої кількості каналів (рядків в наборі) вдаються до спрощення, а саме використовують алгоритм Pseudo LRU для чотирьох рядків (Four Way Set Associative Cache), який дає змогу приймати рішення, використовуючи лише три біти. Можливе також застосування алгоритму заміщення FIFO чи випадкового (random) заміщення. Це простіше, але менш ефективно. Набірно-асоціативна архітектура широко застосовується для первинного кеша сучасних комп'ютерів. Ємність кешованої пам'яті визначається так само, як і у випадку прямого відображення, але для набірно-асоціативної архітектури фігуруватиме ємність одного банку, а не всього кеша, а також розрядність комірок тега, що належать до цього банку.
2.3. Асоціативний кеш
У повністю асоціативному кеші, на відміну від попередніх архітектур, будь-який його рядок може відображати будь-який блок пам'яті. Це суттєво підвищує ефективність використання його обмеженої ємності. Всі біти адреси кешованого блока, за винятком бітів, які визначають розташування даних у рядку, тобто зміщення, зберігаються в пам'яті тегів. При цьому для визначення наявності даних кеш-пам'яті, що вимагаються, необхідне порівняння тегів усіх рядків зі старшою частиною адреси, а не одного чи кількох, як при прямому відображенні чи набірно-асоціативній архітектурі. Таким чином, відпадає необхідність послідовного перебирання комірок пам'яті тегів. Виконується тільки паралельний аналіз усіх комірок. Але це завдання поки що вирішене тільки для невеликих ємностей первинного кеша в деяких процесорах.
Розділ 3. Структура засобів кешування пам'яті
Загальну структуру засобів кешування пам'яті для 32-розрядних процесорів фірми Intel, у тому числі для процесорів Р6, наведено на рис. 3.1.
Рис. 3.. Загальна структура засобів кешування пам'яті
Первинний кеш інструкцій тісно пов'язаний з блоком попередньої вибірки, а первинний кеш даних – з виконавчим блоком процесора. Вторинний кеш є спільним, і в процесорах Р6 підключений до окремої внутрішньої шини кеш-пам'яті. В процесорах i486 і Pentium вторинний кеш є зовнішнім і підключається до зовнішньої системної шини процесора. В процесорах Celeron 266 і 300 вторинний кеш відсутній.
Довжина рядка кеша в i486 – 16 байт, у процесорах Р5 другого покоління і Р6 – 32 байт. Рядки заповнюються цілком пакетними циклами зчитування – 4 передачі на рядок з основної пам'яті, вирівняними за 32-байтними межами. Будь-який внутрішній запит процесора на звернення до пам'яті спрямовується у внутрішній кеш. Якщо запитувана ділянка пам'яті наявна в рядку внутрішнього кеша, то він обслуговує цей запит. У випадку промаху запит задовольняється, як тільки необхідні дані зчитуються з ОЗП. Заповнення рядка до кінця відбувається паралельно з обробкою одержаних даних. Виділення і заміщення рядків у процесорах i486 і Р5 виконуються тільки для кеш-промахів при зчитуванні. При промахах запису заповнення рядків здійснюється тільки в процесорах Р6. Кешування доступне в будь-якому режимі процесора.
Буфер асоціативної трансляції TLB зберігає входження в каталог і в таблиці сторінок, до яких звертались останнім часом. В i486 для даних та інструкцій використовується єдиний TLB, а в процесорах Р5 і Р6 ці буфери роздільні.
Великі сторінки, зокрема 2Мбайт в режимі РАЕ (Physical Address Extension – режим розширення фізичної адреси до 36 біт) і 4 Мбайт в режимі PSE (Page Size Extension – прапорець розширення розміру сторінки) обслуговуються роздільними TLB.
Буфери запису пов'язані з виконавчим блоком процесора. Вони дають змогу на деякий час відкласти фактичний запис у зовнішній кеш і основну пам'ять, пропонуючи шину для інших обмінів, необхідних для виконання наступних інструкцій. Запис буферизується в усіх режимах роботи процесора. Але буферизації запису в порти вводу/виводу не відбувається.
Всі механізми кешування, як правило, прозорі для прикладних програм і після дозволу кешування пропускають через себе потоки інструкцій і даних без вимог явного програмного керування. Але знання особливостей механізмів кешування пам'яті дає можливість оптимізувати коди.
Процесори різних поколінь фірми Intel мають різні характеристики елементів кеша (табл. 3.1).
Кеш-пам'ять побудована з урахуванням можливості звернень до неї зовнішніх об'єктів, зокрема інших процесорів та контролерів. Процесори мають механізми зовнішнього стеження за станом свого кеша. Для підтримки узгодження даних кеша та основної пам'яті процесор відпрацьовує цикли стеження (Snoop Cycle чи Inquire Cycle), що ініціюються зовнішньою для нього системою. В цих циклах, які відбуваються при зверненні до пам'яті з боку зовнішнього абонента, процесор визначає наявність даних, що вимагаються, в своєму кеші. Якщо вони відображаються в кеші, то дії процесора залежать від стану відповідного рядка кеша і типу зовнішнього звернення. Звернення за записом призведе до анулювання даного рядка. Звернення за зчитуванням до ділянки, що відповідає модифікованому («брудному») рядку, призведе до вивантаження його вмісту в основну пам'ять перед тим, як зовнішній абонент виконає реальне зчитування.