Как работает индексация кэша данных Ice Lake 48 КБ L1?

Оптимизация вручную Intel (редакция от сентября 2019 г.) показывает 8-сторонний ассоциативный кэш данных L1 размером 48 КБ для микроархитектуры Ice Lake.

Кэш данных L1 Ice Lake 48 КиБ и его 8-сторонняя ассоциативность 1 Программно-видимая задержка / пропускная способность будет зависеть от шаблонов доступа и других факторов.

Это сбило меня с толку, потому что:

  • Всего 96 наборов (48 KiB / 64/8), что не является степенью двойки.
  • Биты индексации набора и биты индексации смещения байта в сумме составляют более 12 бит, это делает дешевым-PIPT-as- VIPT-трюк недоступен для страниц размером 4 КиБ.

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

Приложив немного творчества, я все еще могу представить себе быстрый способ индексирования 96 наборов, но второй пункт кажется мне важным переломным моментом.

Что мне не хватает?


person Margaret Bloom    schedule 19.01.2020    source источник


Ответы (2)


Руководство по оптимизации неверно.

По инструкции CPUID ассоциативность равна 12 (на Core i5-1035G1). См. Также uops.info/cache.html и en.wikichip.org/wiki/intel/microarchitectures/ice_lake_ (клиент).

Это означает, что имеется 64 набора, что аналогично предыдущим микроархитектурам.

person Andreas Abel    schedule 19.01.2020

Как руководство по оптимизации, так и таблица семейства процессоров (раздел 2.4.2) упоминает, что кэш данных L1 является 8-сторонним ассоциативным. Другой источник - InstLatx64, который предоставляет cpuid дампы для многих процессоров, включая процессоры Ice Lake. . Возьмем, к примеру, дамп для i7-1065G7.

CPUID 00000004: 1C004121-02C0003F-0000003F-00000000 [SL 00]

Информацию о кэше можно найти в cpuid листе 0x4. Том 2 Intel SDM обсуждает, как декодировать эти байты. Биты 31–22 EBX (второй слева) представляют количество путей минус один. Эти биты в двоичном формате равны 1011, что соответствует 11 в десятичном формате. Итак, cpuid говорит, что есть 12 способов. Другая информация, которую мы можем получить отсюда, заключается в том, что размер кэша данных L1 составляет 48 КБ, с размером строки кэша 64 байта и использует простую схему адресации. Таким образом, на основе информации cpuid биты 11-6 адреса представляют индекс набора кэш-памяти.

Так какой из них правильный? Руководство по оптимизации может быть неправильным (и это будет не в первый раз), но также может быть ошибочный дамп cpuid (и это тоже будет не в первый раз). Что ж, оба могут ошибаться, но исторически это гораздо менее вероятно. Другие примеры расхождений между руководством и информацией cpuid обсуждаются здесь, Итак, мы знаем, что ошибки существуют в обоих источниках. Более того, я не знаю ни одного другого источника Intel, который упоминал бы количество способов в L1D. Конечно, источники, не принадлежащие Intel, тоже могут ошибаться.

Наличие 8 способов с 96 наборами приведет к необычному дизайну и вряд ли произойдет без простого упоминания одного числа в руководстве по оптимизации (хотя это не обязательно означает, что в кэше должно быть 12 способов). Это само по себе увеличивает вероятность того, что руководство здесь окажется неправильным.

К счастью, Intel документирует ошибки реализации своих процессоров в документах обновления спецификаций. Мы можем свериться с документом об обновлении спецификаций для процессоров Ice Lake, который вы можете найти здесь. Там задокументированы две cpuid ошибки:

Неточная информация о CPUID TLB

Я уже обсуждал эту проблему в своем ответе на Понимание TLB из результатов CPUID на Intel. Вторая ошибка:

Информация о кэше L2 CPUID может быть неточной

Это не имеет отношения к вашему вопросу.

