Количество банков в кеше Nehalem l2

Я просто изучал время доступа к различным конфигурациям кэша, когда наткнулся на термин в интерфейсе cacti "Количество банков".

Число банков - это количество чередующихся модулей в кэше, которое увеличивает пропускную способность кэша и количество параллельных обращений к нему.

В этом контексте я хотел найти количество банков в кешах архитектуры Nehalem. Я погуглил за эту вещь, но ничего полезного не ударил.

Мои рассуждения здесь таковы:

  1. Кэш данных и инструкций L1 должен иметь один банк. Детализация доступа - это слово здесь.
  2. Кэш-память второго уровня поддерживает пропуски данных и кэша команд первого уровня. Следовательно, он должен поддерживать 2 банка.
  3. Кэш-память третьего уровня обычно распределяется между всеми ядрами системы и, следовательно, должна иметь большое (32) количество банков.

Правильна ли моя интуиция?? Кроме того, количество банков меняет структуру данных / программ (в идеале это не должно, но все же...)??

1 ответ

Решение

Обзорная графика статьи в Википедии изображает Nehalem (первый процессор под маркой "Core i7") с 256 КБайт кэш-памяти L2 на ядро.

Я не понимаю, что вы подразумеваете под словом "банк" здесь. Кэш Nehalem является 8-сторонним ассоциативным с 64 битами (8 байтов) на строку кэша.

Это означает, что для каждого доступа на чтение / запись в кэш передается 8 байтов данных, что хорошо соответствует 64-битной архитектуре, где все виртуальные адреса имеют 8 байтов. Таким образом, каждый раз, когда адрес должен быть извлечен из памяти или сохранен в памяти, 8 байт должны быть перенесены, таким образом, естественно спроектировать одну запись в кеше таким образом. (Другие размеры кэша также имеют смысл в зависимости от приложений: например, большие размеры для кэшей данных для блоков векторной обработки).

Ассоциативность x-way определяет взаимосвязь адреса памяти и места, где информация в этом адресе может храниться в кэше. Термин "8 способов ассоциативности" относится к тому факту, что данные, хранящиеся по определенному адресу памяти, могут храниться в 8 разных строках кэша. Кэши имеют механизм сравнения адресов, позволяющий выбрать совпадающую запись одним способом, и некоторую стратегию замены, позволяющую решить, какой из путей x следует использовать - возможно, исключив предыдущее допустимое значение.

Использование вами термина "банк", вероятно, относится к одному такому "набору" этой восьмисторонней ассоциативности. Таким образом, ответ на ваш вопрос, вероятно, "8". И опять же, это один кэш L2 на ядро, и у каждого такая структура.

Ваше предположение об одновременном доступе также верно. Это документировано, например, для ARM Cortax A15. Однако, если и как эти наборы или банки кэша могут быть доступны независимо, остается только догадкой. На диаграмме Википедии показана 256-битная шина между кэшем данных L1 и кэшем L2. Это может означать, что можно получить доступ к четырем путям независимо (4*64=256, но более вероятно, что в каждый момент времени фактически передается только одна загрузка / сохранение памяти, а более медленный кэш L2 просто передает 4 строки кеша одновременно чем быстрее кэш L1 в том, что можно было бы назвать пакетом.

Это предположение подтверждается тем фактом, что Руководство по системной архитектуре, которое можно найти на странице Intel в главе 2.2.6, перечисляет последующие улучшения Sandy Bridge, подчеркивая "Внутренняя пропускная способность двух нагрузок и одного хранилища в каждом цикле". Таким образом, процессоры до SandyBridge должны иметь меньшее количество одновременных загрузок / хранилищ.

Обратите внимание, что существует разница между загрузкой / хранением "в полете" и фактическими данными, передаваемыми. "в полете" - это те операции, которые выполняются в настоящее время. В случае загрузки, которая может повлечь за собой ожидание того, что память выдаст данные после того, как все кэши сообщили о пропусках. Таким образом, вы можете иметь много параллельных загрузок, но вы все равно можете использовать шину данных между любыми двумя кешами, используемыми только один раз в любой момент времени. Вышеупомянутое улучшение SandyBridge фактически расширяет эту шину данных до двух нагрузок и одного хранилища, фактически передавая данные одновременно, чего не мог сделать Nehalem (один "tock" или одна архитектура до Sandy Bridge).

Ваша интуиция не верна в некоторых аккаунтах:

  1. Гиперпоточность и многопоточность в целом позволяют процессору выполнять более одного оператора за цикл. (Nehalem, глава 2.2.5: "Предоставляет два аппаратных потока (логических процессора) на ядро. Использует механизм исполнения из 4-х элементов". Таким образом, имеет смысл поддерживать одновременную загрузку / сохранение в кэш L1.
  2. Кэш L2 обслуживает как данные L1, так и кэш команд L1 - в этом вы правы. По причине (1) может иметь смысл поддерживать более 2 одновременных операций.
  3. Обычно вы можете увеличить это число для кэша L3, но на практике это не имеет смысла. Я не знаю, откуда у тебя номер 32, может быть, это только предположение. Для любой дополнительной точки доступа ("банк" в вашей терминологии) у вас должны быть декодеры адресов, массивы тегов (для обработки сравнения адресов со строками кэша, стратегии замены и любыми флагами данных кэша (грязный бит и т. Д.)). Таким образом, каждый порт доступа требует дополнительных затрат на транзисторах и, следовательно, площади и мощности на кремнии. Каждый существующий порт также замедляет доступ к кешу, даже если он не используется. (Подробности выходят за рамки этого ответа). Так что это деликатное дизайнерское решение, а 32 - это, как правило, высокий уровень. Обычно для любого типа памяти внутри номера процессора варьируются от 1 до 6-8 портов чтения и от 1 до 2-4 портов записи. Конечно, могут быть и исключения.

Что касается вашей точки зрения по поводу оптимизации программного обеспечения: беспокойтесь, если вы разработчик аппаратного / встроенного программного обеспечения низкого уровня. В противном случае просто следуйте высокоуровневым идеям: если можете, сделайте свой внутренний цикл интенсивных операций небольшим, чтобы он поместился в кэш L3. Не запускайте больше потоков с интенсивными вычислениями на локальных данных, чем у вас есть ядра. Если вы начинаете беспокоиться о таких последствиях для скорости, начните компилировать / оптимизировать код с помощью соответствующих процессорных ключей и управлять другими задачами на компьютере (даже службами инфраструктуры).

В итоге:

  • Кэш-память второго уровня Nehalem является 8-сторонней ассоциативной
  • Он поддерживает менее 2 одновременных загрузок и 1 операцию хранения, вероятно, только одну. Но каждая загрузка / хранение может передавать до 256 битов одновременно в / из кэша данных L1.
  • Число одновременных операций загрузки / сохранения не масштабируется до 32 для кэша L3 из-за физических ограничений конструкции (время / площадь / мощность)
  • Как правило, вам не следует слишком сильно беспокоиться об этих деталях в своих приложениях, за исключением случаев, когда вы точно знаете, что это необходимо (например, в высокопроизводительных вычислениях).
Другие вопросы по тегам