为什么CISC处理器更难进行流水线操作?在哪些方面,一些指令比其他指令“更复杂”?

14
根据Miles Murdoca和Vincent Heuring的《计算机体系结构与组织》所述,CISC指令不太适合流水线式架构。为了使流水线工作得更有效,每条指令都需要与其他指令相似,至少在相对指令复杂度方面相似。
为什么会这样?指令复杂度是什么意思;难道不是所有指令都需要一个时钟周期才能开始执行吗?如果指令正在读取或写入内存,则需要更长时间,但是RISC处理器也会读取或写入内存(当然)?

了解书籍作者的意图最好的方法是直接询问他们。关于您问题的其他部分,在现代处理器上,简单指令(ADD/SUB/MOV、逻辑指令、移位)通常在1个周期内执行,整数乘法需要3-4个周期,浮点乘法需要3-6个周期,浮点加法需要2-5个周期。 - Marat Dukhan
@MaratDukhan 但是什么是循环?即使是谷歌搜索也说它是最基本的时间单位或完成一条指令所需的时间量,这给出了一个循环定义。 - Celeritas
1
每分钟生产一个小部件的装配线并不意味着每个小部件的生产时间都是一分钟,它可能需要数小时或数天才能完成。然而,该生产线上的每个小部件变化很少,因此装配线可以平稳地运转,每分钟不停歇。现代计算机或旧计算机的指令显然需要多个时钟周期才能完成。它们努力实现每个时钟周期完成一个或多个指令的平均值,然后出现停顿,再次尝试。 - old_timer
他们的声明包含了你问题的答案。每个指令都需要与其他指令相似。你希望这些指令通过相同的装配线/管道,它们需要按照相似的步骤以相同的顺序进行分解。CISC传统上不这样做,而RISC传统上则是这样做的。 - old_timer
编写一个指令集模拟器,例如PDP11指令集,不需要完成,只需开始。然后再为旧的PIC芯片编写一个模拟器,如PIC12或14,这应该只需要半小时到一小时的时间来完成和调试。比较完全解析和执行每个指令所需的复杂性,如定义为指令。即使您只对每个指令集进行足够的操作以添加、比较和分支(如果不相等),也足以执行一段时间的循环。这样就可以解释他们在谈论什么了。 - old_timer
2个回答

15

指令的“复杂性”与其大小和格式的变化程度有关。例如,x86 IA32(Intel 32位)架构是CISC。指令的大小可以从1到15个字节不等,它们的格式也有很大差异(格式指的是每个字段使用多少位、这些位的位置等等)。

这意味着你只有在开始解码指令时才知道何时完成指令获取。有些指令只需要一个周期就能获取,而另一些指令需要更多时间,这会使流水线过程变得复杂。

另一方面,所有ARM指令(RISC架构)都恰好有4个字节。因此,一旦您获取了4个字节,就知道可以将这些字节发送到流水线的解码阶段,并且可以立即开始获取下一条指令。


可变长度编码是复杂性的一个来源,但绝不是唯一的。内存源或特别是内存-目的地(RMW)ALU指令是操作的依赖链。RISC机器总是加载存储器机器有其原因。 - Peter Cordes
现代的x86 CPU可以并行地获取16或32字节的数据块并进行解码;只是为了找到指令边界,需要更多的晶体管/功率。除非你有一个L1i缓存未命中,否则没有指令需要超过2个周期来获取(如果它跨越16字节边界),并且前端是流水线式的(在新的CPU中,在阶段之间有缓冲区来隐藏气泡)。请参见https://www.realworldtech.com/sandy-bridge/4/,了解英特尔Sandybridge的前端获取/解码阶段。是的,这比在RISC上要复杂/昂贵得多,这是超标量x86 CPU必须支付的x86“税” 的一部分。 - Peter Cordes
1
@PeterCordes - 是的,我认为OP的引用实际上根本没有谈论解码复杂性,而是指指令应该具有短小的固定延迟时间,以便干净地适应例如5级流水线模型,在该模型中,每个指令在固定阶段写回其结果,并且还具有少量的固定输入等。 - BeeOnRope

4
这意味着在CISC架构中,指令通常比RISC长。因此,调度更加棘手。在CISC中,通常有简单指令和更复杂的指令混合在一起,后者需要更长时间。因此,在流水线中会出现所谓的“危险”,这可能会对平稳流水线造成问题。例如,x86浮点指令会比x86加载或存储指令更长。

所以你的意思是,使用CISC会有更多的流水线风险? - Celeritas
是的,指令集越规律或相似,调度就越容易。指令不仅在长度上有所不同,而且在复杂性上也有所不同。 - BillH
请查看维基百科上的指令调度。 - BillH
1
FPU指令是一个糟糕的例子,因为RISC CPU也有同样的问题:FP乘法的延迟比整数加法长。除非你在谈论x87指令,例如fsinfyl2x,它们在内部被微编码为许多简单操作,包括可能的查找表,并且需要100个周期以上,而fmul则需要3到5个周期(完全流水线化)。 (https://agner.org/optimize/提供了有关CPU的数字,包括顺序流水线化的P5 Pentium,该CPU在不将大多数复杂指令解码为多个uop的情况下进行流水线化) - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接