Какой метод отображения кэша используется в процессоре Intel Core i7?
Я узнал о различных методах отображения кэша, таких как прямое отображение, ассоциативное отображение и метод ассоциативного отображения, а также изучил компромиссы. Но мне любопытно, что сегодня используется в процессорах Intel Core i7 или AMD. И как методы развиваются. А что нужно улучшить?
1 ответ
Кэши с прямым отображением практически никогда не используются в современных высокопроизводительных процессорах. Экономия энергии перевешивается большим преимуществом в частоте попаданий для ассоциативно-связанного кэша того же размера, только с немного большей сложностью в логике управления. Транзисторные бюджеты в наши дни очень велики.
Для программного обеспечения очень часто иметь по крайней мере пару массивов, кратных 4 КБ друг от друга, что может привести к пропускам конфликтов в кеше с прямым отображением. (Настройка кода с более чем двумя массивами может включать в себя их перекос, чтобы уменьшить вероятность конфликтов, если циклу необходимо выполнить итерацию всех их сразу)
Современные процессоры настолько быстры, что задержка DRAM составляет более 200 тактовых циклов ядра, что слишком велико даже для мощных процессоров с неправильным порядком исполнения, чтобы очень хорошо скрываться при пропадании кеша.
Многоуровневые кэши необходимы (и используются для всех высокопроизводительных ЦП), чтобы обеспечить низкую задержку (~4 такта) / высокую пропускную способность для самых горячих данных (например, до 2 загрузок и 1 хранилище за такт, с 128, 256). или даже 512-битный путь между кэш-памятью L1D и исполнительными модулями векторной загрузки / хранения), хотя он все еще достаточно велик для кэширования рабочего набора разумного размера. Физически невозможно создать один очень большой / очень быстрый / высокоассоциативный кэш, который будет работать так же хорошо, как и текущие многоуровневые кэши для типичных рабочих нагрузок; Задержка скорости света, когда данные физически перемещаются далеко, являются проблемой. Стоимость электроэнергии также будет непомерно высокой. (Фактически, плотность мощности / мощности является основным ограничивающим фактором для современных процессоров, см. Современные микропроцессоры: руководство за 90 минут!.)
Все уровни кеша (кроме кеша uop) физически индексируются / помечаются физически во всех известных мне процессорах x86. Кэши L1D в большинстве проектов берут свои индексные биты ниже смещения страницы, и, следовательно, также являются VIPT, позволяющими выполнять поиск TLB параллельно с выборкой тегов, но без каких-либо проблем с наложением. Таким образом, кэши не нужно очищать при переключении контекста или чем-либо еще. (См. Этот ответ для получения дополнительной информации о многоуровневых кэшах в целом и трюке со скоростью VIPT, а также о некоторых параметрах кэша некоторых реальных x86-процессоров.)
Частные (на каждое ядро) кэши L1D / L1I и L2 являются традиционными ассоциативно-множественными кэшами, часто 8- сторонними или 4-сторонними для небольших / быстрых кешей. Размер строки кэша составляет 64 байта на всех современных процессорах x86. Кэши данных имеют обратную запись. (За исключением семейства AMD Bulldozer, где L1D проходит сквозную запись с небольшим буфером, объединяющим записи 4 КБ.)
http://www.7-cpu.com/ имеет хорошие показатели организации / задержек кэша, а также пропускную способность и показатели организации / производительности TLB для различных микроархитектур, включая многие x86, например Haswell.
Кэш-память с декодированием L0 "L0" в семействе Intel Sandybridge является ассоциативной по множеству и практически адресуемой. До 3 блоков до 6 моп могут кэшировать результаты декодирования из инструкций в 32-байтовом блоке машинного кода. Связанный: выравнивание ветвей для циклов, включающих микрокодированные инструкции на процессорах семейства Intel SnB. (Кэш-память UOP является большим преимуществом для x86: инструкции x86 имеют переменную длину и трудно декодируются быстро / параллельно, поэтому кэширование результатов внутреннего декодирования, а также машинного кода (L1I$) имеет значительные преимущества в мощности и пропускной способности. Мощный декодеры по-прежнему необходимы, поскольку кэш-память uop невелика, она наиболее эффективна в циклах (в том числе в средних и больших циклах), что позволяет избежать ошибки Pentium4 (или ограничения, основанной на размере транзистора в то время) из-за наличия слабых декодеров и зависимости от кеш трассировки.)
Современные Intel (и AMD, я полагаю) L3, также известные как кэши последнего уровня, используют функцию индексации, которая не является просто диапазоном битов адреса. Это хеш-функция, которая лучше распределяет вещи, чтобы уменьшить столкновения с фиксированными шагами. По мнению Intel, мой кэш должен быть 24-сторонним, хотя его 12-сторонний, как это?,
Начиная с Nehalem, Intel использовала большой инклюзивный общий кэш L3, который фильтрует согласованный трафик между ядрами. то есть когда одно ядро считывает данные, которые находятся в состоянии Modified в L1d другого ядра, теги L3 говорят, какое ядро, поэтому RFO (чтение для владения) может быть отправлено только этому ядру, а не широковещательно. Как организованы современные кэши Intel CPU L3?, Свойство инклюзивности имеет важное значение, поскольку оно означает, что ни один частный кэш L2 или L1 не может иметь копию строки кэша без знания L3 об этом. Если он находится в состоянии "Исключено" или "Изменено" в частном кэше, L3 будет иметь недопустимые данные для этой строки, но теги по-прежнему будут указывать, какое ядро может иметь копию. Ядрам, у которых определенно нет копии, не нужно отправлять сообщение об этом, экономя энергию и пропускную способность по внутренним каналам между ядрами и L3. Посмотрите, почему согласованность кэш-памяти на кристалле важна для получения более подробной информации о когерентности кэш-памяти на кристалле в Intel i7 (то есть семейства Nehalem и Sandybridge, которые являются разными архитектурами, но используют одну и ту же иерархию кэша).
Core2Duo имел общий кэш последнего уровня (L2), но медленно генерировал запросы RFO (Read-For-Ownership) на пропуски L2. Таким образом, пропускная способность между ядрами с небольшим буфером, который умещается в L1d, является такой же медленной, как и у большого буфера, который не умещается в L2 (то есть скорость DRAM). Существует быстрый диапазон размеров, когда буфер помещается в L2, но не в L1d, потому что ядро записи выселяет свои собственные данные в L2, где нагрузки другого ядра могут попадать без генерации запроса RFO. (См. Рисунок 3.27: Пропускная способность ядра 2 с двумя потоками в книге Ульриха Дреппера "Что каждый программист должен знать о памяти". ( Полная версия здесь).
Skylake-AVX512 имеет больший L2 на ядро (1 МБ вместо 256 КБ) и меньшие срезы L3 (LLC) на ядро. Это больше не включено. Он использует ячеистую сеть вместо кольцевой шины для соединения ядер друг с другом. См. Эту статью AnandTech (но она содержит некоторые неточности в деталях микроархитектуры на других страницах, см. Оставленный мной комментарий).
Из Intel® Xeon® Scalable Family Технический обзор
Из-за не включающей природы LLC, отсутствие строки кэша в LLC не означает, что эта строка не присутствует в частных кешах какого-либо из ядер. Поэтому для отслеживания местоположения строк кэша в L1 или MLC ядер используется отслеживающий фильтр, когда он не выделен в LLC. На процессорах предыдущего поколения общий LLC сам позаботился об этой задаче.
Этот "snoop-фильтр" полезен только в том случае, если он не может иметь ложных негативов. Можно отправить недействительный или RFO ( MESI) ядру, у которого нет копии строки. Нельзя позволять ядру сохранять копию строки, когда другое ядро запрашивает эксклюзивный доступ к ней. Так что это может быть трекер с тегами, который знает, какие ядра могут иметь копии какой строки, но который не кэширует никаких данных.
Или может быть полезен snoop-фильтр без строгого включения всех тегов L2 / L1. Я не эксперт по протоколам многоядерного / много-сокетного слежения. Я думаю, что тот же фильтр snoop может также помочь фильтровать запросы snoop между сокетами. (В Broadwell и более ранних версиях только Xeon с четырьмя сокетами и выше имеют Snoop-фильтр для трафика между ядрами; Broadwell Xeon и более ранние версии с двумя сокетами не фильтруют запросы Snoop между двумя сокетами.)
AMD Ryzen использует отдельные кэши L3 для кластеров ядер, поэтому данные, совместно используемые многими ядрами, должны дублироваться в L3 для каждого кластера. Также важно, что запись из ядра в одном кластере занимает больше времени, чтобы быть видимой для ядра в другом кластере, при этом запросы согласованности должны проходить через межсоединение между кластерами. (Аналогично между сокетами в системе Intel с несколькими сокетами, где каждый пакет ЦП имеет свой собственный L3.)
Таким образом, это дает нам NUCA (неоднородный доступ к кэшу), аналогичный обычному NUMA (неоднородному доступу к памяти), который вы получаете в многосетевой системе, где каждый процессор имеет встроенный контроллер памяти, и доступ к локальной памяти быстрее, чем доступ к памяти, подключенной к другому сокету.
В последних многосетевых системах Intel предусмотрены настраиваемые режимы отслеживания, поэтому теоретически вы можете настроить механизм NUMA для оптимальной работы в зависимости от рабочей нагрузки. См . Страницу Intel о Broadwell-Xeon для таблицы + описание доступных режимов отслеживания.
Другим достижением / развитием является адаптивная политика замены в L3 на IvyBridge и более поздних версиях. Это может уменьшить загрязнение, когда некоторые данные имеют временную локализацию, но другие части рабочего набора намного больше. (т. е. зацикливаясь на гигантском массиве со стандартной заменой LRU, все будет изгнано, оставляя в кеше L3 только кэширующие данные из массива, которые скоро не будут затронуты. Адаптивная замена пытается смягчить эту проблему.)
Дальнейшее чтение:
- Что каждый программист должен знать о памяти?
- Почему Skylake намного лучше, чем Broadwell-E для однопоточной пропускной способности памяти?? (Пропускная способность однопоточной памяти на многоядерных процессорах Xeon ограничена max_concurrency / latency, а не пропускной способностью DRAM).
- http://users.atw.hu/instlatx64/ для получения результатов синхронизации производительности памяти
- http://www.7-cpu.com/ для организации кэша / TLB и числа задержек.
- http://agner.org/optimize/ для деталей микроархитектуры (в основном о конвейере выполнения, а не памяти) и руководствах по оптимизации asm / C++.
- Вики-тэг Stack Overflow x86 имеет раздел производительности, со ссылками на них и многое другое.