Тот факт, что в документе об обновлении спецификации упоминаются некоторые cpuid ошибки, убедительно свидетельствует о том, что информация из cpuid листа 0x4 была подтверждена Intel и является точной. Так что руководство по оптимизации (и таблица данных), вероятно, неверны в этом случае.

person Hadi Brais    schedule 20.01.2020
comment
наличие 8 способов с 96 наборами привело бы к необычному дизайну - это серьезное преуменьшение, не правда ли? Intel всегда придерживалась кешей VIPT = PIPT L1d. Даже без информации CPUID я бы счел ошибку в руководстве по оптимизации наиболее вероятным объяснением. Если у вас нет такой техники реализации, которая позволяет использовать количество наборов, отличных от степени двойки, и позволяет избежать проблем с наложением имен? - person Peter Cordes; 20.01.2020
comment
@PeterCordes Intel всегда вносит серьезные изменения в каждую новую микроархитектуру. В Ice Lake добавление новой магазинной трубы - огромное изменение. Так что, если Intel что-то делала в прошлом, это не значит, что она продолжит это делать в будущем. Да, существует множество методов реализации, которые либо избегают, либо решают проблемы сглаживания. Что касается не-степени двойки, есть способы справиться и с этим. Например, у вас может быть дизайн с разделенным кешем данных, в котором общее количество наборов не является степенью двойки. - person Hadi Brais; 20.01.2020
comment
@PeterCordes Intel в конечном итоге должна все равно решать эти проблемы. Один из способов - увеличить размер самой маленькой страницы до 64 КБ, например, и эмулировать страницы размером 4 КБ с использованием страниц размером 64 КБ. Это позволило бы избежать проблем с псевдонимом, но это компромисс. - person Hadi Brais; 20.01.2020
comment
Хорошо, справедливо, Intel могла провести серьезную модернизацию L1d. Но насколько больше практично сделать L1d и при этом сохранить низкую задержку использования нагрузки, на которую полагаются структуры данных на основе указателей? Может, если бы не проблема с VIPT, они могли бы пойти на 64k / 8-way? У них действительно есть частный L2 на ядро, поэтому я не думаю, что они захотят замедлить общий случай. Я предполагал, что Intel будет поддерживать L1d примерно такого размера, пока они будут производить процессоры x86. (Наряду с другими недостатками размера страницы 4 КБ, такими как необходимость значительного места для таблиц страниц, если вы не используете огромные страницы.) - person Peter Cordes; 20.01.2020
comment
@PeterCordes Да, задержка может быть проблемой, и разделение большого кэша данных может ее уменьшить. Размер страницы 4 КБ уже не идеален как наименьший размер страницы. У Intel есть патент на то, как имитировать страницы размером 4 КБ с использованием страниц большего размера. См .: stackoverflow.com/questions/11543748/. Удаление встроенной поддержки страниц размером 4 КБ поможет решить проблему VIPT и сделает больше битов доступными для индексации кеша, сохраняя при этом PIPT. - person Hadi Brais; 20.01.2020
comment
Пройдет много лет, прежде чем Intel сможет полностью удалить поддержку страниц 4k из основного аппаратного обеспечения. Я мог бы представить, как они (через несколько лет) продают ЦП, где можно использовать только половину наборов в L1d, если включена поддержка устаревших страниц 4k, поэтому вам понадобится обновленная ОС, чтобы получить все преимущества. (И не запускать какое-либо пользовательское пространство, которое требует, чтобы ОС позволяла ему использовать страницы 4k для mmap). Как 48k / 12-полосная vs. 96k / 12-полосная. Я предполагаю, что теги могут включать бит 12 для поддержки режима работы с 12-битным смещением страницы. - person Peter Cordes; 20.01.2020
comment
Очень хороший ответ, хорошо проработанный! В конце концов, я принял предложение Андреаса из-за личного вкуса, но ваш тоже заслуживает того, чтобы его приняли. - person Margaret Bloom; 20.01.2020