Чому існують окремі кеші L1 для даних та інструкцій?


Відповіді:


28

Насправді є кілька причин.

По-перше, і, мабуть, головне, що дані, що зберігаються в кеші інструкцій, як правило, дещо відрізняються, ніж ті, що зберігаються в кеш-даних - поряд із самими інструкціями є анотації до таких речей, як де починається наступна інструкція, щоб допомогти декодерам. Деякі процесори (напр., Netburst, деякі SPARC) використовують "кеш слідів", який зберігає результат декодування інструкції, а не зберігає оригінальну інструкцію в її закодованому вигляді.

По-друге, це трохи спрощує схему - кеш даних повинен мати справу з читанням і записом, але кеш інструкцій стосується лише зчитування. (Це частина того, чому самовиправляючий код такий дорогий - замість того, щоб безпосередньо перезаписати дані в кеш інструкцій, запис переходить через кеш даних у кеш L2, а потім рядок у кеш-інструкціях недійсний і повторно -завантажений з L2).

По-третє, це збільшує пропускну здатність: більшість сучасних процесорів можуть одночасно читати дані з кеша інструкцій та кешу даних. Більшість також мають черги біля "входу" в кеш, тому вони можуть зробити два читання та одне записування в будь-якому заданому циклі.

По-четверте, це може заощадити енергію. Хоча вам потрібно підтримувати живлення самих комірок пам'яті, щоб підтримувати їх вміст, деякі процесори можуть / вимикати частину пов'язаної схеми (декодери тощо), коли вони не використовуються. За допомогою окремих кеш-пам'ять вони можуть живити ці схеми окремо для отримання інструкцій та даних, збільшуючи шанси на те, що ланцюг залишиться без живлення протягом будь-якого даного циклу (я не впевнений, що будь-які процесори x86 роблять це - AFAIK, це більше ARM річ).


3
Важливо також зазначити, що код і дані можуть демонструвати різні схеми доступу; наприклад, вказівки щодо підсумовування всіх елементів масиву демонструють тимчасову локальність (одні й ті ж інструкції використовуються часто (якщо ви робите це циклом)), а дані в масиві демонструють просторову локальність (наступні дані використовуються далі).
габлін

1
@gablin: хоча це правда, ці відмінності в моделях часто сприяють б уніфікованому кешу. У тісному циклі, як ви згадуєте, більшість кеш-інструкцій сидить у режимі очікування. Уніфікований кеш в основному подвоює розмір кешу даних протягом тривалості циклу.
Джері Коффін

Не дуже, тому що після цього маленького циклу є більше коду, і це також може працювати з масивом. Це характеризує надзвичайно багато коду (наприклад, обробка рядків). Насправді перші кеші в процесорних процесорах були уніфікованими кешами - вони сиділи між основним інтерфейсом пам'яті процесора та зовнішньою шиною, що було простим місцем для їх розміщення, - але ми зараз використовуємо розділений кеш, оскільки це швидше на практиці .
Стипендіати Доналу

@Donal стипендіатів: Так, справді. Я добре знаю, як було зроблено раннє кешування, і чому вони змінилися на кеш-розділення.
Джері Коффін

5

Так само, як і нерухомість, використання кешу керується трьома речами: місцеположенням, розташуванням, розташуванням. Вся суть кешу в тому, що більшість програм демонструють шаблони розташування: якщо вони отримують доступ до байту 1111111, то наступний байт, до якого вони отримають доступ, - це, ймовірно, 1111110 або 1111112, і не так багато байт 9999999. Однак більшість програм демонструватимуть дуже різні схеми розташування їх інструкцій та їх даних. Це означає, що інструкції та дані навряд чи зможуть ефективно ділитися кешем. Тому що в пам'яті вказівки та дані не обов'язково знаходяться поблизу. Доступ до даних збільшить інструкції з кеша, а інструкції щодо завантаження збільшать дані з кеша.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.