На курсах колледжа CS есть много деталей о сумматорах для переноски, таких как Kogge-Stone, Lander-Fischer и т. Д. Они описаны как «распространенные в отрасли». Тем не менее, я не могу найти никаких доказательств (кроме, может быть, цепочки для переноса в Манчестере) из недавних времен, что они действительно используются где-то конкретно. Поиск Google возвращает только страницы журналов и научных исследований. Самое большее, гипотетические реализации даны.
У меня вопрос, есть ли какие-то конкретные места / реализации сумматоров для переноса используются? Или они не имеют отношения к реальному миру?
Ответы:
Это простой вопрос с очень сложным ответом.
Прежде всего, немного предыстории.
Реальный дизайн СБИС - это чрезвычайно техническая область, в которой постоянно меняется баланс компромиссов. Время, которое требуется схеме для расчета ответа, редко является единственным важным фактором. Также есть потребляемая мощность и физическая площадь, а также множество факторов, которые показывают, что разрабатываемые вами схемы на самом деле являются аналоговыми (например, сопротивление проводов, паразитная емкость). Все это важно в реальной схеме и может повлиять на то, какой дизайн выбран.
Во-вторых, вы должны рассмотреть весь жизненный цикл проекта. Сумматор, который подходит для реализации VLSI, может не подходить для реализации FPGA. Если дизайн будет проходить этап тестирования на FPGA ... вы получите картину.
В-третьих, не каждый сумматор сделан равным. На типичном процессоре имеется множество сумматоров, которые выполняют разные задачи; вероятно, есть несколько целочисленных ALU, сумматор мантиссы с плавающей запятой, сумматор, который выполняет вычисление адресов, сумматор, который вычисляет целевые значения для филиалов, и так далее. Это не считая сумматоров с сохранением переноса, которые вы найдете в современных единицах умножения. У каждого есть свои особенности и ограничения.
Например, вычисление целевого значения ветвления обычно включает добавление небольшой константы к полному слову, что предполагает другой дизайн сумматора, чем тот, который добавляет два полных слова вместе. Точно так же для сложения с плавающей запятой требуется шаг округления после сложения, который может занять меньше цикла, поэтому нет причин, по которым вы не могли украсть оставшуюся часть цикла, чтобы завершить сложение.
И, наконец, и, возможно, самое главное, крупные игроки (например, Intel, AMD, NVIDIA) довольно недоверчиво относятся к деталям низкоуровневой реализации по очевидным причинам, если только они не думают, что могут получить документ и / или патент из него. Даже тогда вы часто не можете быть уверены, что они на самом деле сделали без реинжиниринга.
Сказав это, есть несколько вещей, которые мы знаем.
Главное, что вам нужно осознать, - это то, что методы переноса в будущее являются строительными блоками, а не обязательно самими методами. Здесь может быть аналогия.
Если вы думаете о классах алгоритмов, вы, вероятно, изучили кучу алгоритмов сортировки, таких как быстрая сортировка, сортировка слиянием, сортировка вставками и так далее. В реальном мире, если сортировка является узким местом в производительности, любой порядочный инженер мог бы думать о них как о примитивных строительных блоках, из которых можно построить «реальный» вид.
Например, алгоритм сортировки из стандартной библиотеки GNU C ++ использует быструю сортировку, используя сортировку вставкой, когда интервалы становятся достаточно малыми. Однако, если после нескольких проходов кажется, что разделение быстрой сортировки имеет патологическое поведение, оно возвращается к сортировке в куче. Это три разных алгоритма сортировки для создания одного промышленного класса.
То же самое относится и к схемам сумматора. Например, известно, что в целочисленном устройстве Pentium 4 использовался сумматор Хана-Карлсона, представляющий собой смесь Kogge-Stone и Brent-Kung. (Хан-Карлсон особенно интересен, потому что это «сладкое пятно» в компромиссе между задержкой распространения и площадью кристалла, которая также является достаточно энергоэффективной.) Часто бывает полезно использовать сочетание нескольких методов.
«Чистые» сумматоры-переносчики по-прежнему остаются нормой в синтезированных цепях (например, если вы передаете оператор Verilog «+» в Cadence или Synopsys), когда речь идет о ручном проектировании, современных высокопроизводительных ЦП с их суперскалярными выходами. Похоже, что механизмы исполнения заказов движутся к несколько иному дизайну для своих целочисленных единиц.
Спекулятивные сумматоры - это схемы, которые имеют чрезвычайно низкую задержку распространения, но работают корректно только в течение некоторого времени (95% времени является типичным), и можно с очень небольшой логикой сказать, возвращает ли умозрительный сумматор правильный результат или нет. Таким образом, идея состоит в том, чтобы сделать умозрительное сложение и половину сложного переноса параллельно, за один цикл. Если умозрительный сумматор вернул правильный ответ, инструкция выполнена. В противном случае остановите конвейер и сделайте вторую половину точного сложения.
Поскольку вы знаете, что медленный путь займет два цикла, разработчики могут использовать более компактный и энергоэффективный метод, даже если он будет слишком медленным для общего использования.
источник
Да, многие компьютеры используют сумматоры для переноски. Я перепроектировал некоторые старые микропроцессоры и могу привести несколько примеров.
АЛУ на Intel 8008 (их первый 8-битный процессор) включал в себя большую схему переноса, реализованную с динамической логикой. Эта схема занимала столько же места в кристалле, сколько и сам АЛУ. Перспектива Carry показана в таблице 8008 , рисунок 3. Я не видел других процессоров 1970-х годов с переносом для ALU, поэтому 8008 немного необычен в этом отношении.
6502 использует примитивную переноску для инкремента счетчика программ (ПК). Он определяет, будет ли перенос из младшего байта ПК, и использует его для увеличения старшего байта. Это уменьшает волновой перенос с потенциально 16 бит до 8 бит. ALU 6502 использует пульсации переноса, хотя логика переноса инвертирована для чередующихся битов, что отрезает инвертор от пути и делает его немного быстрее.
Z-80 имеет 16-битный инкремент / уменьшитель, используемый для обновлений ПК, инструкции inc / dec и счетчик цикла. Он использует структуру пропуска переноса, поэтому переносы вычисляются для групп из двух битов. Кроме того, он использует некоторое ожидание переноса для генерации переноса из битов 0-7, 7-11 и 12-14. Другие переносы рассчитываются с помощью пульсации ( подробности ). Удивительно, что ALU Z-80 имеет 4 бита, поэтому каждая 8-битная операция делает два прохода через ALU.
С другой стороны, 8085 использует 16-разрядный инкремент / уменьшитель для переноса пульсаций. Но, как и 6502, он немного ускоряется за счет инверсии логики переноса в чередующихся битах.
ARM-1 имеет 32-битный ALU с не уноса опережающего просмотра, только пульсация переноса. Он также использует прием инвертирования переноса в чередующихся битах.
В мире миникомпьютеров многие процессоры были построены из хорошо известного 4-битного чипа ALU 74181, который имел внутреннюю перспективу переноса. Примеры включают в себя данные General Nova, Xerox Alto, VAX-11/780 и TI-990. (См. Более длинный список Википедии .) Некоторые из этих использованных переносов пульсации между каждым 4-битным чипом, а некоторые используют чип прогнозирования переноса 74182 для полного просмотра.
Подводя итог, можно сказать, что разные микропроцессоры используют различные методы переноса в зависимости от своих целей производительности и того, какие операции находятся на критическом пути. АЛУ может использовать полный перенос (например, 8008) или даже иметь половину (как Z-80). Инкрементатор может быть проблемой производительности, потому что в 8-битном процессоре он обычно составляет 16 бит, что приводит к удвоенной задержке пульсации. Инкрементатор может иметь пульсацию переноса (8085), одну переноску переноса (6502) или несколько ступеней переноса переноса (Z-80).
источник