Если у меня есть ЦП с двумя ядрами, каждое ядро имеет свой собственный кэш L1, возможно ли, чтобы Core1 и Core2 одновременно кэшировали одну и ту же часть памяти?
Если это возможно, каким будет значение основной памяти, если и Core1, и Core2 отредактировали свое значение в кеше?
3 ответа
Если у меня есть ЦП с двумя ядрами, каждое ядро имеет свой собственный кэш L1, возможно ли, чтобы Core1 и Core2 одновременно кэшировали одну и ту же часть памяти?
Да. Производительность была бы ужасной, если бы это было не так. Рассмотрим два потока, выполняющих один и тот же код. Вы хотите этот код в обоих кешах L1.
Если это возможно, каким будет значение основной памяти, если и Core1, и Core2 отредактировали их значение в кеше?
Старое значение будет в основной памяти, что не имеет значения, поскольку ни один процессор не будет его читать. Перед извлечением измененного значения из кэша оно должно быть записано в память. Обычно используется какой-то вариант протокола MESI . В традиционной реализации MESI, если значение изменяется в одном кеше, оно вообще не может присутствовать в любом другом кеше на том же уровне.
Да, это может произойти (при наличии двух кеш-кешей в одной и той же области памяти), на самом деле это проблема, которая часто возникает на практике. Существуют различные решения, например:
- два кэша могут общаться, чтобы убедиться, что они не согласны
- вы можете иметь своего рода супервизор, который контролирует все кэши и обновляет их соответственно
- каждый процессор контролирует области памяти, которые он кэшировал, и когда он обнаруживает запись, он выбрасывает свой (теперь недействительный) кэш
Проблема называется когерентностью кэша. Статья в Википедии на эту тему имеет хороший обзор проблемы и возможных решений.
Чтобы ответить на вопрос в вашем заголовке, это зависит от того, каков протокол кеширования. Если это обратная запись, кэш будет сброшен обратно в основную память, когда у контроллера кеша нет другого выбора, кроме как поместить новый блок кеша в уже занятое пространство. Блок, который ранее занимал пространство, удаляется, а его значение записывается обратно в основную память.
Другой протокол сквозной записи. В этом случае каждый раз, когда блок кэша записывается на уровне n, соответствующий блок на уровне (n+1) обновляется. (По сути, это похоже на заполнение нашей формы копировальной бумагой внизу; все, что вы пишете сверху, копируется на лист ниже). Это медленнее, потому что, очевидно, включает в себя больше операций записи, но значения между кэшами более согласованы. В схеме с обратной записью только кэш самого высокого уровня будет иметь самое современное значение для конкретного блока памяти.