【问题标题】:Could a processor be made that supports multiple ISAs? (ex: ARM + x86)是否可以制造支持多个 ISA 的处理器? (例如:ARM + x86)
【发布时间】:2020-12-05 23:51:34
【问题描述】:

自 Skylake(?) 架构以来,英特尔一直在内部将 CISC 指令解码为 RISC 指令,而 AMD 自 K5 处理器以来一直在这样做。那么这是否意味着 x86 指令在执行过程中被翻译成一些奇怪的内部 RISC ISA?如果这是正在发生的事情,那么我想知道是否有可能创建一个能够理解(即内部转换为自己的专有指令)x86 和 ARM 指令的处理器。如果可以的话,性能会是怎样的?为什么还没有完成?

【问题讨论】:

  • 从技术上讲,你可以。今天在内部使用 RISC 是没有意义的,但更多的是 VLIW。我认为这就是 transmeta 所做的,暗示您可以直接执行 x86 或实际指令集,但我没有研究得那么好,他们不直接支持 VLIW 对我来说没有意义。 ARM 是 RISC,即使转换为 VLIW 或微引擎也会对性能造成影响。这样的产品没有任何价值,而且合法性和版税也很粗糙。
  • 您可以从历史上看到 x86 克隆和 arm 克隆发生了什么,因此尽管该产品没有任何价值,但您一开始就无法生产它,更不用说富有成效的。只需购买一个 arm 或 risc-v 内核,就可以完成芯片的这一部分。
  • 是的微编码,这在 CISC 中并不少见,这意味着运行时指令将被转换为指令列表,如果您愿意,然后执行,与其说是模拟,不如说是查找命令表.
  • 还要理解处理器不仅仅是指令,其中有很多保护和其他逻辑,从一种架构到另一种架构不兼容,因此您必须以某种形式拥有该逻辑,所以你最终会得到这么大的东西,即使你可以批量生产,它的成本也会比英特尔芯片还高比手臂。前期成本更高,而不是更快,电力成本更高....
  • 一些 VIA CPU expose their internal RISC instructions x86 指令将被转换成,因此在某种意义上它们也支持 2 种不同的 ISA。一些早期的 Itanium CPU 还具有运行 x86 代码的硬件支持

标签: x86 arm hardware cpu-architecture processor


【解决方案1】:

ISA 越不同,难度就越大。 而且开销越大,尤其是后端。这并不像将不同的前端添加到常见的后端微架构设计上那么容易。

如果它只是不同解码器的裸片面积成本,而不是其他功率或性能差异,那么如今这将是微不足道的,并且完全可行,因为晶体管预算很大。 (在芯片的关键部分占用空间,将重要的东西放在更远的地方仍然是一个成本,但这不太可能成为前端的问题)。时钟甚至电源门控可以完全关闭任何未使用的解码器。但正如我所说,它没有那么简单,因为后端必须设计为支持 ISA 的指令和其他规则/功能; CPU 不会解码为完全通用/中性的 RISC 后端。相关:Why does Intel hide internal RISC core in their processors? 对现代英特尔设计中类似 RISC 的内部微指令有一些想法和信息。

例如,向 Skylake 添加 ARM 支持功能会使其在运行纯 x86 代码时变得更慢且能效更低,并且会占用更多的芯片面积。这在商业上不值得,因为它的市场有限,并且需要特殊的操作系统或管理程序软件才能利用它。 (尽管这可能会随着 AArch64 变得更加相关而开始改变,这要感谢 Apple。)

一个可以同时运行 ARM 和 x86 代码的 CPU 在其中任何一个上都比只处理一个的纯设计要差得多。

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

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

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

  • x86 需要一致的指令高速缓存,并侦听修改已获取并在流水线中运行的指令的存储,或者以某种方式处理至少 x86 强大的自修改代码 ISA 保证(@ 987654322@).

  • x86 需要strongly-ordered memory model。 (程序顺序+带有存储转发的存储缓冲区)。您必须将其烘焙到您的加载和存储缓冲区中,所以我希望即使在运行 ARM 代码时,这样的 CPU 基本上仍会使用 x86 更强大的内存模型。 (现代 Intel CPU 推测性地提前加载并在错误推测时执行内存订单机器清除,所以也许您可以让这种情况发生并且简单地执行那些管道核弹。除非是由于错误- 预测负载是否正在通过此线程重新加载最近的存储;当然仍然必须正确处理。)

    纯 ARM 可以有更简单的加载/存储缓冲区,它们之间的交互不那么频繁。 (除了使stlr / ldapr / ldar release / acquire / acquire-seq-cst 更便宜,而不仅仅是完全停止。)

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

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

