首页 文章

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

提问于
浏览
78

从Pentium Pro(P6微体系结构)开始,英特尔重新设计了它的微处理器,并在旧的CISC指令下使用了内部RISC内核 . 由于Pentium Pro所有CISC指令都分为较小的部分(uops),然后由RISC内核执行 .

一开始我很清楚英特尔决定隐藏新的内部架构并强迫程序员使用“CISC shell” . 由于这一决定,英特尔可以在不破坏兼容性的情况下完全重新设计微处理器架构,这是合理的 .

但是我不明白一件事,为什么英特尔仍然保留了这么多年隐藏的内部RISC指令集?为什么他们不让程序员使用RISC指令,比如使用旧的x86 CISC指令集?

如果英特尔长期保持向后兼容性(我们仍然在64位模式旁边有虚拟8086模式),为什么它们不允许我们编译程序以便它们绕过CISC指令并直接使用RISC核心?这将开启自然的方式来缓慢放弃x86指令集,现在已弃用(这是英特尔决定在内部使用RISC核心的主要原因,对吧?) .

看看新的英特尔'酷睿i'系列,我看到,他们只扩展了CISC指令集,增加了AVX,SSE4等 .

6 回答

  • 81

    答案很简单 . 英特尔没有开发 developers 的CPU!他们正在为做出决定的人们开发它们,而BTW就是世界上每家公司所做的决定!

    英特尔很久以前做出了承诺,(当然,在合理范围内),他们的CPU将保持向后兼容 . 人们想要知道,当他们购买新的基于英特尔的计算机时,他们当前软件的运行方式与旧计算机上运行的完全相同 . (虽然,希望更快!)

    此外,英特尔确切地知道这一承诺的重要性,因为他们曾试图采用不同的方式 . 究竟有多少人知道Itanium CPU?!?

    您可能不喜欢它,但是,与x86保持一致的决定是英特尔成为世界上最知名的商业名称之一!

  • 14

    jalf的答案涵盖了大多数原因,但有一个有趣的细节没有提到:内部RISC类核心不是为了运行ARM / PPC / MIPS之类的指令集而设计的 . x86税不仅在耗电的解码器中支付,而且在整个核心中都有一定程度的支付 . 即它不仅仅是x86指令编码;它是每个带有奇怪语义的指令 .

    让我们假设英特尔确实创建了一种操作模式,其中指令流不是x86,其指令更直接映射到uop . 让我们假设每个CPU模型都有自己的ISA用于这种模式,因此他们仍然可以随意更改内部结构,并用最少量的晶体管暴露它们,以便对这种替代格式进行指令解码 .

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


    如果我们只有备用解码器而不改变以后的流水线阶段(执行单元), this ISA would still have many x86 eccentricities. 它将不是一个非常好的RISC架构 . 没有单一的指令会非常复杂,但x86的其他一些疯狂仍然存在 .

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

    如果您要为RISC ISA创建一个全新的解码器,您可以选择部分x86指令作为RISC指令公开 . 这有点减轻了核心的x86专业化 .


    指令编码可能不是固定大小的,因为单个uop可以容纳大量数据 . 如果所有insn都是相同的大小,那么更多的数据是有意义的 . 单个微融合uop可以添加一个32位立即数和一个内存操作数,该操作数使用具有2个寄存器和32位移位的寻址模式 . (在SnB及更高版本中,只有单寄存器寻址模式可以与ALU操作微熔合) .

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


    TL;DR summary:

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

  • 4

    不,x86指令集肯定不会被弃用 . 它一如既往地受欢迎 . 英特尔在内部使用一组类似RISC的微指令的原因是因为它们可以更有效地处理 .

    所以x86 CPU的工作原理是在前端有一个非常重的解码器,它接受x86指令,并将它们转换为后端可以处理的优化内部格式 .

    至于将此格式暴露给“外部”程序,有两点:

    • 它不是一个稳定的格式 . 英特尔可以在CPU型号之间进行更改,以最适合特定的架构 . 这使他们能够最大限度地提高效率,如果他们不得不采用固定,稳定的指令格式供内部使用和外部使用,这种优势就会丧失 .

    • 那里有巨大的,复杂的CPU 's, the decoder is a relatively small part of the CPU. Having to decode x86 instructions makes that more complex, but the rest of the CPU is unaffected, so overall, there'只是很少获得,特别是因为x86前端仍然必须存在,以便执行"legacy"代码 . 因此,您甚至不会保存当前在x86前端使用的晶体管 .

    这不是设计CPU以支持两个完全不同的指令集的更好选择 . (在这种情况下,他们可能最终会发明内部使用的第三组微操作,因为这些微操作可以自由调整以最适合CPU的内部架构)

  • 2

    如果英特尔长期保持向后兼容性(我们仍然在64位模式旁边有虚拟8086模式),为什么它们不允许我们编译程序以便它们绕过CISC指令并直接使用RISC核心?这将开启自然的方式来缓慢放弃x86指令集,现在已弃用(这是英特尔决定在内部使用RISC核心的主要原因,对吧?) .

    你需要看看这个的商业角度 . 英特尔实际上试图摆脱x86,但它是为公司带来金蛋的鹅 . XScale和Itanium从未达到其核心x86业务所取得的成功水平 .

    你基本上要问的是,英特尔要削减手腕以换取开发人员的温暖模糊 . 破坏x86不符合他们的利益 . 任何使更多开发人员不必选择目标x86的东西都会破坏x86 . 反过来,这会破坏他们 .

  • 15

    真正的答案很简单 .

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

    如果你的CPU以与内存相同的速度运行,或者至少如果它们以相当类似的速度运行,那么这种副作用并不意味着什么 .

    目前,与CPU速度相比的内存速度显示出时钟的巨大差异 . 当前CPU有时比主存储器快五倍或更多 .

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

    您可以争辩说缓存可以加速RISC CPU . 但关于CISC cpus也是如此 .

    通过使用CISC和缓存而不是RISC和缓存,您可以获得更大的速度提升,因为相同大小的缓存对CISC提供的高密度代码具有更大的影响 .

    另一个副作用是RISC在编译器实现上更难 . 它更容易优化CISC cpu的编译器 . 等等

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

    这是如此真实,以至于ARM具有更高的代码密度模式,称为Thumb .

  • -3

    为什么它们不允许我们编译程序以便它们绕过CISC指令并直接使用RISC核心?

    除了之前的答案,另一个原因是市场细分 . 一些指令被认为是在微代码而不是硬件中实现的,因此允许任何人执行任意微操作都会破坏新cpu的销售,使用“新的”更高性能的CISC指令 .

相关问题