Когда кэш процессора сбрасывается в основную память?
Если вы только начинаете изучать, как работают многоядерные процессоры, кэширование, когерентность кэша и память, на первый взгляд это может показаться немного запутанным. Учитывая это, в сегодняшнем посте 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, если значение изменяется в одном кеше, оно вообще не может присутствовать в любом другом кеше на том же уровне.
Далее следует ответ из слеске:
Да, наличие двух кеш-кешей в одной и той же области памяти может произойти, и на самом деле это проблема, которая часто возникает на практике. Существуют различные решения, например:
- Два кэша могут общаться, чтобы убедиться, что они не согласны
- Вы можете иметь своего рода супервизор, который контролирует все кэши и обновляет их соответственно
- Каждый процессор контролирует области памяти, которые он кэшировал, и когда он обнаруживает запись, он выбрасывает свой (теперь недействительный) кэш
Проблема называется когерентностью кеша, и статья в Википедии на эту тему имеет хороший обзор проблемы и возможные решения..
И наш окончательный ответ от Кимберли W:
Ответ на вопрос в заголовке вашего поста зависит от протокола кеширования. Если это обратная запись, кэш будет сброшен обратно в основную память, когда у контроллера кеша нет другого выбора, кроме как поместить новый блок кеша в уже занятое пространство. Блок, который ранее занимал пространство, удаляется, а его значение записывается обратно в основную память.
Другой протокол сквозной записи. В этом случае каждый раз, когда блок кэша записывается на уровне N, соответствующий блок на уровне п + 1 обновляется. В принципе это похоже на заполнение формы копировальной бумагой внизу; все, что вы пишете сверху, копируется на лист ниже. Это медленнее, потому что, очевидно, включает в себя больше операций записи, но значения между кэшами более согласованы. В схеме с обратной записью только кеш самого высокого уровня будет иметь самое современное значение для конкретного блока памяти.
Есть что добавить к объяснению? Отключить звук в комментариях. Хотите узнать больше ответов от других технически подкованных пользователей Stack Exchange? Ознакомьтесь с полным обсуждением здесь.
Изображение предоставлено: Lemsipmatt (Flickr)