Насколько быстро выполняется 64-битное умножение или деление на FPGA?


8

При использовании обычной FPGA, такой как Xilinx Spartan 3 или Virtex 5, сколько циклов требуется для выполнения 64-разрядного умножения или деления с плавающей запятой двойной точности?

Насколько я понимаю, FPGA не имеет жесткого FPU, и вам нужно создать его, используя стандартные библиотеки IEEE или другие материалы. Это означает, что он не будет выполняться за один цикл, поэтому я ищу приблизительную оценку для сравнения производительности 100 МГц процессора со 100 МГц Spartan / Virtex FPGA.

В первую очередь меня интересуют операторы с плавающей запятой, но если у вас есть опыт работы с целочисленными операциями, это также приветствуется.


3
Во-первых, стоит уточнить вопрос: вы говорите о 64-битном MPY / делении, что подразумевает 64-битное целочисленное умножение / деление - тогда вы упоминаете FPU, что подразумевает двойную точность с плавающей запятой. Детали ответа будут отличаться для каждого ...
Брайан Драммонд

2
Для одного умножения за раз, время, вероятно, сопоставимо или немного в пользу процессора. Очевидно, что преимущество ПЛИС состоит в том, что вы можете использовать их параллельно.
pjc50

Ответы:


12

Я не делал этого для FP с двойной точностью, но применяются те же принципы, что и для одинарной точности, для которой я реализовал деление (умноженное на взаимное).

Эти FPGA вместо FPU имеют встроенные блоки DSP / умножителя, способные выполнять умножение 18 * 18 или (Virtex-5) 18 * 25 за один цикл. И более крупные устройства имеют около тысячи из них, или даже 126 или 180 на верхнем конце семейств Spartan-3 или Spartan-6.

Таким образом, вы можете разбить большое умножение на более мелкие операции, используя несколько из них (2 для Virtex-5 с одинарной точностью), используя сумматоры DSP или матрицу FPGA для суммирования частичных произведений.

Вы получите ответ за несколько циклов - 3 или 4 для SP, возможно, 5 для DP - в зависимости от того, как вы составляете дерево сумматора (и иногда, когда инструменты синтеза настаивают на добавлении конвейерных регистров!).

Однако это задержка - поскольку она конвейерная, пропускная способность будет 1 результат за такт.

Для деления я аппроксимировал обратный оператор, используя таблицу поиска с последующей квадратичной интерполяцией. Это было точно лучше, чем с одинарной точностью, и, если я захочу, расширится (с большим количеством оборудования) до DP. В Spartan-6 требуется 2 BlockRam и 4 DSP / множителя и пара сотен LUT / FF пар.

Его задержка составляет 8 циклов, но опять-таки пропускная способность является одноцикловой, поэтому, комбинируя ее с указанным выше множителем, вы получаете одно деление за такт. Он должен превышать 100 МГц в Spartan-3. В Spartan-6 оценка синтеза составляет 185 МГц, но это с 1,6 нс на одном маршруте маршрутизации, поэтому 200 МГц в пределах разумного.

В Virtex-5 он без усилий достиг 200 МГц, как и его квадратный корень-близнец. У меня была пара летних студентов, которые пытались перенастроить его - с задержкой менее 12 циклов они приблизились к 400 МГц - 2,5 нс для квадратного корня.

Но помните, у вас может быть от ста до тысячи единиц DSP? Это дает вам на один-два порядка больше вычислительной мощности, чем один блок FP.


Спасибо за ваш ответ, Брайан, но разве не весь ваш ответ о целочисленном умножении / делении? Меня в первую очередь интересует плавающая точка.
TheFlash

2
Нет, как я уже сказал, с одинарной точностью, что означает 32-разрядное число с плавающей запятой. Те же самые принципы применяются для двойников, но использование ресурса очевидно выше.
Брайан Драммонд

5

При использовании обычной FPGA, такой как Xilinx Spartan 3 или Virtex 5, сколько циклов требуется для выполнения 64-разрядного умножения или деления с плавающей запятой двойной точности?

Ответ: да!

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

С логическим дизайном один компромисс между размером и скоростью. Простой пример этого - скажем, что один множитель с плавающей запятой слишком медленный. Чтобы ускорить это все, что вам нужно сделать, это добавить второй множитель. Ваш логический размер удваивается, но делает количество умножений в секунду. Но даже если взглянуть на один множитель, есть разные способы умножения чисел; некоторые быстрые и большие, другие маленькие и медленные.

Другим компромиссом является тактовая частота и тактовая частота. Я мог бы разработать некоторую логику, которая бы делала одно умножение с плавающей запятой за один такт. Но для этого также потребуется, чтобы тактовая частота была медленнее - возможно, такой же низкой, как 10 МГц. Или я мог бы спроектировать его для работы с тактовой частотой 100 МГц, но это потребовало бы 10 тактов на умножение. Общая скорость одинакова (умножение на 100 нс), но у одного часы быстрее.

