为什么硬件除法比乘法要花更长的时间?


37

为什么硬件除法要比微控制器上的乘法花费更多的时间?例如,在dsPIC上,除法需要19个周期,而乘法仅需要一个时钟周期。

我浏览了一些教程,包括Wikipedia上的除法算法乘法算法。这是我的理由。

像在Wikipedia 上恢复慢速除法一样,除法算法也是一种递归算法。这意味着step的(中间)结果k用作step 的输入k+1,这意味着这些算法无法并行化。因此,n完成分割至少需要花费周期,而n被除数中的位数是很多。对于16位除数,这至少等于16个周期。

乘法算法不需要递归,这意味着可以并行化它。但是,有许多不同的乘法算法,我不知道微控制器可以使用哪种算法。乘法在硬件/微控制器上如何工作?

我发现了一种Dadda乘法器算法,该算法只需要一个时钟周期即可完成。但是,我没有得到的是Dadda的算法分三步进行,而步骤1的结果用于步骤2,依此类推。因此,这至少需要三个时钟周期才能完成。


2
算法并没有真正定义时钟周期数。您的特定CPU可能有一个硬件乘法器/除法器以一个周期或20个周期工作,而与内部实现无关。
尤金(Eugene Sh)。

1
OP,您能否提供一个链接,以提供您所谈论的19对1周期的更多信息?有关您的DSP的一些特定说明。
弗拉基米尔·克拉韦罗(Fladimir Cravero)'17年

1
感谢您的回答。这是我的微控制器的数据表:ww1.microchip.com/downloads/en/DeviceDoc/70005127c.pdf。请参阅指令集概述,从第292页开始。它说所有DIV指令都需要18个周期,而所有MUL指令只需要1个周期。但是,不仅对于这种MCU来说并不常见,我已经在许多其他MCU中看到了这一点。
Marko Gulin

2
@Curd,好吧,他们差不多,不是吗。是给我的。我认为这没有您想象的那么好。
TonyM

1
另一个因素是经济和使用方式。大多数用法调用乘除的次数远多于除法。将大面积的硅专用于较不频繁使用的较快的硬件除法功能在经济上很差。最好制造出更小,更便宜的芯片,或者以更高的生产率使用额外的逻辑。顺便说一句,当我开始使用小型计算机时,划分并不总是一条指令。在某些计算机上,这是一个软件库调用,例如平方根。
nigel222 '17

Answers:


34

分频器不那么优雅地映射到典型硬件。以莱迪思ICE40 FPGA为例。

让我们比较两种情况:这个8x8位与16位乘数:

module multiply (clk, a, b, result);
   input clk;
   input [7:0]a;
   input [7:0]b;
   output [15:0]result;
   always @(posedge clk)
     result = a * b;
endmodule // multiply

这个除法器将8位和8位操作数减少为8位结果:

module divide(clk, a, b, result);
   input clk;
   input [7:0] a;
   input [7:0] b;
   output [7:0] result;
   always @(posedge clk)
     result = a / b;
endmodule // divide

(是的,我知道,时钟什么也没

映射时生成的示意性的概述乘数到ICE40 FPGA可以找到这里分频器 这里

Yosys的综合统计数据为:

  • 线数:155
  • 线位数:214
  • 公共电线数量:4
  • 公共线位数:33
  • 记忆数量:0
  • 存储器位数:0
  • 进程数:0
  • 单元数:191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

划分

  • 线数:145
  • 线位数:320
  • 公共电线数量:4
  • 公共电线位数:25
  • 记忆数量:0
  • 存储器位数:0
  • 进程数:0
  • 单元数:219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

值得注意的是,为全角乘法器和最大除法器生成的verilog的大小不是那么极端。但是,如果您看下面的图片,您会注意到乘法器的深度可能为15,而除法器的深度更像是50。决定速度的关键路径(即在操作过程中可能发生的最长路径)!


无论如何,您将无法阅读该内容,从而获得视觉印象。我认为可能会发现复杂性上的差异。这些是单周期乘法器/除法器!

在ICE40上相乘(警告:〜100 Mpixel图像)

倍增器的缩放图像

划分

在ICE40上分割)(警告:〜100 Mpixel图像)

