Недавно я столкнулся со случаем, когда мне понадобилось целочисленное деление на чипе, в котором его не было (ARM Cortex-A8). Пытаясь исследовать, почему это должно быть, я обнаружил, что в общем случае деление занимает гораздо больше циклов, чем сложение, вычитание или умножение практически любой целочисленной (или фиксированной) архитектуры. Почему это так? Разве это не представимо с двухслойной логикой И-ИЛИ, как все остальное?
computer-arithmetic
Phonon
источник
источник
Хотя все современные процессоры, по-видимому, используют итеративный подход, как предлагает aterrel , была проделана некоторая работа над неитеративными подходами. Точность деления с плавающей точкой и квадратного корня с переменной точностью говорит о не итеративной реализации деления с плавающей точкой и квадратного корня в FPGA с использованием справочных таблиц и расширения ряда Тейлора.
Я подозреваю, что одни и те же методы могут сделать возможным выполнение этих операций за один цикл (пропускная способность, если не задержка), но вам, скорее всего, понадобятся огромные таблицы поиска и, таким образом, невероятно большие площади кремниевого пространства, чтобы сделать это. ,
Почему это не осуществимо?
При проектировании процессоров есть много компромиссов. Функциональность, сложность (количество транзисторов), скорость и энергопотребление взаимосвязаны, и решения, принимаемые во время проектирования, могут оказать огромное влияние на производительность.
Современный процессор, вероятно, мог бы иметь основной модуль с плавающей запятой, который выделяет достаточное количество транзисторов на кремнии для выполнения деления с плавающей запятой за один цикл , но вряд ли это будет эффективным использованием этих транзисторов.
Умножение с плавающей запятой сделало этот переход от итеративного к неитеративному десятилетие назад. В наши дни однократное умножение и даже умножение-накопление являются обычным явлением даже в мобильных процессорах.
Прежде чем он стал эффективным использованием бюджета транзисторов, умножение, как и деление, часто выполнялось итерационным методом. Тогда специализированные процессоры DSP могли бы посвятить большую часть своего кремния одному блоку быстрого умножения (MAC) . Процессор Core2duo имеет задержку умножения с плавающей запятой 3 (значение получается из конвейера 3 цикла после его ввода ), но может иметь 3 умножения в полете за раз, что приводит к пропускной способности за один цикл, в то время как его модуль SSE2 может откачивать несколько множителей FP за один цикл.
Вместо того, чтобы выделять огромные области кремния для одного цикла деления, современные процессоры имеют несколько модулей, каждый из которых может выполнять операции параллельно, но оптимизирован для своих конкретных ситуаций. В самом деле, когда вы учитываете SIMD инструкции , такие как SSE или CPU интегрированной графики в Sandy Bridge или более поздней версии процессора, может быть много таких чисел с плавающей запятой делят блоки на CPU.
Если бы общее деление с плавающей запятой было более важным для современных процессоров, то, возможно, имело бы смысл выделить достаточно кремниевой области, чтобы сделать его одним циклом, однако большинство производителей чипов, очевидно, решили, что они могут лучше использовать этот кремний, используя эти вентили для других целей. , Таким образом, одна операция медленнее, но в целом (для типичных сценариев использования) ЦП работает быстрее и / или потребляет меньше энергии.
источник