更新:Apple M1确实支持强大的 x86 风格的 TSO 内存模型,allowing efficient+correct 将 x86-64 机器码二进制翻译成 AArch64 机器码,无需每次加载和存储都使用ldapr / stlr。它还有一个运行原生 AArch64 代码的弱模式,toggleable by the kernel

在 Apple 的 Rosetta 二进制翻译中,软件处理了我提到的所有其他问题; CPU 只是在执行本机 AArch64 机器代码。 (而且 Rosetta 只处理用户空间程序,因此甚至不需要模拟 x86 页表格式和类似的语义。)


这已经存在于 ISA 的其他组合中,特别是 AArch64 + ARM,而且 x86-64 和 32 位 x86 的机器代码格式略有不同,并且寄存器集更大。那些对 ISA 的设计当然是为了兼容,并且新 ISA 的内核支持将旧 ISA 作为用户空间进程运行。

在最简单的一端,我们有 x86-64 CPU,它支持在 64 位内核下运行 32 位 x86 机器代码(在“兼容模式”下)。它们对所有模式完全使用相同的管道获取/解码/发布/乱序执行管道。 64 位 x86 机器代码有意与 16 位和 32 位模式足够相似,因此可以使用相同的解码器,只有少数与模式相关的解码差异。 (就像 inc/dec vs. REX 前缀。)不幸的是,AMD 故意非常保守,为 64 位模式保留了许多小的 x86 缺陷,以保持解码器尽可能相似。 (也许如果 AMD64 甚至没有流行起来,他们不想被困在花费人们不会使用的额外晶体管上。)

AArch64 和 ARM 32 位是独立的机器代码格式,在编码方面存在显着差异。例如立即操作数的编码方式不同,我假设大多数操作码都是不同的。据推测,管道有 2 个独立的解码器块,前端根据模式通过一个或另一个路由指令流。与 x86 不同,两者都相对容易解码,所以这大概没问题;两个块都不必很大才能将指令转换为一致的内部格式。不过,支持 32 位 ARM 确实意味着以某种方式在整个管道中实现对预测的有效支持。

早期的 Itanium (IA-64) 还具有对 x86 的硬件支持,定义了 x86 寄存器状态如何映射到 IA-64 寄存器状态。这些 ISA完全不同。我的理解是,x86 支持或多或少是“固定”的,芯片的一个单独区域专门用于运行 x86 机器代码。性能很差,比好的软件仿真还差,所以一旦准备好,硬件设计就放弃了。 (https://en.wikipedia.org/wiki/IA-64#Architectural_changes)

这是否意味着 x86 指令在执行过程中被翻译成一些奇怪的内部 RISC ISA?

是的,但是“RISC ISA”与 ARM 不同。例如它具有 x86 的所有怪癖,例如,如果移位计数为 0,则不修改 FLAGS 的移位。(现代英特尔通过将shl eax, cl 解码为 3 uop 来处理这一点;如果后面的指令想要读取 FLAGS,Nehalem 和更早的版本会停止前端从一个班次。)

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

【讨论】:

    【解决方案2】:

    简短的回答。是的,可以做到。见/谷歌“大型机微码”。是的,已经用大型机和小型机完成了。因为如今的 cpus 已针对自己的架构进行了高度优化,因此如果使用其他微码,则不太可能获得良好的性能。经验表明,在微码中通过 cpu y 模拟 cpu x 是一个非常重要的问题。您最终需要比原始设计者更多地了解这两个 cpu。天堂可以帮助您进行面具变化。最好编写更高级别的仿真器。经验之声。

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2020-12-24
      • 2021-11-09
      • 2018-08-15
      • 1970-01-01
      • 2011-07-21
      相关资源
      最近更新 更多