С предыдущим параграфом связан компромисс между тактовой частотой и кратностью задержки. В логическом дизайне есть методика, называемая конвейерной обработкой. В основном вы берете кусок логики и разбиваете его на более мелкие этапы, где каждый этап занимает один тактовый цикл для завершения. Преимущество здесь в том, что каждый этап может работать с умножением, в то время как другие этапы работают с другими умножениями. Например, предположим, что мы работаем на 100 МГц с 10-ступенчатым конвейером. Это означает, что для каждого умножения потребуется 10 часов, но логика также работает на 10 разных умножениях одновременно! Круто то, что он завершает умножение на каждом такте. Таким образом, эффективные часы на умножение равны 1, для завершения каждого из этих умножений требуется всего 10 часов.

Таким образом, ответ на ваш вопрос, как быстро FPGA может сделать умножение, действительно зависит от вас. ПЛИС бывают разных размеров и скоростей, и вы можете посвятить столько логики выполнению поставленной задачи, сколько захотите. Но давайте посмотрим на один конкретный сценарий ...

Допустим, мы хотим использовать самый большой Spartan-3A, и все, что нас волнует, это 32-битные умножения с плавающей запятой. 32-разрядное умножение с плавающей запятой требует целочисленного умножения 24x24 и 8-разрядного сумматора. Для этого требуется четыре из выделенных блоков умножителя и несколько общих срезов (слишком мало, чтобы о них заботиться). XC3S1400A имеет 32 специальных умножителя, поэтому мы можем сделать восемь из наших умножителей с плавающей запятой параллельно. Очень грубое предположение о тактовой частоте будет около 100 МГц. Мы можем полностью реализовать эту схему так, чтобы мы могли выполнить четыре 32-разрядных умножения с плавающей запятой за такт, для эффективной скорости 800 миллионов умножений с плавающей запятой в секунду.

Для умножения с двойной точностью требуется 9 выделенных блоков умножения на умножение с плавающей запятой, поэтому мы можем сделать только 3 умножения параллельно, что приведет к скорости около 300 миллионов 64-битных умножений с плавающей запятой в секунду.

Для сравнения рассмотрим более новую серию Xilinx Virtex-7. Выделенные умножители при этом больше, поэтому нам нужно только 6 выделенных блоков умножения для 64-битного умножения с плавающей запятой. На большей части также имеется 1920 выделенных множителей, поэтому мы можем параллельно выполнять 320 умножений с плавающей запятой двойной точности. Эти части также намного быстрее. По моим оценкам, мы можем работать с этими частями на частоте 200 МГц, что дает нам общую скорость умножения с плавающей запятой с двойной точностью 64 миллиарда в секунду. Конечно, эти чипы стоят около 10000 долларов США каждый.

Деление с плавающей точкой гораздо сложнее сделать быстро. Логика намного больше, особенно в ПЛИС, и работает намного медленнее. То же самое верно для большинства процессоров, поскольку инструкции деления (с плавающей и фиксированной точкой) выполняются намного медленнее. Если скорость важна, то вы хотите устранить как можно больше разрывов. Например, вместо того, чтобы делить на 5, вы должны умножить на 0,2. Фактически, во многих системах быстрее вычислить обратную величину и сделать умножение, чем просто сделать деление.

Те же компромиссы применимы к делению как умножению - просто деление всегда будет намного медленнее и намного больше, чем умножение.


TI DSP или даже графический процессор на Rasberry Pi 3 высосет волшебный дым из того, что когда-то было ALU на FPGA.
Дххдхд

3

По крайней мере, для компонента деления Altera ALT_FP, 64-битное деление двойной точности (мантисса 52 бита) занимает 10, 24 или 61 тактовый цикл (по выбору). Одиночная расширенная точность может варьироваться. Например, деление 43 бита, где показатель степени равен 11 битам, а мантисса равна 26 битам, что позволяет выбрать такие параметры задержки выходного сигнала тактовой частоты: 8, 18 или 35. Запустите ISE и проверьте, что вы можете иметь в Xilinx.


1
Являются ли эти цифры задержкой или пропускной способностью?
Брайан Драммонд

Циклы двойной точности выбираются? По какому фактору? Использовать больше / меньше блоков? А как насчет умножения?
TheFlash

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

2

Там нет причин, чтобы это не могло занять один цикл. Это, вероятно, будет довольно большой цикл и использовать много ресурсов ...


1

У меня есть реализации двойной точности, умножения и деления с плавающей точкой. Умножение занимает 13 тактов, а деление - 109 тактов. Оба конвейера обеспечивают 100% пропускную способность (один результат за такт) и работу на частоте около 200 МГц на Xilinx V5. Я не знаю, сколько часов вы могли бы получить на частоте 100 МГц, но деление на два было бы безопасной ставкой.

У меня также есть реализации с плавающей запятой одинарной точности, которые занимают 10 и 51 такт в одной и той же ситуации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.