Домашняя » как » Когда кэш процессора сбрасывается в основную память?

    Когда кэш процессора сбрасывается в основную память?

    Если вы только начинаете изучать, как работают многоядерные процессоры, кэширование, когерентность кэша и память, на первый взгляд это может показаться немного запутанным. Учитывая это, в сегодняшнем посте 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)