Какая технология сопоставления кеша используется в процессоре Intel Core i7?
Я узнал о различных методах отображения кеша, таких как прямое сопоставление, сопоставление сопоставлений и набор методов ассоциативного сопоставления, а также узнал компромиссы. Но мне любопытно, что сейчас используется в процессоре Intel Core i7 или AMD. И как развиваются техники. И какие вещи нужно улучшить?
- Как точно работает инструкция x86 LOOP?
- Самый быстрый способ вычисления абсолютного значения с помощью SSE
- Как определить, была ли assembly .NET построена для x86 или x64?
- Как вы используете gcc для генерации кода сборки в синтаксисе Intel?
- SIMD, подписанный с неподписанным умножением для 64-разрядных * 64-бит до 128 бит
- x86 Инструкция MUL от VS 2008/2010
- Как читать и писать регистры x86 флаги напрямую?
- Почему инструкции x86-64 на 32-разрядных регистрах обнуляют верхнюю часть полного 64-битного регистра?
Кадры с прямым отображением в принципе никогда не используются в современных высокопроизводительных процессорах . Экономия энергии перевешивается большим преимуществом в скорости попадания для ассоциативно-ассоциативного кеша того же размера, с немного большей сложностью в логике управления. В наши дни бюджеты транзисторов очень велики.
Для программного обеспечения очень часто имеется, по крайней мере, несколько массивов, которые отличаются друг от друга на 4 тыс., Что создавало бы конфликтные промахи в кэше с прямым отображением. (Настройка кода с более чем несколькими массивами может привести к их перекосу, чтобы уменьшить количество ошибок в конфликтах, если цикл должен проходить через все их сразу)
Современные процессоры настолько быстр, что задержка в DRAM составляет более 200 основных тактовых циклов, что слишком велико даже для мощных процессоров вне очереди, которые очень хорошо скрываются при пропуске кеша.
Многоуровневые кэши необходимы (и используются все высокопроизводительные процессоры), чтобы обеспечить низкую задержку (~ 4 цикла) / высокую пропускную способность для самых жарких данных (например, до 2-х нагрузок и 1 магазин за такт , с 128, 256 или даже 512-битный путь между кешем L1D и блоками исполнения загрузки / хранения), при этом все еще достаточно большой, чтобы кэшировать рабочий набор разумного размера. Физически невозможно построить один очень большой / очень быстрый / высокоассоциативный кеш, который выполняет, а также текущие многоуровневые кеши для типичных рабочих нагрузок; проблема с задержкой на скорости, когда данные вынуждены физически путешествовать далеко, является проблемой. Стоимость электроэнергии также была бы непомерно высокой. (Фактически, плотность мощности / мощности является основным ограничивающим фактором для современных процессоров, см. « Современные микропроцессоры: 90-минутное руководство!» ).
Все уровни кеша (кроме кэша uop) физически индексируются / физически помечены во всех х86-процессорах, о которых я знаю. Кадры L1D в большинстве проектов берут свои индексные биты из-за смещения страницы и, таким образом, также являются VIPT, позволяя искать TLB параллельно с выборкой тегов, но без каких-либо проблем с псевдонимом. Таким образом, кэши не нужно очищать от контекстных переключателей или чего-либо еще. (См. Этот ответ для получения дополнительной информации о многоуровневых кэшах в целом и трюке скорости VIPT и некоторых параметрах кэша некоторых реальных процессоров x86.)
Частные (для ядра) L1D / L1I и L2 кэши являются традиционными сет-ассоциативными кэшами , часто 8-way или 4-way для небольших / быстрых кешей. Размер строки кэша составляет 64 байта на всех современных процессорах x86. Кэш данных – это обратная запись. (За исключением семейства AMD Bulldozer, где L1D является сквозным с небольшим буфером для записи в виде 4kiB).
http://www.7-cpu.com/ имеет хорошие функции организации / задержки, а также полосы пропускания и номера организации / производительности TLB для различных микроархитектур, включая многие x86, такие как Haswell .
Кэш «L0» decoded-uop в семействе Intel Sandybridge настроен как ассоциативный и практически разрешен . До 3 блоков до 6 мкп могут кэшировать результаты декодирования из инструкций в 32-байтовом блоке машинного кода. Связано: выравнивание ветвей для циклов с использованием микрокодированных инструкций для процессоров Intel SnB-семейства . (Кэш uop – большой шаг вперед для x86: инструкции x86 имеют переменную длину и трудно декодировать быстро / параллельно, поэтому кэширование результатов внутреннего декодирования, а также машинный код (L1I $) имеет значительные преимущества по мощности и пропускной способности. декодеры по-прежнему необходимы, поскольку кэш uop невелик, он наиболее эффективен в циклах (в том числе от средних до больших циклов). Это позволяет избежать ошибки Pentium4 (или ограничения на основе размера транзитера в то время) наличия слабых декодеров и полагаться на кеш трассировки.)
Современная Intel (и AMD, я полагаю) L3 aka LLC, а также кэши последнего уровня используют функцию индексирования, которая представляет собой не только диапазон адресных битов . Это хеш-функция, которая лучше распределяет вещи для уменьшения коллизий с фиксированных шагов. Согласно Intel, мой кеш должен быть 24-сторонним ассоциативным, хотя его 12-way, как это? ,
Начиная с Nehalem , Intel использует большой общий общий кеш L3, который фильтрует когерентный трафик между ядрами . т.е. когда одно kernel считывает данные, находящиеся в модифицированном состоянии в L1d другого ядра, tags L3 указывают, какое kernel, поэтому RFO (Read for Ownership) может быть отправлено только на это kernel, а не на трансляцию. Как организованы кэширование современных процессоров Intel L3? , Свойство инклюзивности важно, потому что это означает, что ни один закрытый кеш L2 или L1 не может иметь копию строки кэша, не зная об этом L3. Если он находится в режиме «Исключительное» или «Модифицированное» в частном кеше, L3 будет иметь недопустимые данные для этой строки, но tags все равно скажут, какое kernel может иметь копию. У ядер, которые определенно не имеют копии, не нужно отправлять сообщение об этом, экономя мощность и пропускную способность по внутренним связям между ядрами и L3. См. « Когерентность кэширования на чип-кеш-памяти» здесь для более подробной информации о когерентности кеша на чипе в Intel «i7» (например, Nehalem и семейство Sandybridge, которые представляют собой разные архитектуры, но используют одну и ту же иерархию кэшей).
У Core2Duo был общий кеш последнего уровня (L2), но он медленно выполнял запросы RFO (Read-For-Ownership) на пропуски L2. Таким образом, пропускная способность между ядрами с небольшим буфером, который вписывается в L1d, медленнее, чем с большим буфером, который не соответствует L2 (т.е. скорости DRAM). Существует очень большой диапазон размеров, когда буфер подходит для L2, но не L1d, поскольку kernel записи выдает свои собственные данные на L2, где могут загружаться нагрузки другого ядра, не генерируя запрос RFO. (См. Рис. 3.27: Пропускная способность 2-го канала с 2- мя streamами в Ульрихе Дреппе «Что каждый программист должен знать о памяти» ( полная версия здесь ).
Skylake-AVX512 имеет более крупный L2 (1MiB вместо 256k) и меньше L3 (LLC) срезов на kernel. Это уже не включительно . Он использует сетчатую сеть вместо кольцевой шины для соединения ядер друг с другом. См. Эту статью AnandTech (но она содержит некоторые неточности в микроархитектурных деталях на других страницах, см. Комментарий, который я оставил ).
Технический обзор масштабируемого семейства процессоров Intel® Xeon®
Из -за неинклюзивного характера LLC отсутствие линии кэша в LLC не указывает на то, что линия отсутствует в частных кешах любого из ядер. Поэтому фильтр отслеживания используется для отслеживания местоположения строк кэша в L1 или MLC ядер, когда он не выделяется в LLC. На процессорах предыдущего поколения сам по себе общий LLC позаботился об этой задаче.
Этот «snoop-filter» полезен, если он не может иметь ложные негативы. Можно отправить недействительный или RFO ( MESI ) в kernel, которое не имеет копии строки. Нельзя позволить ядру хранить копию строки, когда другое kernel запрашивает эксклюзивный доступ к ней. Таким образом, это может быть трек-трекер, который знает, какие ядра могут иметь копии этой строки, но которые не кэшируют какие-либо данные.
Или, может быть, фильтр snoop может быть полезен без строгого использования всех тегов L2 / L1. Я не эксперт в многоядерных / многопроцессорных протоколах snoop. Я думаю, что тот же фильтр snoop также может помочь отфильтровать запросы snoop между сокетами. (В Broadwell и более ранних версиях только четырехсетевые и более высокие Xeons имеют фильтр snoop для межядерного трафика, только Broadwell Xeon с поддержкой двух сокетов и ранее не фильтруют запросы snoop между двумя сокетами .)
AMD Ryzen использует отдельные кэши L3 для кластеров ядер , поэтому данные, разделяемые во многих ядрах, должны дублироваться в L3 для каждого кластера. Также важно, что записи из ядра в одном кластере занимают больше времени, чтобы быть видимыми для ядра в другом кластере, причем запросы согласования должны проходить через межсоединение между кластерами. (Аналогично сокетам в многопроцессорной системе Intel, где каждый процессор имеет свой собственный L3.)
Таким образом, это дает нам NUCA (неравномерный доступ к кешу), аналогичный обычным NUMA (неравномерным доступом к памяти), который вы получаете в многосетевой системе, где каждый процессор имеет встроенный controller памяти, а доступ к локальной памяти быстрее, чем доступ к памяти, подключенной к другому сокету.
Недавние многосетевые системы Intel имеют настраиваемые режимы snoop, поэтому теоретически вы можете настроить механизм NUMA для лучшей работы с рабочей нагрузкой, в которой вы работаете. См . Страницу Intel о Broadwell-Xeon для таблицы + описание доступных режимов snoop.
Еще одно продвижение / эволюция – это адаптивная политика замещения в 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 ++.
- В стеке x86 тега переполнения стека есть раздел производительности, со ссылками на те и другие.