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

18

Если у меня есть ЦП с двумя ядрами, каждое ядро ​​имеет свой собственный кэш L1, возможно ли, чтобы Core1 и Core2 одновременно кэшировали одну и ту же часть памяти?
Если это возможно, каким будет значение основной памяти, если и Core1, и Core2 отредактировали свое значение в кеше?

CarmeloS
источник

Ответы:

26

Если у меня есть ЦП с двумя ядрами, каждое ядро ​​имеет свой собственный кэш L1, возможно ли, чтобы Core1 и Core2 одновременно кэшировали одну и ту же часть памяти?

Да. Производительность была бы ужасной, если бы это было не так. Рассмотрим два потока, выполняющих один и тот же код. Вы хотите этот код в обоих кешах L1.

Если это возможно, каким будет значение основной памяти, если и Core1, и Core2 отредактировали их значение в кеше?

Старое значение будет в основной памяти, что не имеет значения, поскольку ни один процессор не будет его читать. Перед извлечением измененного значения из кэша оно должно быть записано в память. Обычно используется какой-то вариант протокола MESI . В традиционной реализации MESI, если значение изменяется в одном кеше, оно вообще не может присутствовать в любом другом кеше на том же уровне.

Дэвид Шварц
источник
15

Да, это может произойти (имея два кеша в одной и той же области памяти), на самом деле это проблема, которая часто возникает на практике. Существуют различные решения, например:

  • два кэша могут общаться, чтобы убедиться, что они не согласны
  • вы можете иметь своего рода супервизор, который контролирует все кэши и обновляет их соответственно
  • каждый процессор контролирует области памяти, которые он кэшировал, и когда он обнаруживает запись, он выбрасывает свой (теперь недействительный) кэш

Проблема называется когерентностью кэша . Статья Википедии на тему есть хороший обзор проблемы и возможные решения.

sleske
источник
2

Чтобы ответить на вопрос в вашем заголовке, это зависит от того, каков протокол кеширования. Если это обратная запись, кэш будет сброшен обратно в основную память, когда у контроллера кеша нет другого выбора, кроме как поместить новый блок кеша в уже занятое пространство. Блок, который ранее занимал пространство, удаляется, а его значение записывается обратно в основную память.

Другой протокол сквозной записи. В этом случае каждый раз, когда блок кэша записывается на уровне n, соответствующий блок на уровне (n + 1) обновляется. (По сути, это похоже на заполнение нашей формы копировальной бумагой снизу; все, что вы пишете сверху, копируется на лист ниже). Это медленнее, потому что очевидно, что оно включает в себя больше операций записи, но значения между кэшами более согласованные. В схеме с обратной записью только кеш самого высокого уровня будет иметь самое современное значение для конкретного блока памяти.

Кимберли W
источник
1
Интересно, какой процент читателей здесь когда-либо использовал копировальную бумагу? :)
Бармар