Якщо ви тільки починаєте дізнаватися, як працюють багатоядерні процесори, кешування, когерентність кеш-пам’яті та пам’ять, спочатку це може здатися трохи заплутаним. З огляду на це, сьогоднішня публікація запитань 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 + 1 оновлюється. За концепцією це схоже на заповнення бланка вугільним папером знизу; все, що ви напишете зверху, копіюється на аркуші нижче. Це відбувається повільніше, оскільки очевидно передбачає більше операцій запису, але значення між кешами є більш послідовними. У схемі зворотного запису лише кеш найвищого рівня мав би найостанніше значення для певного блоку пам'яті.
Є що додати до пояснення? Звук у коментарях. Хочете прочитати більше відповідей від інших досвідчених користувачів Stack Exchange? Ознайомтесь із повним обговоренням тут .
Кредит зображення: Лемсіпматт (Flickr)