为什么英特尔将内部RISC内核隐藏在其处理器中?

从Pentium Pro(P6微架构)开始,Intel重新devise了微处理器,并在旧的CISC指令下使用了内部RISC内核。 由于Pentium Pro的所有CISC指令被分成较小的部分(uops),然后由RISC内核执行。

在开始的时候,我很清楚Intel决定隐藏新的内部架构,并迫使程序员使用“CISC shell”。 由于这个决定,英特尔可以完全重新devise微处理器架构,而不会破坏兼容性,这是合理的。

不过我不明白一件事,为什么Intel这么多年来还隐藏着一套内部RISC指令? 为什么他们不让程序员像使用旧的x86 CISC指令集一样使用RISC指令?

如果英特尔长期保持向后兼容性(我们在64位模式旁仍然有虚拟8086模式),为什么不让我们编译程序,以便它们能够绕过CISC指令并直接使用RISC内核? 这会慢慢地放弃x86指令集的自然方式,现在已经废弃了(这是英特尔决定使用RISC内核的主要原因吧?)。

看看我看到的新的Intel Core i系列,他们只扩展了CISC指令集,添加了AVX,SSE4等等。

不,x86指令集当然不会被弃用。 它像以往一样受欢迎。 英特尔在内部使用一套类似RISC的微指令的原因是因为它们可以更有效地处理。

因此,x86 CPU的工作原理是在前端安装一个相当繁重的解码器,它接受x86指令,并将其转换为后端可以处理的优化的内部格式。

至于把这种格式暴露给“外部”节目,有两点:

  • 这不是一个稳定的格式。 英特尔可以在CPU模型之间进行更改以最好地适应特定的架构。 这使他们能够最大限度地提高效率,如果他们不得不以固定的,稳定的内部使用和外部使用的指令格式来解决这个问题,那么这种优势就会丧失。
  • 这样做没有什么可以获得的。 在今天庞大而复杂的CPU中,解码器只占CPU的一小部分。 不得不解码x86指令使得它更加复杂,但是CPU的其余部分却不受影响,总的来说,只有很less的收获,特别是因为x86前端仍然必须在那里,才能执行“遗留”代码。 所以你甚至不会保存x86前端当前使用的晶体pipe。

这不是一个完美的安排,但成本相当小,比deviseCPU支持两个完全不同的指令集要好得多。 (在这种情况下,他们最终可能会发明第三套内部使用的微型处理器,只是因为可以自由调整以适应CPU的内部架构)

如果英特尔长期保持向后兼容性(我们在64位模式旁边仍然有虚拟8086模式),为什么不让我们编译程序,以便它们能够绕过CISC指令并直接使用RISC内核? 这会慢慢地放弃x86指令集的自然方式,现在已经废弃了(这是英特尔决定使用RISC内核的主要原因吧?)。

你需要看看这个业务的angular度。 英特尔实际上已经试图摆脱x86,但是它为公司带来了金蛋。 XScale和Itanium甚至都没有达到他们的核心x86业务的成功水平。

你基本上要求的是英特尔削减手腕,换取开发商的热情。 破坏x86不符合他们的利益。 任何让更多的开发人员不必selectx86目标的做法就会破坏x86。 这反过来又破坏了他们。

真正的答案很简单。

实施RISC处理器的主要因素是降低复杂性并提高速度。 RISC的缺点是指令密度降低,这意味着以RISC格式表示的相同代码需要比等效的CISC代码更多的指令。

如果CPU的运行速度与内存相同,或者至less它们的运行速度相当相似,则这种副作用并不意味着太多。

目前内存的速度与CPU的速度相比,在时钟上performance出很大的差异。 目前的CPU有时比主内存快5倍或更多。

这种技术的状态有利于更密集的代码,这是CISC提供的。

你可以争辩说caching可以加速RISC CPU。 但是CISC cpus也可以这么说。

通过使用CISC和高速caching(比RISC和高速caching)可以获得更大的速度提升,因为相同大小的高速caching对CISC提供的高密度代码有更多的影响。

