Процессор x86_64 использует одни и те же линии chache для связи между двумя процессами через разделяемую память?

Как известно, все уровни кэша L1/L2/L3 на современных x86_64 фактически индексируются, физически помечены. И все ядра обмениваются данными с помощью кэша последнего уровня - cache-L3, используя когерентный протокол кэширования MOESI/MESIF через QPI/HyperTransport.

Например, семейный CPU Sandybridge имеет 4 - 16-way cache L3 и page_size 4KB, что позволяет обменивать данные между параллельными процессами, которые выполняются на разных ядрах через общую память. Это возможно, потому что кеш L3 не может содержать одну и ту же область физической памяти, как страница процесса 1, и как страница процесса 2 в то же время.

Означает ли это, что каждый раз, когда процесс-1 запрашивает одну и ту же область разделяемой памяти, процесс-2 сбрасывает свои кеш-строки страницы в ОЗУ, а затем процесс-1 загружает ту же область памяти, строки страницы в виртуальном пространстве процесса-1? Это очень медленно или процессор использует некоторые оптимизации?

Поддерживает ли современный процессор x86_64 одни и те же линии кэша без каких-либо флешей для связи между двумя процессами с разными виртуальными пространствами через разделяемую память?

Sandy Bridge Intel CPU - кеш L3:

  • 8 МБ - размер кеша
  • 64 B - размер строки кеша
  • 128 K - строки (128 K = 8 MB/64 B)
  • 16-позиционная
  • 8 K - количество наборов путей (8 K = 128 K строк /16-way)
  • 13 бит [18: 6] - виртуального адреса (индекса) определяет текущее установленное число (это тег)
  • 512 К - каждый одинаковый (виртуальный адрес /512 К) конкурирует за один и тот же набор (8 МБ /16-way)
  • низкий 19 бит - значительный для определения текущего установленного числа

  • 4 КБ - стандартный размер страницы

  • только низкие 12 бит - то же самое в виртуальных и физических адресах для каждого адреса

У нас есть 7 недостающих бит [18:12] - то есть нам нужно проверить (7 ^ 2 * 16-way) = 1024 строк кеша. Это то же самое, что и 1024-way cache - так что это очень медленно. Означает ли это, что кеш L3 (физически проиндексирован, физически помечен)?

Сводная информация о недостающих битах в виртуальном адресе для тега (размер страницы 8 КБ - 12 бит):

  • L3 (8 MB = 64 B x 128 K строк), 16-way, 8 K sets, тег 13 бит [18: 6] - отсутствует 7 бит
  • L2 (256 KB = 64 B x 4 K строк), 8-позиционный, 512 наборов, тег 9 бит [14: 6] - отсутствуют 3 бита
  • L1 (32 КБ = 64 B x 512 строк), 8-позиционный, 64 набора, тег 6 бит [11: 6] - отсутствие пропущенных битов

Это должно быть:

  • L3/L2 (физически индексированный, физически помеченный), используемый после поиска TLB
  • L1 (фактически индексированный, физически отмеченный)

введите описание изображения здесь

Ответ 1

Это возможно, потому что кеш L3 не может содержать одно и то же физическое область памяти как страница процесса 1 и как страница процесса 2 при этом время.

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

Эта часть преимуществ многоядерных проектов Intel с использованием больших инкапсулированных кэшей L3. Когерентность требует только проверки тегов L3, чтобы найти строки кэша в состоянии E или M в другом кэше L2 или L1 ядра.

Получение данных между двумя ядрами требует только обратной записи на L3. Я забываю, где это задокументировано. Возможно http://agner.org/optimize/. Процессоры до Nehalem, у которых были отдельные кэши для каждого ядра, по-моему, должны были сливаться с DRAM для согласованности. IDK, если данные могут быть отправлены непосредственно из кеша в кеш с тем же протоколом, который используется для обнаружения проблем согласованности.


Такая же строка кэша, сопоставленная с разными виртуальными адресами, всегда будет находиться в одном наборе кеша L1. См. Обсуждение в комментариях: кеши L2/L3 являются физически индексом, а также физически помечены, поэтому сглаживание никогда не является проблемой. (Только L1 может получить выигрыш в скорости от виртуальной индексации. Пропуски кеша L1 не обнаруживаются до тех пор, пока перевод адреса не будет завершен, поэтому физический адрес будет готов вовремя для проверки кэшей более высокого уровня.)

Также обратите внимание, что в комментариях в комментариях неверно упоминается, что Skylake снижает ассоциативность кеша L1. Фактически, это кеш Skylake L2, который менее ассоциативен, чем раньше (4-х позиционный, с 8-way в SnB/Haswell/Broadwell). L1 все равно 32kiB 8-way, как всегда: максимальный размер для этой ассоциативности, который сохраняет биты адреса выбора страницы из индекса. Итак, нет никакой тайны.

Также см. еще один ответ на этот вопрос о потоках HT в одном и том же ядре, обменивающемся через L1. Я сказал больше о способах кеширования и наборы там. (И благодаря Voo, я просто исправил это, чтобы сказать, что индекс кэша выбирает набор, а не способ.: P)