При использовании обычной 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. Фактически, во многих системах быстрее вычислить обратную величину и сделать умножение, чем просто сделать деление.
Те же компромиссы применимы к делению как умножению - просто деление всегда будет намного медленнее и намного больше, чем умножение.