Если вы только начинаете понимать, как работают многоядерные процессоры, кеширование, согласованность кеш-памяти и память, поначалу это может показаться немного запутанным. Имея это в виду, в сегодняшнем посте SuperUser Q&A есть ответы на любопытный вопрос читателя.
Сегодняшняя сессия вопросов и ответов проходит благодаря SuperUser - подразделению Stack Exchange, группы веб-сайтов вопросов и ответов, управляемой сообществом.
Вопрос
Читатель SuperUser CarmeloS хочет знать, когда кэш процессора сбрасывается обратно в основную память:
Если у меня есть ЦП с двумя ядрами, и каждое ядро имеет свой собственный кеш L1, возможно ли, что Core1 и Core2 кэшируют одну и ту же часть памяти одновременно? Если возможно, каким будет значение основной памяти, если и Core1, и Core2 отредактировали свои значения в кеше?
Когда кеш процессора сбрасывается обратно в основную память?
Ответ
У авторов SuperUser Дэвида Шварца, sleske и Kimberly W. есть ответ для нас. Сначала Дэвид Шварц:
Если у меня есть ЦП с двумя ядрами, и каждое ядро имеет свой собственный кеш L1, возможно ли, что Core1 и Core2 кэшируют одну и ту же часть памяти одновременно?
Да, производительность была бы ужасной, если бы этого не было. Рассмотрим два потока, выполняющих один и тот же код. Вам нужен этот код в обоих кешах L1.
Если возможно, каким будет значение основной памяти, если и Core1, и Core2 отредактировали свои значения в кеше?
Старое значение будет в основной памяти, что не имеет значения, поскольку ни одно ядро не прочитает его. Перед извлечением измененного значения из кеша оно должно быть записано в память. Обычно какой-то вариант Протокол MESI используется. В традиционной реализации MESI, если значение изменяется в одном кэше, оно вообще не может присутствовать в любом другом кэше того же уровня.
Далее следует ответ от sleske:
Да, наличие двух кешей в одной и той же области памяти может произойти, и на самом деле это проблема, которая часто возникает на практике. Существуют разные решения, например:
- Два кеша могут взаимодействовать, чтобы убедиться, что они не расходятся во мнениях.
- У вас может быть своего рода супервизор, который контролирует все кеши и обновляет их соответственно
- Каждый процессор контролирует кэшированные области памяти, и при обнаружении записи выбрасывает свой (теперь недействительный) кеш
Проблема называется когерентностью кеша, и Статья в Википедии по теме есть хороший обзор проблемы и возможных решений.
И наш окончательный ответ от Кимберли В:
Чтобы ответить на вопрос в заголовке вашего сообщения, это зависит от протокола кеширования. Если это обратная запись, кэш будет сброшен обратно в основную память только тогда, когда у контроллера кеша нет другого выбора, кроме как поместить новый блок кеша в уже занятое пространство. Блок, который ранее занимал пространство, удаляется, а его значение записывается обратно в основную память.
Другой протокол - сквозная запись. В этом случае каждый раз, когда блок кеша записывается на уровне п , соответствующий блок на уровне п + 1 обновлено. Это похоже на заполнение формы с копировальной бумагой внизу; все, что вы пишете сверху, копируется на листе ниже. Это медленнее, поскольку очевидно, что требуется больше операций записи, но значения между кешами более согласованы. В схеме обратной записи только кэш самого высокого уровня будет иметь самое последнее значение для конкретного блока памяти.
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полной веткой обсуждения здесь .
Кредит изображения: Лемсипматт (Flickr)