Используется ли физическая или виртуальная адресация в процессорах x86 / x86_64 для кеширования в L1, L2 и L3?

Какая адресация используется в процессорах x86 / x86_64 для кэширования в L1, L2 и L3 (LLC) - физическая или виртуальная (с использованием PT / PTE и TLB) и каким-то образом выполняет PAT (таблица атрибутов страницы) повлиять на это?

И есть ли разница между драйверами (пространство ядра) и приложениями (пространство пользователя) в этом случае?


Краткий ответ - Intel использует виртуально индексированные, физически помеченные (VIPT) кеши L1: Что будет использоваться для обмена данными между потоками, выполняемыми на одном ядре с HT?

  • L1 - Виртуальная адресация (в 8-way кэше для определения Set требуется низкий 12 bits, который совпадает с виртуальным и физическим)
  • L2 - Физическая адресация (требуется доступ к TLB для Virt-2-Phys)
  • L3 - Физическая адресация (требуется доступ к TLB для Virt-2-Phys)

person Alex    schedule 26.09.2013    source источник
comment
Вы не можете обратиться к кешу. Вы можете обращаться только к памяти. Кеш-память обрабатывается ЦП в частном порядке.   -  person Kerrek SB    schedule 27.09.2013
comment
@Kerrek SB Да, я знаю, но использует ли кэш процессора TLB и все накладные расходы виртуальной адресации или нет?   -  person Alex    schedule 27.09.2013
comment
L1 по-прежнему физически помечен, и, как вы говорите, индексирование получает скорость виртуального, но также отсутствие псевдонима физического. Так что это действительно L1 - Physical; он ведет себя точно так же, как PIPT, но с меньшей задержкой на пару циклов. В процессорах Intel виртуально адресуется только uop-cache. Пожалуйста, не редактируйте ответы на свой вопрос.   -  person Peter Cordes    schedule 10.04.2018


Ответы (1)


Ответ на ваш вопрос - зависит от обстоятельств. Это строго проектное решение ЦП, которое обеспечивает баланс между производительностью и сложностью.

Возьмем, к примеру, новейшие процессоры Intel Core - они физически помечены и виртуально индексированы (по крайней мере, согласно http://www.realworldtech.com/sandy-bridge/7/). Это означает, что кеши могут выполнять поиск только в чисто физическом адресном пространстве, чтобы определить, есть ли строка там или нет. Однако, поскольку L1 32k, 8-сторонний ассоциативный, это означает, что он использует 64 набора, поэтому вам нужны только адресные биты с 6 по 11, чтобы найти правильный набор. Как оказалось, виртуальные и физические адреса в этом диапазоне совпадают, поэтому вы можете искать DTLB параллельно с чтением набора кешей - известный трюк (см. - http://en.wikipedia.org/wiki/CPU_cache для хорошего объяснения).

Теоретически можно создать виртуальный кеш с тегами index + virtualy, который избавит от необходимости проходить трансляцию адресов (поиск TLB, а также обход страниц в случае промахов TLB). Однако это вызовет множество проблем, особенно с псевдонимом памяти - случаем, когда два виртуальных адреса отображаются на один и тот же физический.

Скажем, core1 имеет виртуальные кеши с адресом A в таком полностью виртуальном кэше (он отображается на физический адрес C, но мы еще не сделали эту проверку). core2 записывает в виртуальный адрес B, который соответствует тому же физическому адресу C - это означает, что нам нужен какой-то механизм (обычно «snoop», термин, придуманный Джимом Гудманом), который делает недействительной эту строку в core1, управляя слиянием данных и управлением согласованностью. если нужно. Однако core1 не может ответить на этот snoop, поскольку он не знает о виртуальном адресе B и не хранит физический адрес C в виртуальном кеше. Итак, вы можете видеть, что у нас есть проблема, хотя это в основном актуально для строгих систем x86, другие архитектуры могут быть более слабыми и допускать более простое управление такими кешами.

Что касается других вопросов - я не могу придумать реальной связи с PAT, кеш уже разработан и не может быть изменен для разных типов памяти. Тот же ответ на другой вопрос - HW в основном находится ниже различия между режимом пользователя / ядра (за исключением механизмов, которые он обеспечивает для проверки безопасности, в основном различных колец).

person Leeor    schedule 27.09.2013
comment
Большое спасибо! И, по вашему мнению, есть ли польза от знания механизма на x86 и знаю ли я, как разработчик, могу ли я как-то оптимизировать производительность своей программы? - person Alex; 28.09.2013
comment
Безусловно, разработчик ПО, который не знает HW, на котором он работает, плохо справился бы с его оптимизацией (при необходимости) или отладкой (при необходимости :). Тип адреса сопоставления кэша действительно имеет немного низкий уровень, хотя он открывает люк для некоторых важных оптимизаций, таких как встроенные функции предварительной выборки SW и дизайн с учетом кеширования). Примеры см. В этом отличном сообщении - stackoverflow.com/questions/ 16699247 /. Также есть вопрос о выполнении вне очереди, который может дать некоторые подсказки, и, конечно, о различных оптимизациях компилятора (не HW, но тоже важно) - person Leeor; 28.09.2013
comment
Я имею в виду - извлеките выгоду из того, что в x86: они физически помечены и виртуально индексированы - person Alex; 28.09.2013
comment
Это не x86, это обычная дизайнерская точка, которая встречается во многих процессорах. Я почти уверен, что большинство проектов на базе ARM также используют это. Чтобы извлечь из этого пользу, вам нужно убедиться, что ваши адреса физически не слишком сильно совпадают с битами тегов (или, по крайней мере, имеют хороший разброс) - это непростая задача, поскольку вы обычно не решаете, где ОС назначает ваши страницы. - person Leeor; 28.09.2013
comment
Спасибо! Но если я не могу повлиять на то, где ОС назначает ваши страницы, какую выгоду я могу извлечь из этого? - person Alex; 29.09.2013
comment
Немного, наверное, ничего. Кеши предназначены для достижения наилучшего распределения адресов, чтобы свести к минимуму перегрузку кеша. Было бы гораздо больше преимуществ спроектировать ваш код так, чтобы он был дружелюбным к кешу в целом, путем мозаичного размещения большой структуры, чтобы поместиться в нее, или избежания ложного совместного использования, чем беспокоиться о разбросе физических страниц. Я бы обратил внимание на то, как совпадают младшие биты (например, при работе с массивами A и B, попробуйте установить их на разных смещениях страниц), но это относится к виртуальным адресам и не имеет прямого отношения к VIPT. тайники - person Leeor; 30.09.2013
comment
re: хак скорости VIPT L1, который позволяет извлекать теги (и данные) из набора параллельно с доступом TLB. Это действительно больше похоже на кеш PIPT, где преобразование индекса происходит бесплатно (потому что все биты индекса находятся ниже смещения страницы). Некоторое время назад я попытался написать подробное объяснение того, почему это работает. Возможно, вы захотите связать это, а также Википедию. - person Peter Cordes; 29.11.2016