另一个副作用是RISC在编译器实现上更难。 更容易为CISC cpus优化编译器。 等等

英特尔知道他们在做什么。

这是真的,ARM具有更高的代码密度模式称为拇指。

答案很简单。 英特尔没有为开发人员开发CPU! 他们正在为做出购买决定的人开发他们,这是世界上每个公司都做的!

英特尔很早就做出了这样的承诺,(理所当然),他们的CPU将保持向后兼容。 人们希望知道,当他们购买一台新的基于英特尔的计算机时,他们现有的所有软件的运行方式与旧计算机上的完全一样。 (尽pipe希望更快!)

此外,英特尔知道这个承诺是多么重要,因为他们曾经试图以不同的方式。 安腾CPU究竟有多less人知道?

你可能不喜欢它,但是,一个决定,留在x86,是什么使英特尔成为世界上最知名的商业名称之一!

jalf的答案涵盖了大部分原因,但是有一个有趣的细节没有提到:内部类似RISC的内核并不是用来运行类似ARM / PPC / MIPS的指令集。 x86税收不仅在耗电的解码器中付费,而且在一定程度上贯穿整个核心。 即它不只是x86指令编码; 这是每个具有奇怪语义的指令。

让我们假装英特尔创build了一个操作模式,指令stream是x86以外的指令,指令更直接映射到uops。 我们假设每个CPU模型都有自己的ISA模式,所以当他们喜欢的时候,他们仍然可以自由地改变内部结构,并且用最less量的晶体pipe对这个替代格式进行指令解码。

据推测,你仍然只有相同数量的寄存器,映射到x86架构状态,所以x86操作系统可以在上下文切换时保存/恢复它,而无需使用特定于CPU的指令集。 这可能不是太难,因为注册重命名硬件已经存在。 (内部uops实际上是参考物理寄存器文件,但是我们假设的RISC ISA不必)。


如果我们只有替代解码器而不改变后面的stream水线阶段(执行单元), 这个ISA仍然会有许多x86偏心。 这不会是一个非常好的RISC架构。 没有单一的指令会非常复杂,但x86的其他一些疯狂的东西仍然存在。

例如:左/右移保留溢出标志未定义,除非移位计数为1,在这种情况下OF =通常的有符号溢出检测。 类似的旋转疯狂。 但是,暴露的RISC指令可以提供无标志转换等(允许使用通常进入一些复杂的x86指令的多个uop中的一个或两个)。 所以这并不是真正的主要反驳。

如果你打算为RISC ISA制作一个全新的解码器,你可以select一部分x86指令作为RISC指令。 这在一定程度上缓解了内核的x86专业化。


指令编码可能不是固定大小的,因为单个的uops可以保存大量的数据。 如果所有的胰岛素都是相同的大小,那么更多的数据比有意义。 一个微型熔断器可以添加一个32位立即数和一个使用2个寄存器和32位移位的寻址模式的存储器操作数。 (在SnB和更高版本中,只有单寄存器寻址模式可以与ALU操作进行微型熔断)。

uops非常大,与固定宽度的ARM指令不太相似。 一个固定宽度的32位指令集一次只能装载16位立即数,所以装载一个32位地址需要一个负载立即的低半/负载高立即对。 x86不需要这样做,只有15个GP寄存器限制了在寄存器中保持常量的能力,这并不是很糟糕。 (对15个寄存器有很大的帮助,但是再加倍到31个寄存器的帮助减less了很多,我想一些仿真发现,RSP通常不是通用的,所以更像是15个GP寄存器和一个堆栈。


TL; DR总结:

无论如何,这个答案归结为“x86指令集可能是编程必须能够快速运行x86指令的CPU的最佳方式”,但是希望能够说明原因。

为什么他们不让我们编译程序,这样他们就会绕过CISC指令直接使用RISC内核?

除了以前的答案,另一个原因是市场细分。 有些指令被认为是以微代码而不是硬件来实现的,所以任何人都可以执行任意的微操作,这样就可以用新的更高性能的CISC指令来破坏新CPU的销售。