Введение
В конструкции процессора использование декодера суммы адресов (SAD) или декодера памяти с суммированием адресов (SAM) является методом снижения задержки доступа к кэшу процессора и вычисления адреса (база + смещение). Это достигается за счет объединения операции суммирования при формировании адреса с операцией декодирования в SRAM кэша.
Обзор
Кэш данных L1 обычно должен быть самым критичным ресурсом процессора, поскольку мало что так напрямую повышает количество инструкций за цикл (IPC), как больший кэш данных. Доступ к большому кэшу данных занимает больше времени, а конвейеризация кэша данных ухудшает IPC. Один из способов уменьшения задержки доступа к кэшу данных L1 — объединение операции суммирования при генерации адреса с операцией декодирования в SRAM кэша. Операцию суммирования при генерации адреса все равно необходимо выполнять, поскольку другие блоки в конвейере памяти будут использовать полученный виртуальный адрес. Это суммирование будет выполняться параллельно с описанным здесь объединенным сложением/декодированием. Наиболее выгодным повторением для ускорения является загрузка, за которой следует использование этой загрузки в цепочке целочисленных операций, приводящих к другой загрузке. Если результаты загрузки обходят с тем же приоритетом, что и целочисленные результаты, то это повторение можно обобщить как загрузку, за которой следует другая загрузка, как если бы программа проходила по связанному списку. Далее в тексте предполагается архитектура набора инструкций (ISA) с одним режимом адресации (регистр + смещение), виртуально индексированным кэшем данных и загрузками с расширением знака переменной ширины. Большинство RISC ISA соответствуют этому описанию. В ISA, таких как Intel x86, для генерации виртуального адреса суммируются три или четыре входа. Сложения с несколькими входами можно свести к сложению двух входов с использованием сумматоров с переносом, а оставшаяся задача решается, как описано ниже. Критическим путем, таким образом, являются сумматор, декодер, линия слова SRAM, линия(и) битов SRAM, предусилители, мультиплексоры управления байтами и мультиплексоры обхода. Для этого примера предполагается прямо отображаемый кэш данных объемом 16 КБ, возвращающий выровненные по двойному слову (8 байт) значения. Каждая строка SRAM имеет размер 8 байт, и существует 2048 строк, адресуемых по Addr[13:3]. Идея суммирования адресов SRAM также хорошо применима к ассоциативным кэшам.
Игнорирование LSB: поздний выбор на перенос
Вышеуказанная формулировка проверяет весь результат сложения. Однако в декодере кэша ЦП весь результат сложения является байтовым адресом, а кэш обычно индексируется по большему адресу, в нашем примере – адресу 8-байтного блока. Предпочтительнее игнорировать несколько младших значащих битов (LSB) адреса. Однако младшие значащие биты двух слагаемых нельзя игнорировать, поскольку они могут привести к переносу, который изменит адресуемое двойное слово. Если R[13:3] и O[13:3] складываются для получения некоторого индекса I[13:3], то фактический адрес Addr[13:3] равен либо I[13:3], либо I[13:3] + 1, в зависимости от того, генерирует ли R[2:0]+O[2:0] перенос. И I, и I+1 могут быть получены, если есть два банка SRAM, один для четных адресов, а другой – для нечетных. Банк четных адресов содержит адреса 000xxx, 010xxx, 100xxx, 110xxx и т.д., а банк нечетных адресов содержит адреса 001xxx, 011xxx, 101xxx, 111xxx и т.д. Перенос из R[2:0]+O[2:0] затем может быть использован для выбора четного или нечетного двойного слова, извлекаемого позже. Следует отметить, что извлечение данных из двух банков SRAM половинного размера потребляет больше энергии, чем извлечение из одного банка полного размера, поскольку это вызывает больше переключений в чувствительных усилителях и логике управления данными.
Что было спасено?
Более простой путь кэша данных включал бы сумматор, за которым следует традиционный декодер. Для нашей рассматриваемой подсистемы кэша критический путь будет состоять из 14-битного сумматора, генерирующего истинные и инвертированные значения, за которым следует 11-битный элемент И для каждой строки декодера. В схеме с суммированием адреса конечный элемент И в декодере остается, но его ширина составляет 10 бит вместо 11. Сумматор был заменен логическим выражением с четырьмя входами для каждого бита. Сокращение задержки достигается за счет разницы в скорости между сумматором и этим выражением с четырьмя входами, что дает выигрыш примерно в три простых CMOS-элемента. Если читатель сочтет, что это потребовало чрезмерных умственных усилий ради улучшения в три элемента на многоциклическом критическом пути, то он лучше поймет степень оптимизации современных процессоров.
Дальнейшая оптимизация: предкод
Многие схемы декодеров избегают использования AND-элементов с большим веером раскрытия на самой линии декодирования, применяя стадию предварительного декодирования. Например, 11-битный декодер может быть предварительно декодирован в три группы по 4, 4 и 3 бита соответственно. Каждая 3-битная группа будет управлять 8 линиями в основном массиве декодирования, а каждая 4-битная группа – 16 линиями. В результате линия декодирования становится 3-входовым AND-элементом. Такая реорганизация может значительно уменьшить занимаемую площадь и снизить энергопотребление. Ту же реорганизацию можно применить и к декодеру с адресным суммированием. Каждый бит в непредварительно декодированной схеме, описанной выше, можно рассматривать как локальное 2-битное сложение. При предварительном декодировании каждая группа предварительного декодирования представляет собой локальное 3-, 4- или даже 5-битное сложение, при этом группы предварительного декодирования перекрываются на один бит. Предварительное декодирование обычно увеличивает количество линий, проходящих через декодер, и декодеры с адресным суммированием обычно имеют примерно вдвое больше линий, чем эквивалентный простой декодер. Эти линии могут быть ограничивающим фактором для степени возможного предварительного декодирования.