我今天看到了这段摘录:
在大多数较旧的微处理器上,按位操作比添加稍快一些 减法运算通常明显快于乘法和除法 操作。在现代架构中,情况并非如此:按位操作通常是这样 与加法相同的速度(尽管仍然比乘法更快)。
我很好奇为什么按位操作比旧微处理器上的加/减操作要快一些。
我能想到的只会导致延迟的是实现加/减的电路取决于几级逻辑门(并行加法器和诸如此类的东西),而按位运算则具有更简单的电路实现。这是什么原因?
我知道算术和按位运算都在现代处理器的一个时钟周期内执行,但纯粹谈到电路的传播时间,理论上现代处理器中的延迟是否存在?
最后,我有一个关于按位移位操作执行的概念C问题:
unsigned x = 1;
x <<= 5;
unsigned y = 0;
y += 32;
x
和y
都应保留值32
,但是需要 5 单独左移以获得x
该值(如通过管道实现的按位移位)?为了澄清,我纯粹是在询问电路行为而不是时钟周期数。
答案 0 :(得分:24)
在任何二进制按位运算中,每个输出位仅取决于输入中的两个相应位。在加法运算中,每个输出位取决于输入中的相应位和右侧的所有位(朝向较低值)。
例如,最左边的位01111111 + 00000001为1,但最左边的位01111110 + 00000001为0.
在最简单的形式中,加法器将两个低位相加并产生一个输出位和一个进位。然后添加接下来的两个最低位,并添加进位,产生另一个输出位和另一个进位。这重复。因此,最高输出位是添加链的末尾。如果你像老款处理器那样一点一点地进行操作,那么到达终点需要时间。
通过将几个输入位提供给更复杂的逻辑排列,有一些方法可以加速这一过程。但这当然需要更多的芯片面积和更大的功率。
今天的处理器有许多不同的单元,用于执行各种工作负载,存储,添加,乘法,浮点运算等。鉴于今天的功能,与其他任务相比,执行添加的工作量很小,因此它适合单个处理器周期。
也许从理论上讲,您可以使处理器比添加更快地执行按位操作。 (至少在纸面上,异步处理器是异步操作的,不同的单元按照自己的步调进行工作。)然而,随着设计的使用,你需要一些常规的固定周期来协调处理器加载中的许多事情指令,将它们分派给执行单元,将执行单元的结果发送到寄存器,以及更多。一些执行单元确实需要多个周期来完成它们的工作(例如,一些浮点单元需要大约四个周期来进行浮点加法)。所以你可以混合使用。但是,使用当前的刻度,使循环时间变小以使其适合按位操作而不是添加可能不经济。
答案 1 :(得分:4)
关于添加的复杂事情(你通常会免费减去)是有麻烦的携带问题。
所以,你最终的天真解决方案是N次Full-Adders,其中N是你的ALU的多少位宽。
这些讨厌的意思是说你有很多传播延迟。并且,因为单次进位可能会导致整个结果不准确,所以最终必须等待相当长的时间才能完成所有进位值,然后将链中的所有其他全加器等待结算。
围绕这个特定的瓶颈有很多方法,但没有一种方法可以像完整加法器链那样简单或资源便宜。 (最快的是在硅片中实现的查找表)
如果您想了解更多详情,可能需要在http://electronics.stackexchange.com上提出
答案 2 :(得分:2)
要回答你的上一个问题,这取决于。有些架构只有1的移位(例如z80),有些架构通过较大的常量和/或变量来显示移位,但在内部实现它们是一堆“移1”(例如旧的) x86的实现,有些架构可以在一个周期内移位超过1,但只有在移位量是常量的情况下,才有一些架构(例如x86的现代实现)使用barrel shifter并且可以在一个循环中按变量移动,并且还有更多的可能性。
桶形移位器的电路深度在它可以做的最大移位中是对数的,这不一定是寄存器的宽度 - 它有时比宽度小一个,并且可以想象它甚至更小。
答案 3 :(得分:0)
一些额外的实现必须为进位执行额外的循环。例如:16位整数需要8位处理器上的多条指令。这也适用于转变。但是移位总是可以将高度位移到下一个字节的低位。添加必须在另一轮中添加较低位。
答案 4 :(得分:-1)
按位运算符可以在更短的时间内执行,因为
这就是移位比其他算术运算快的原因
答案 5 :(得分:-2)
这是我从一个介绍到集会课的光芒。但是,移位只是处理器可以执行的最快指令。添加和减去需要执行一些指令。我认为现代处理器的优化程度更高。
据推测,有人可以更准确,更彻底地回答这个问题。