Коли кеш-пам'ять процесора змивається назад до основної пам'яті?
Якщо ви тільки починаєте вивчати багатоядерні процесори, кешування, когерентність кешу і пам'ять, це може здатися трохи заплутаним. Маючи це на увазі, сьогоднішня публікація із запитань SuperUser має відповіді на запитання цікавого читача.
Сьогоднішня сесія запитань та відповідей приходить до нас люб'язно SuperUser - підрозділ Stack Exchange, групування веб-сайтів із запитаннями та відповідями на рівні спільноти..
Питання
Читач SuperUser CarmeloS хоче знати, коли кеш процесора скидається назад до основної пам'яті:
Якщо у мене є процесор з двома ядрами і кожен ядро має свій власний кеш L1, чи можливо, що Core1 і Core2 одночасно кешують ту ж саму частину пам'яті? Якщо це можливо, яким буде значення основної пам'яті, якщо обидва Core1 і Core2 відредагували свої значення в кеші?
Коли кеш процесора скидається назад до основної пам'яті?
Відповідь
Співробітники SuperUser Девід Шварц, sleske, і Kimberly W мають відповідь для нас. Спочатку, Девід Шварц:
Якщо у мене є процесор з двома ядрами, і кожен ядро має свій власний кеш L1, можливо, Core1 і Core2 одночасно кешують ту ж саму частину пам'яті одночасно.?
Так, продуктивність була б жахливою, якби це було не так. Розглянемо дві теми, що виконують один і той же код. Ви хочете, щоб код в обох L1 кеш.
Якщо це можливо, яким буде значення основної пам'яті, якщо обидва Core1 і Core2 відредагували свої значення в кеші?
Старе значення буде в основній пам'яті, що не буде мати значення, оскільки жодне ядро не буде його читати. Перш ніж вилучити змінене значення з кешу, воно повинно бути записано в пам'ять. Як правило, використовується деякий варіант протоколу MESI. У традиційній реалізації MESI, якщо значення змінено в одному кеші, воно не може бути присутнім у будь-якому іншому кеші на тому ж рівні.
Далі йде відповідь від sleske:
Так, наявність двох кеш-пам'яті в одній і тій же області пам'яті може статися, і це насправді проблема, яка виникає на практиці. Існують різні рішення, наприклад:
- Два кеша можуть спілкуватися, щоб переконатися, що вони не згодні
- Ви можете мати якийсь супервізор, який відстежує всі кеші та відповідно оновлює їх
- Кожен процесор контролює області пам'яті, які він кешує, і коли він виявляє запис, він викидає свій (тепер недійсний) кеш
Проблема називається когерентністю кешу, а стаття Вікіпедії на цю тему має гарний огляд проблеми та можливі рішення.
І остаточна відповідь від Kimberly W:
Щоб відповісти на запитання у назві вашої публікації, це залежить від протоколу кешування. Якщо воно є зворотним, кеш буде скинуто назад до основної пам'яті, коли контролер кешу не має іншого вибору, окрім як поставити новий блок кешу у вже зайнятий простір. Блок, який раніше займав простір, видаляється, і його значення записується назад до основної пам'яті.
Інший протокол є переписом. У цьому випадку в будь-який час блок кешування записується на рівні n, відповідний блок на рівні n + 1 оновлено. Це схоже за поняттям до заповнення форми карбоновим папером; все, що ви пишете на вершині, копіюється на аркуші нижче. Це повільніше, тому що воно передбачає більше операцій запису, але значення між кешами є більш послідовними. У схемі зворотного запису тільки кеш найвищого рівня мав би найновіше значення для конкретного блоку пам'яті.
Маєте щось додати до пояснення? Звучить в коментарях. Хочете прочитати більше відповідей від інших технологічних користувачів Stack Exchange? Перегляньте повний потік обговорення тут.
Зображення: Lemsipmatt (Flickr)