Домашня » як » Коли кеш-пам'ять процесора змивається назад до основної пам'яті?

    Коли кеш-пам'ять процесора змивається назад до основної пам'яті?

    Якщо ви тільки починаєте вивчати багатоядерні процесори, кешування, когерентність кешу і пам'ять, це може здатися трохи заплутаним. Маючи це на увазі, сьогоднішня публікація із запитань 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)