На этом уровне детализации необходимо разбить кеш и TLB на составные части. Они очень тесно связаны между собой в дизайне, в котором используется скоростной прием VIPT для перевода параллельно с выборкой тегов (т. Е. С использованием всех битов индекса, которые находятся ниже смещения страницы и, следовательно, переводятся бесплатно. Связано: Почему размер кэша L1 меньше, чем размер кэша L2 в большинстве процессоров?)
Сам L1dTLB представляет собой небольшую / быструю память с адресацией по содержимому с (например) 64 записями. и 4-сторонний ассоциативный набор (Intel Skylake). Огромные страницы часто обрабатываются с помощью второго (и третьего) массива, проверяемого параллельно, например 32 записи, 4 страницы для 2M страниц, и для страниц 1G: полностью ассоциативная (4-сторонняя) с 4 записями.
Но пока упростите свою ментальную модель и забудьте об огромных страницах. L1dTLB - это одиночный CAM, и его проверка - это единственная операция поиска.
Кэш состоит как минимум из следующих частей:
- массив SRAM, в котором хранятся теги + данные в наборах
- логика управления для выборки набора данных + тегов на основе битов индекса. (Высокопроизводительные кэши L1d обычно извлекают данные для всех способов набора параллельно с тегами, чтобы уменьшить задержку обращения по сравнению с ожиданием выбора правильного тега, как если бы вы использовали более крупные и высокоассоциативные кеши.)
- компараторы для проверки тегов на соответствие переведенному адресу и выбора правильных данных, если один из них совпадает, или запуска обработки ошибок. (И при ударе обновите биты LRU, чтобы пометить этот способ как наиболее недавно использованный). Основную схему двухстороннего ассоциативного кэша без TLB см. В https://courses.cs.washington.edu/courses/cse378/09wi/lectures/lec16.pdf#page=17..
=
внутри круга - это компаратор: выдача логического истинного вывода, если входные значения ширины тега равны.
L1dTLB на самом деле не отделен от кеша L1D. На самом деле я не занимаюсь разработкой оборудования, но считаю, что модуль выполнения загрузки в современном высокопроизводительном дизайне работает примерно так:
- AGU генерирует адрес из регистра (ов) + смещение.
(Интересный факт: семейство Sandybridge оптимистично сокращает этот процесс для простого режима адресации: [reg + 0-2047]
имеет на 1с меньшую задержку использования нагрузки, чем другие режимы адресации, если значение reg находится на той же странице 4k, что и reg+disp
. Есть ли штраф, если база + смещение находится в другом страница, чем база?)
Биты индекса берутся из части адреса со смещением внутри страницы, поэтому их не нужно переводить из виртуального в физический. Или перевод не работает. Эта скорость VIPT с отсутствием алиасинга кэша PIPT работает до тех пор, пока L1_size / associativity <= page_size
. например 32kB / 8-полосный = 4k страниц.
Биты индекса выбирают набор. Теги + данные извлекаются параллельно для всех способов этого набора. (Это стоит энергии для экономии времени ожидания и, вероятно, того стоит только для L1. Более высокая ассоциативность (больше способов на набор) L3 кешей определенно нет)
Старшие биты адреса ищутся в массиве L1dTLB CAM.
Компаратор тегов получает переведенный тег физического адреса и выбранные теги из этого набора.
Если есть совпадение тега, кеш извлекает из данных правильные байты таким образом, чтобы они совпадали (используя младшие биты смещения внутри строки адреса и размер операнда).
Или вместо получения полной 64-байтовой строки он мог бы использовать биты смещения ранее, чтобы получить только одно (выровненное) слово с каждой стороны. Таким образом, безусловно, спроектированы процессоры без эффективных невыровненных нагрузок. Я не знаю, стоит ли это делать для экономии энергии для простых выровненных нагрузок на ЦП, который поддерживает невыровненные нагрузки.
Но современные процессоры Intel (P6 и новее) не имеют штрафа за невыровненные операторы загрузки даже для 32-байтовых векторов, если они не пересекают границу строки кэша. Индексация с байтовой детализацией для 8 параллельных способов, вероятно, стоит больше, чем просто выборка всех 8 x 64 байтов и настройка мультиплексирования вывода во время выполнения выборки + TLB на основе смещения внутри строки, размера операнда и специальные атрибуты, такие как нулевое или знаковое расширение, или широковещательная загрузка. Таким образом, как только сравнение тегов будет выполнено, 64 байта данных из выбранного способа могут просто перейти в уже настроенную мультиплексную сеть, которая захватывает нужные байты и передает или расширяет знак.
Процессоры AVX512 могут даже выполнять 64-байтную загрузку полной строки.
Если в L1dTLB CAM нет совпадений, вся операция выборки из кеша не может продолжаться. Я не уверен, удастся ли / как процессорам передать это, чтобы другие нагрузки могли продолжать выполняться, пока устранена ошибка TLB. Этот процесс включает проверку L2TLB (Skylake: унифицированная запись 1536, 12 каналов для 4 КБ и 2 МБ, 16 записей для 1 ГБ), а если это не удается, то с обходом страниц.
Я предполагаю, что промах TLB приводит к тому, что тег + выборка данных отбрасываются. Они будут повторно загружены, как только будет найден нужный перевод. Их негде держать, пока работают другие нагрузки.
В самом простом случае он мог бы просто повторно запустить всю операцию (включая получение перевода из L1dTLB), когда перевод будет готов, но это могло бы снизить задержку для попаданий L2TLB, сокращая процесс и используя перевод напрямую вместо того, чтобы помещать его в L1dTLB и снова получить обратно.
Очевидно, для этого требуется, чтобы dTLB и L1D действительно были спроектированы вместе и тесно интегрированы. Поскольку им нужно только поговорить друг с другом, это имеет смысл. Страница оборудования выполняет выборку данных через кеш L1D. (Таблицы страниц всегда имеют известные физические адреса, чтобы избежать проблемы «уловка 22 / курица-яйцо»).
есть ли боковая связь между TLB и кешем?
Я бы не назвал это подключением по боковой полосе. Кэш L1D - это единственное, что использует L1dTLB. Точно так же L1iTLB используется только кешем L1I.
Если есть TLB 2-го уровня, он обычно унифицирован, поэтому и L1iTLB, и L1dTLB проверяют его, если они отсутствуют. Точно так же, как разделенные кеши L1I и L1D обычно проверяют унифицированный кеш L2, если они отсутствуют.
Внешние кеши (L2, L3) почти всегда являются PIPT. Трансляция происходит во время проверки L1, поэтому физические адреса могут быть отправлены в другие кеши.
person
Peter Cordes
schedule
29.09.2017