Как известно, все уровни кэша 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 (фактически индексированный, физически отмеченный)