Может ли интенсивное использование кэша L3 одним ядром сделать недействительным кэш L1/L2 другого ядра?

Текущая архитектура кэш-памяти процессора Intel состоит из локальных кешей L1 и L2 и совместно используемой кэш-памяти L3. У меня есть два похожих вопроса по этому поводу:

  1. Может ли расширенный доступ к памяти потока, работающего на одном ядре, сделать недействительным кэш-память L1/L2 другого ядра?
  2. Могут ли данные, требуемые потоком, работающим на одном ядре, занимать весь кэш L3?

ОБНОВЛЕНИЕ: имейте в виду, что Intel Skylake имеет новую архитектуру кэширования L3, которая не является включающей.

1 ответ

Решение

Ответ на оба вопроса - да.

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

Другими словами, если все N ядер активны и сбалансированы, а данные распределены равномерно (т.е. нет проблем с выравниванием), вы получите точно такую ​​же долю (1/N) LLC на ядро. Однако, если одно ядро ​​более требовательно к кешу, оно может расти за счет других, которые в настоящее время меньше привязаны к кешу. В крайнем случае, конечно, вы можете использовать весь L3 одним процессом, не обращая внимания на случаи, когда архитектура решает сохранить некоторое подмножество L3, предназначенное для какой-либо задачи (довольно часто) или некоторого ядра (гораздо реже).

Что касается первого вопроса - если L3 является инклюзивным (как это имеет место в большинстве обычных процессоров, в основном для эффективной фильтрации по шпионскому алгоритму), и один из потоков становится доминирующим и захватывает его целиком, тогда данные, размещенные там другими ядрами (менее активные) должны быть извлечены в память, а для обеспечения инклюзивности - эти линии также должны быть вытеснены из соответствующих ядер L1 и L2. Если вы будете хранить данные там (нарушая инклюзивность), вы потеряете целостность.

В системах, где L3 не является включающим, такого поведения не будет, и менее активное ядро ​​сможет сохранять свои данные внутри в L1/L2. Тем не менее, такие системы могут использовать включающий Snoop-фильтр, который может страдать от той же проблемы (и снова вызывать принудительное удаление) - в зависимости от точного протокола кэширования.

Другие вопросы по тегам