2016-04-22 2 views
3

Мы знаем, что кеш использует виртуальные адреса. Итак, как это работает, когда задействованы несколько процессов, особенно для общих кэшей, таких как общий кэш L2 или даже для локального кеша L1, когда процессы переключаются, как в одновременном (гипер) многопоточном режиме, вы можете иметь потоки из два разных процесса, работающих на одном физическом ядре. Является ли hyperthreading какой-либо выгодой, когда задействованы потоки из разных процессов, или может ли это только повысить производительность, когда задействованы потоки одного и того же процесса?Может ли кэши хранить данные из нескольких процессов?

+1

вы уверены, что x86 кэши используют виртуальные адреса? [Это] (http://stackoverflow.com/questions/19039280/ физическая или виртуальная адресация-используется-в-процессорах-x86-x86-64-для-кэширования-в-т) ответ говорит о чем-то другом, IMO. – Downvoter

+0

Это специфичная архитектура. Если кеш виртуально проиндексирован/физически помечено, что проблем нет. Два разных потока могут просматривать один и тот же виртуальный адрес, но только процесс с соответствующим физическим адресом получит удар. – 4386427

+2

Такое несвязное сочетание абстрактных конструкций высокого уровня и механики реального уровня на низком уровне никогда не может дать осмысленного вопроса. – SergeyA

ответ

3

Ни одна из основных микроархитектур микросхемы x86 не использует кэши с виртуальными адресами. Все они используют виртуально-индексированные/физически помеченные (VIPT) L1-кеши. VIPT - это взлом производительности, который позволяет получать теги из набора, который будет выбран параллельно с поиском TLB.

Биты адреса, которые используются в качестве индекса, одинаковы на физических и виртуальных адресах. (т. е. они являются частью смещения на странице 4k, поэтому они не должны быть переведены TLB). Это означает, что он эффективно ведет себя точно так же, как кэш физик/физик (PIPT), избегая всех проблем виртуальной адресации.

Это стало возможным благодаря тому, что кеш небольшой и имеет достаточно способов. Кэш-память L1 от Intel - 32kiB, 8-way ассоциативность, с линиями 64B. Это учитывает все биты адреса внутри страницы. (см. другие ресурсы для диаграмм и более подробные объяснения.)

Hyperthreading отлично работает с отдельными процессами, поскольку процессоры x86 избегают псевдонимов кеширования (проблемы синонима/омонима). Они работают как с физически адресованными кэшами. Однако два процесса с интенсивной памятью, которые не используют память, могут работать медленнее с гиперпотоком, чем без. Конкуренциальное совместное использование кэшей может быть хуже, чем просто запуск одного процесса после завершения других операций, если это вариант.

Для процессов, которые являются узким местом для чего-то другого, кроме ресурса, который вызывает гиперпотоки, HT, безусловно, помогает. например с неверными прогнозами отрасли. Также с пропуском кеша из-за непредсказуемого доступа к большому рабочему набору, который по-прежнему будет часто отсутствовать без гиперпотока.


процессоров, использующие Вирт/Вирт кэша сделать необходимости аннулируют их на переключение контекста, или дополнительные теги, чтобы отслеживать, какие PID они были для. Это похоже на то, что в настоящее время кэширует поддержка виртуализации: они помечены идентификаторами виртуальных машин, поэтому они знают, для какого физического адреса виртуальной машины он нужен. virt/virt L1 означает, что вам не нужен быстрый TLB: он нужен только для промахов L1, поэтому кеш L1 также кэширует переводы.

Некоторые конструкции должны использовать физическое/физическое L1, но я не знаю конкретных примеров. Сила virt/phys довольно распространена в высокопроизводительных процессорах, потому что L1 с достаточным количеством способов сделать это - это просто хорошая идея.

Обратите внимание, что только L1 использует адреса virt. Big L2 and L3 caches are always phys/phys.


Другие ссылки:

  • http://www.realworldtech.com/forum/?threadid=76592&curpostid=76600 Весь этот поток идет в кучу деталей и вопросов о тайниках. Сообщения Дэвида Кантера, как правило, объясняют вещи понятным образом. Я не читал всю тему. RWT-форумы теперь доступны для поиска! поэтому, если вы заходите в Google для получения более подробной информации, вы, скорее всего, увидите больше обращений от летних тем форума.

  • Paul Clayton explains why phys-idx/virt-tag (PIVT) is such a bad idea that nobody would ever build one: у него есть недостатки практически адресованных кешей без каких-либо преимуществ. (Wikipedia says that MIPS r6000 is the only known implementation) и дает чрезвычайно эзотерическую причину: даже TLB будет слишком большим для реализации в Emitter-Coupled Logic, поэтому они реализуют срез TLB, чтобы просто перевести достаточно битов для физического индекса. Учитывая это ограничение, PIPT и VIPT не были варианты, и они решили пойти Pivt вместо VIVT.

  • Another very-detailed answer from Paul Clayton about caches.