Коли кеш процесора повертається в основну пам'ять?


18

Якщо у мене є процесор з двома ядрами, у кожного ядра є власний кеш L1, чи можливо Core1 і Core2 кешувати одну і ту ж частину пам'яті одночасно?
Якщо можливо, яке значення основної пам'яті буде, якщо і Core1, і Core2 відредагували своє значення в кеші?

Відповіді:


26

Якщо у мене є процесор з двома ядрами, у кожного ядра є власний кеш L1, чи можливо Core1 та Core2 кешувати одну і ту ж частину пам'яті одночасно?

Так. Виступ був би жахливим, якби цього не було. Розглянемо два потоки з одним і тим же кодом. Цей код потрібно в обох кешах L1.

Якщо можливо, яке значення основної пам'яті буде, якщо і Core1, і Core2 відредагували своє значення в кеші?

Старе значення буде в основній пам'яті, що не має значення, оскільки жоден процесор не прочитає його. Перед тим, як вийняти змінене значення з кешу, його потрібно записати в пам'ять. Зазвичай використовується якийсь варіант протоколу MESI . У традиційній реалізації MESI, якщо значення модифіковане в одному кеші, воно взагалі не може бути присутнім у будь-якому іншому кеші на тому самому рівні.


15

Так, це може мати місце (якщо два кеші зберігаються в одній області пам’яті), насправді це проблема, яка на практиці виникає багато. Існують різні рішення, наприклад:

  • два кеші можуть спілкуватися, щоб переконатися, що вони не погоджуються
  • у вас може бути якийсь супервізор, який слідкує за всіма кешами та оновлює їх відповідно
  • кожен процесор стежить за областями пам’яті, які він кешував, і коли він виявляє запис, він викидає свій кеш

Проблема називається кеш-когерентністю . Стаття у Вікіпедії з цієї теми має хороший огляд проблеми та можливі шляхи їх вирішення.


2

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

Інший протокол - це протокол. У цьому випадку, щоразу, коли кеш-блок записується на рівні n, відповідний блок на рівні (n + 1) оновлюється. (Це за концепцією схоже на заповнення форми під вуглецевим папером під нею; все, що ви пишете вгорі, копіюється на аркуші нижче.) Це повільніше, оскільки, очевидно, передбачає більше операцій написання, але значення між кешами є більш послідовними. У схемі зворотного запису лише кеш найвищого рівня мав би найсвіжіше значення для певного блоку пам'яті.


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