ARM vs x86有哪些主要区别?

时间:2017-05-30 18:54:29

标签: x86 cpu cpu-architecture risc

我不太了解"小字体"根据程序员习惯使用的内容或者他发现更容易做的事情,在每个平台上开发代码时的差异等。我对核心中的详细物理差异感兴趣(如果它适合你,我不介意提及它们叙述我只是不想关注上面的内容)

我只是在寻找为什么像x86这样的CISC架构优于RISC架构或者不是这样?

我的意思是为什么要成为"复杂" (CISC)如果你可以做到一切,同时降低复杂性(RISC)

有没有x86可以做到的ARM不能做的事情?如果没有什么,那么为什么我们在(历史上)开发CISC并且没有关注RISC?

今天ARM似乎做了英特尔计算机所做的一切,甚至还有面向服务器的设计......

这让我的叔叔大吃一惊......

2 个答案:

答案 0 :(得分:2)

你正试图重新开始一场20年前结束的辩论。 ARM不再是RISC,x86不再是CISC。

也就是说,CISC的原因很简单:如果你每秒可以执行100.000条指令,那么对于给定任务需要最少指令的CPU就会获胜。一条复杂的指令优于2条简单的指令。

RISC基于以下观察:随着CPU变得更快,所需的时间在指令之间会有很大差异。实际上,两个简单指令可能比一个复杂指令更快,特别是当您针对简单指令优化CPU时。

答案 1 :(得分:2)

这是我为Could a processor be made that supports multiple ISAs? (ex: ARM + x86)写的答案的一部分(原本是在关闭时发布在这里的,现在我已对其进行了编辑,以保留回答该问题的部分)

这不是详尽的差异列表,只是一些关键差异,这些差异使构建双架构CPU的难度不像在通用后端设计之前打入另一个前端那样容易。 (我知道这不是该问题要关注的方面。


ISA越不同,难度就越大。 这将增加管道中的开销,尤其是后端。

一个可以同时运行ARM和x86代码的CPU会比只处理一个代码的纯设计差得多。

  • 有效运行的32位ARM需要支持完全确定的执行,包括对装入/存储的故障抑制。 (与AArch64或x86不同,后者仅具有ALU选择类型的指令,例如csinccmov / setcc,它们仅对FLAGS及其其他输入具有正常的数据依赖性。)

  • ARM和AArch64(尤其是SIMD改组)具有多个产生2个输出的指令,而几乎所有x86指令仅写入一个输出寄存器。因此,建立了x86微体系结构来跟踪可读取最多3个输入(在Haswell / Broadwell之前2个)并且仅写入1个输出(或1 reg + EFLAGS)的uops。

  • x86需要跟踪CISC指令的各个组成部分,例如内存源操作数的负载和ALU运算符,或内存目标的负载,ALU和存储。

  • x86需要一致的指令高速缓存,并监听用于修改已经获取并在管道中运行的指令的存储,或者以某种方式至少处理x86强大的自修改代码ISA保证(Observing stale instruction fetching on x86 with self-modifying code)。

  • x86需要一个strongly-ordered memory model 。 (程序顺序+具有存储转发功能的存储缓冲区)。您必须将其放入加载和存储缓冲区中,因此我希望即使在运行ARM代码时,这样的CPU基本上仍将使用x86强大得多的内存模型。 (现代Intel CPU推测性地提早加载,并在错误推测的情况下清除了内存订购机器,因此也许您可以让这种情况发生,而进行这些流水线操作。除非是由于错误而造成的。 -预测加载是否正在通过此线程重新加载最近的存储;当然仍然必须正确处理该加载。)

    一个纯ARM可以具有较简单的加载/存储缓冲区,它们之间的交互作用不大。 (除了为了使stlr / ldar发行/获得便宜而不仅仅是完全停滞的目的。)

  • 不同的页表格式。 (您可能会选择一个或另一个供操作系统使用,并且仅在本机内核下为用户空间支持另一个ISA。)

  • 如果您 did 尝试完全处理两个ISA中的特权/内核内容,例如因此,您可以使用任一ISA的VM进行硬件虚拟化,并且还拥有诸如控制注册和调试功能之类的东西。

那么这是否意味着x86指令在执行过程中会转换为某些奇怪的内部RISC ISA?

是的,但是“ RISC ISA”与ARM不同。例如它具有x86的所有特性,例如,如果移位计数为0,则移位使FLAGS保持不变。(现代Intel通过将shl eax, cl解码为3 oups来处理该问题;如果后面的指令想要从班次中读取标志。)

可能需要一个更好的后端怪异示例,例如x86部分寄存器,例如写入AL和AH,然后读取EAX。后端的RAT(寄存器分配表)必须跟踪所有这些,并发出合并uops或由它处理。 (请参见Why doesn't GCC use partial registers?)。

另请参阅Why does Intel hide internal RISC core in their processors?-类似RISC的ISA专用于执行x86,而不是像您将其作为AArch64或RISC-V的后端那样构建的通用中立RISC管道。