分频器的缩放图像


4
不,您可以非迭代地实现它们。但是,要使有效结果通过逻辑“波动”,将只需要花费一些时间。上面的实现是非迭代的。
MarcusMüller17年

9
我想要分隔线的墙贴。
伊恩·豪森

5
乘法要点中现在有一个PDF 。它的尺寸是3378×3177毫米,因此,在将其放在卧室天花板上之前,请与您的另一半进行讨论。
MarcusMüller17年

2
您的100百万像素图像令人印象深刻,但是对于您要提出的观点来说却有些过分,对于试图在内存有限的设备(例如手机或平板电脑)上查看此页面的任何人,它们都会造成巨大的问题。如果要内嵌显示图像,请找到一种产生较低分辨率预览的方法。
戴夫·特威德

4
哟,那些graphviz图表脱颖而出,哟!
斯宾塞·威廉姆斯

8

慢除法本质上是迭代的,因此往往需要更长的时间。使用查找表,慢速分割算法比简单算法更快。SRT算法每个周期产生两位。此类表中的错误是臭名昭著的Pentium FDIV错误的原因(大约在1994年)。然后是所谓的快速划分算法。

当然,原则上,您可以简单地使用一个巨大的查找表来计算两个数字的乘积或商,从而在单个周期内获得结果,但是随着每个数字位数的增加,这往往会很快变得不切实际。


但最重要的是-除法算法不能像乘法算法那样并行化,这就是为什么它们这么慢的原因?
Marko Gulin

2
@MarkoGulin“不能”是一个非常有力的主张。当然不是那么简单。
Spehro Pefhany

2
我认为您可以将其从“除法算法无法并行化”削弱到“我们发现对除法进行并行化的方法比并行化乘法对实现除法的硬件更为紧张”。Sphero给出了一个示例,该示例如何使用O(2 ^ n)门进行n位数相乘来进行单周期除法...但这不切实际。
Cort Ammon

1
长除法可以通过计算近似倒数来利用并行性到任何期望的程度,当将其乘以除数时,得出的结果为1000 ... xxxx的形式。当使用具有N个Leadig零的这种除数时,这很容易在每一步中计算N位结果。
超级猫

8

每个时钟周期我们可以有多个逻辑层,但是有一个限制,即我们可以拥有多少逻辑层以及这些逻辑层有多复杂取决于我们的时钟速度和我们的半导体工艺。

但是,有许多不同的乘法算法,我不知道微控制器可以使用哪种算法。

在计算机中,大多数乘法使用二进制长乘法的变体。二进制长乘法涉及

  • 将一个操作数移位各种不同的数量
  • 根据第二个操作数屏蔽移位的数字
  • 将掩蔽的结果加在一起。

因此,让我们来看看在硬件中实现这一点。

  • 换档只是我们如何接线的问题,因此它是免费提供的。
  • 掩蔽需要AND门。这意味着一层逻辑,因此从时间的角度来看它很便宜。
  • 由于需要进位链,因此添加相对昂贵。幸运的是,我们可以使用一个技巧。对于大多数加法阶段,我们可以将三个数字相加产生两个,而不是将两个数字相加产生一个。

因此,让我们估算一个16位结果的8x8乘法器需要多少逻辑级。为了简单起见,假设我们不尝试针对并非所有中间结果在所有位置上都有位的事实进行优化。

让我们假设一个完整的加法器是在两个“门级”中实现的。

  • 1个用于遮罩,以产生8个中间结果。
  • 2将三个数字相加,以将8个中间结果减少到6个
  • 2将三个数字相加,以将6个中间结果减少到4个
  • 2将三个数字相加以将4个中间结果减少到3
  • 2将三个数字相加以将3个中间结果减少为2
  • 最后32个结果相加。

