我想知道比较两个整数需要多少个机器周期,如果我添加了多少机器周期,哪个更容易?
基本上我想看哪一个一般更贵? 另外,我需要c,c ++,java perspective ......的答案。
非常感谢帮助!!
答案 0 :(得分:3)
答案是肯定的。和不。也许吧。
有些机器可以在周期之间的空闲时间内比较两个值,而其他值则需要几个周期。在旧的PDP8上,您首先必须取消一个操作数,进行添加,然后测试结果以进行比较。
但是其他机器可以比添加更快,因为不需要修改寄存器。
但是在其他机器上,操作需要相同的时间,但是比较的结果需要几个周期才能到达可以测试它的地方,所以,如果你可以使用这些循环,那么比较几乎是如果你没有其他操作可以进入这些周期,那么免费,但相当昂贵。
答案 1 :(得分:2)
通过减法进行比较,这与加法几乎相同,只是进位和减数是互补的,因此a - b - c
变为a + ~b + ~c
。这已在CPU中占用,并且基本上花费相同的时间量。
答案 2 :(得分:2)
简单的答案是一个循环,两个操作同样容易。
很难给出完全通用的答案,因为当您深入了解细节时,处理器架构非常复杂。
所有现代处理器都是流水线的。也就是说,没有指令操作数在循环c中进入,并且结果在循环c + 1上可用。相反,该指令分为多个步骤。
指令被读入处理器的前端,处理器对指令进行解码。这可能包括将其分解为多个微操作。然后将操作数读入寄存器,然后执行单元处理实际操作。最终答案将返回到注册表中。
指令在每个循环中经历一个流水线阶段,而现代CPU具有10-20个流水线阶段。因此,添加或比较两个数字可能需要多达20个处理器周期。但是,一旦一条指令通过管道的一个阶段,就可以将另一条指令读入该阶段。理想情况是每个时钟周期,一条指令进入前端,而一组结果出现在另一条时钟。
让所有这些工作变得复杂有很大的复杂性。如果你想做+ b + c,你需要先添加+ b才能添加c。因此,处理器前端的许多工作都涉及调度。现代处理器采用无序执行,因此处理器将检查传入的指令,并重新排序它们使得它执行a + b,然后继续执行其他一些工作,然后在结果时执行结果+ c是可用的。
这一切都让我们回到原来的问题更容易。因为通常情况下,如果您要比较两个整数,那就是决定下一步该做什么。这意味着在获得最后一条指令的结果之前,您不会知道下一条指令。由于指令是流水线的,这意味着如果等待,您可能会丢失20个时钟周期。
因此,现代CPU有一个分支预测器,可以猜测结果是什么,并继续执行指令。如果它猜错了,必须抛出管道,并在另一个分支上重新开始工作。分支预测器有很大帮助,但是,如果比较是代码中的决策点,那么CPU处理的难度要大于添加。