pap*_*ajo 3 cpu x86 arm instruction-set cpu-architecture
我不太想知道在每个平台上开发代码时程序员习惯于什么或他觉得更容易做的事情等方面的“小字”差异。我也对详细的物理差异不感兴趣核心(我不介意提及它们,如果它适合您的叙述,我只是不想专注于上述内容)
我只是在寻找为什么像 x86 这样的 CISC 架构优于 RISC 架构,或者不是?
我的意思是,如果您可以在降低复杂性 (RISC) 的情况下做所有事情,那么为什么要成为“复杂”(CISC)
有什么是 x86 可以做而 ARM 做不到的吗?如果什么都没有,那么为什么我们(历史上)费心开发 CISC 而没有专注于 RISC?
今天,ARM 似乎可以完成英特尔计算机所做的一切,他们甚至还有面向服务器的设计……
它让我叔叔感到震惊。。
你试图重新开始一场 20 年前结束的辩论。ARM 不再是 RISC,x86 不再是 CISC。
也就是说,CISC 的原因很简单:如果您每秒可以执行 100.000 条指令,那么对于给定任务需要最少指令的 CPU 将获胜。一条复杂的指令比两条简单的指令要好。
RISC 基于这样的观察:随着 CPU 变得更快,指令之间所需的时间会有很大差异。两条简单指令实际上可能比一条复杂指令快,尤其是当您针对简单指令优化 CPU 时。
这是我为“可以制造支持多个 ISA 的处理器吗?”所写的答案的一部分。(例如:ARM + x86)(最初在该问题关闭时发布于此处,现在我已将其编辑下来以仅保留回答此问题的部分)
这并不是详尽的差异列表,只是一些关键差异,这些差异使得构建双架构 CPU 不像在通用后端设计前面放置不同的前端那么容易。(我知道这不是这个问题想要关注的方面)。
ISA 越不同,就越难。 而且管道的开销就越大,尤其是后端。
可以同时运行 ARM 和 x86 代码的 CPU 在任一方面都比仅处理一种代码的纯设计要差得多。
高效运行 32 位 ARM 需要支持完全预测执行,包括加载/存储的故障抑制。(与 AArch64 或 x86 不同,它们仅具有 ALU 选择类型指令,例如csincvs. cmov/ setcc,仅对 FLAGS 及其其他输入具有正常的数据依赖性。)
ARM 和 AArch64(尤其是 SIMD shuffle)有多个指令可产生 2 个输出,而几乎所有 x86 指令仅写入 1 个输出寄存器。因此,x86 微架构旨在跟踪读取最多 3 个输入(Haswell/Broadwell 之前为 2 个)的微指令,并且仅写入 1 个输出(或 1 个 reg + EFLAGS)。
x86 需要跟踪CISC 指令的单独组件,例如存储器源操作数的加载和ALU 微指令,或者存储器目标的加载、ALU 和存储。
x86 需要一致的指令缓存,并监听修改已获取并在管道中运行的指令的存储,或者以某种方式处理至少 x86 强大的自修改代码 ISA 保证(Observing stale instructions fetching on x86 with self-modifying code))。
x86 需要强有序的内存模型。(程序顺序+带有存储转发的存储缓冲区)。你必须将其烘焙到你的加载和存储缓冲区中,所以我预计即使在运行 ARM 代码时,这样的 CPU 基本上仍然会使用 x86 更强的内存模型。(现代英特尔 CPU 推测性地提前加载,并在错误推测时清除内存顺序机器,所以也许您可以让这种情况发生,而只是不执行那些管道核攻击。除非是由于错误预测负载是否正在重新加载而导致的情况)是否是该线程最近的存储;当然仍然必须正确处理。)
纯 ARM 可以具有更简单的加载/存储缓冲区,并且彼此之间的交互较少。stlr(除了为了制造/释放/获取更便宜的目的ldar,而不仅仅是完全停滞。)
不同的页表格式。(您可能会选择其中之一供操作系统使用,并且仅支持本机内核下的用户空间的另一个 ISA。)
如果您确实尝试完全处理来自两个 ISA 的特权/内核内容,例如,这样您就可以使用任一 ISA 的 VM 进行硬件虚拟化,那么您还可以拥有控制寄存器和调试设施等内容。
那么这是否意味着 x86 指令在执行过程中会被转换为一些奇怪的内部 RISC ISA?
是的,但是“RISC ISA”与ARM并不相似。例如,它具有 x86 的所有怪癖,例如如果移位计数为 0 shl eax, cl,则移位使 FLAGS 保持不变。(现代 Intel 通过解码为 3 uops 来处理该问题;如果后面的指令想要从转移。)
需要支持的后端怪癖的一个更好的例子可能是 x86 部分寄存器,例如写入 AL 和 AH,然后读取 EAX。后端的 RAT(寄存器分配表)必须跟踪所有这些,并发出合并微指令或如何处理它。(请参阅为什么 GCC 不使用部分寄存器?)。
另请参阅为什么 Intel 在其处理器中隐藏内部 RISC 核心?- 类似于 RISC 的 ISA 专门用于执行 x86,而不是像您为 AArch64 或 RISC-V 构建的后端那样的通用中立 RISC 管道。