因此,总共约有46个逻辑阶段。其中大部分用于最后两个中间结果的累加。

通过在最后一步中使用进位超前加法器,可以利用并非所有中间结果都存在所有位的事实(这基本上是dada乘法器的作用)来进一步改善这一点。通过将7个数字相加产生3个而不是三个以产生2个(以更多的门和更宽的门为代价减少阶段数)等。

尽管这只是所有次要细节,但重要的是,将两个n位数字相乘并产生2n位结果所需的级数与n大致成比例。


另一方面,如果看除法算法,我们发现它们都在哪里有一个迭代过程。

  1. 一次迭代完成的工作很大程度上取决于前一次迭代的结果。
  2. 实施迭代所需的逻辑阶段数大致与n成正比(减法和比较的复杂度与加法非常相似)
  3. 迭代次数也大致与n成正比。

因此,实现除法所需的逻辑级数大致与n平方成正比。


谢谢您的回答。我在Wiki上读到,在硬件上实现此算法所需的门数方面,Dadda的算法非常有效。尽管如此,大多数硬件还是使用“二进制长乘法”?
Marko Gulin

1
我看起来像是dada的算法是二进制长乘法的优化版本。
彼得·格林

我烧了8个循环以做1 / x除法。然后,我将其用于8周期乘法,固定成本为16周期。
b degnan '17

这很好地证明了乘法毕竟并不比加法差很多。
哈根·冯·埃岑

1
迭代需要减法,这可以使用O(NlgN)硬件在O(lgN)阶段完成,或使用O(N)硬件在O(sqrt(N))阶段完成。但要点是,乘法需要O(lgN)个阶段,而除法则需要O(NlgN)个阶段。不是O(N * N),而是大于乘以O(N)的倍数,除非以近似的倒数开始,以便允许每一步完成更多的工作。
超级猫

4

可以在一个时钟周期内完成除法算法(实际上是任何算法)。如果您愿意支付额外的晶体管并降低允许的时钟频率。

假设您有一组门,它们实现了现有多周期除法算法的一个时钟周期。要使算法为单周期,请使用多级硬件(类似于多周期算法的一个阶段中使用的硬件),其中一个阶段的输出将馈送到下一个阶段。

当然,不这样做的原因是它使用了很多晶体管。例如,对于16位分割,它可能会使用多出近16倍的晶体管。同时具有更多级的门会降低最大允许时钟频率(因为存在更多级的传输延迟)。


4

实用的除法算法全部基于收敛到商的数值套件。

  • 有一些加法,例如非恢复法或SRT法,其工作原理是在商中添加或删除2 ^ N,然后将2 ^ N *除数添加到部分余数,直到其收敛到零为止。

  • 有乘法方法,例如Newton-Raphson或Goldshmidth,它们是求根方法,其中除法计算为乘法的倒数。

加性方法每个周期只提供一位或几位。乘法方法将每个周期的位数加倍,但需要一些初始近似值,通常是通过常数表获得的。

“慢速”和“快速”两种面额具有误导性,因为实际速度取决于位数,功能专用的硬件数量(并且快速乘法器非常大)...

除法比乘法要慢,因为没有直接的并行方法来计算它:要么进行迭代,要么复制硬件以级联(或流水线)的块形式实现迭代。


0

为什么硬件除法要比微控制器上的乘法花费更长的时间?

这不是电子问题。充其量是一个计算机问题,可以更好地解决堆栈溢出问题。

例如,请参见此处:乘法比浮点除法快吗?

实际上,这是一个现实生活中的问题:除法为什么要花费比乘法更长的时间?

您宁愿在纸上计算哪个?

51 * 82

要么

4182 / 51

除法比乘法要花更长的时间,因为这样做比较困难

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.