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

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

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

решение1

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

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

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

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

решение2

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

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

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

решение3

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

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

Связанный контент