ARM与x86的主要区别是什么?

ARM与x86的主要区别是什么?,x86,arm,cpu,cpu-architecture,instruction-set,X86,Arm,Cpu,Cpu Architecture,Instruction Set,我不太想知道在每个平台上开发代码时的“小字”差异,即程序员习惯于做什么或他觉得更容易做什么等。我也不想知道核心中的详细物理差异(如果符合你的叙述,我不介意提及这些内容,我只是不想把重点放在上面) 我只是在寻找为什么像x86这样的CISC体系结构优于RISC体系结构 我的意思是,如果你能在降低复杂性(RISC)的同时把每件事都做好,为什么要变得“复杂”(CISC) 有什么事情是x86可以做到而ARM不能做到的吗?如果没有,那么为什么我们(历史上)费心开发CISC而不关注RISC呢 今天,ARM似乎

我不太想知道在每个平台上开发代码时的“小字”差异,即程序员习惯于做什么或他觉得更容易做什么等。我也不想知道核心中的详细物理差异(如果符合你的叙述,我不介意提及这些内容,我只是不想把重点放在上面)

我只是在寻找为什么像x86这样的CISC体系结构优于RISC体系结构

我的意思是,如果你能在降低复杂性(RISC)的同时把每件事都做好,为什么要变得“复杂”(CISC)

有什么事情是x86可以做到而ARM不能做到的吗?如果没有,那么为什么我们(历史上)费心开发CISC而不关注RISC呢

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


这让我叔叔大吃一惊。

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

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


RISC是基于这样一种观察:随着CPU速度的提高,指令之间所需的时间会有很大的差异。两条简单指令实际上可能比一条复杂指令快,特别是当您为简单指令优化CPU时。

这是我为之写的答案的一部分(最初在关闭时发布在这里,现在我将其编辑下来,只保留回答此问题的部分)

这并不是一个详尽的差异列表,只是一些关键的差异,使得构建一个双拱形CPU不像在一个普通的后端设计前面安装一个不同的前端那么容易。(我知道这不是这个问题想要关注的方面)


ISA的差异越大,其难度就越大。而且它在管道中的开销就越大,尤其是后端。

可以同时运行ARM和x86代码的CPU在任何一个方面都比只处理一个代码的纯设计糟糕得多

  • 高效运行32位ARM需要支持完全谓词执行,包括加载/存储的故障抑制。(与AArch64或x86不同,AArch64或x86仅具有ALU select类型指令,如
    csinc
    vs.
    cmov
    /
    setcc
    ,它们仅对标志及其其他输入具有正常的数据依赖性。)

  • ARM和AArch64(尤其是SIMD shuffles)有多条指令产生2个输出,而几乎所有x86指令只写入一个输出寄存器。因此,x86微体系结构被构建为跟踪最多读取3个输入(Haswell/Broadwell之前的2个)且仅写入1个输出(或1个reg+EFLAGS)的UOP

  • x86要求跟踪CISC指令的独立组件,例如内存源操作数的加载和ALU UOP,或内存目标的加载、ALU和存储

  • x86需要一致的指令缓存,并对修改已获取并在管道中传输的指令的存储进行窥探,或者以某种方式至少处理x86的强自修改代码()

  • x86需要一个(程序顺序+带存储转发的存储缓冲区)。您必须将其放入加载和存储缓冲区中,因此我预计即使在运行ARM代码时,这样的CPU基本上仍将使用x86强大得多的内存模型。(现代Intel CPU会推测性地提前加载,并在错误推测时清除内存订单机,因此,也许您可以让这种情况发生,而不执行那些管道核弹。除非是由于错误预测加载是否由该线程重新加载最近的存储;当然,这仍然需要正确处理。)

    一个纯ARM可以有更简单的加载/存储缓冲区,它们之间不会有太多的交互(除了使
    stlr
    /
    ldar
    release/acquire更便宜,而不仅仅是完全暂停的目的)

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

  • 如果您确实尝试完全处理来自两个ISA的特权/内核内容,例如,您可以使用任一ISA的虚拟机进行硬件虚拟化,那么您还可以使用控制寄存器和调试工具

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

是的,但“RISC ISA”与ARM不同。例如,它具有x86的所有特性,比如移位计数为0时保留未修改的标志(现代Intel通过将
shl eax,cl
解码为3 UOP来处理此问题;如果后面的指令想从移位读取标志,Nehalem和更早的版本会暂停前端)

可能需要支持的后端怪癖的一个更好的例子是x86部分寄存器,如写入AL和AH,然后读取EAX。后端中的RAT(寄存器分配表)必须跟踪所有这些,并发出合并UOP或以任何方式处理(请参阅)


另请参阅-类似RISC的ISA专门用于执行x86,而不是像您作为AARC64或RISC-V的后端构建的通用中性RISC管道。

它只是两条平行的进化轨迹。与黑猩猩和倭黑猩猩一样,RISC和CISC在许多方面相似,但在其他方面不同。RISC可以追溯到RAM相当于b的时代它比CPU快。那时,处理器可以轻松地用4个时钟周期执行一条指令。因此,重新设计指令集并简化处理器逻辑以使速度匹配是有意义的