【问题标题】:Why isn't the distinction between CPUs more ubiquitous?为什么 CPU 之间的区别没有更普遍?
【发布时间】:2015-05-01 20:18:22
【问题描述】:

我知道,一个人编写的每个程序最终都必须归结为机器代码——这是编译器产生的,是可执行文件的组成部分,也是处理器能够理解的唯一语言。我也知道不同的处理器可能有不同的指令集(我知道 65c816 汇编,我想它与今天的计算机有很大的不同)。

不过,这就是我没有得到的:如果存在不同的指令集,那么为什么我们似乎不必在每次使用软件时都关心这一点

如果一个程序是为一个特定的 CPU 编译的,它可能无法在另一个 CPU 上运行 - 但是,我从未看到诸如“英特尔用户下载此版本,AMD 用户下载此版本”之类的通知。我什至不必知道我在什么 CPU 上,每个可执行文件似乎都在……工作。显然,编译器也是如此 - 没有一个单独的版本,比如 GCC,每个处理器都有,对吧?

我知道指令集的差异比以前要微妙得多,但即便如此,至少应该有一点区别。我想知道为什么似乎没有。
什么是我不明白的?

【问题讨论】:

  • 最流行的现代计算机 (Intel/AMD) 使用非常相似的处理器架构 en.wikipedia.org/wiki/X86
  • 如果您运行的是为多 CPU 架构提供的操作系统,则需要小心。例如,尝试在 Raspberry Pi 上运行 x86/x64 PC Linux 二进制文件,反之亦然,看看效果如何。
  • 是的,像 gcc 这样的编译器需要为它们支持的每个 CPU 架构使用不同的后端(并且,如果它编译的架构与编译器所在的架构不同)运行,这称为交叉编译)。

标签: cpu executable machine-code


【解决方案1】:

实际上英特尔/AMD 有时会有不同的版本。即使对于不同版本的 Intel 和/或 AMD。这并不常见(尤其是在人们通常使用的那种软件中),因为它对用户不友好(大多数人甚至不知道 CPU 是什么或做什么,更不用说他们到底有什么类型了),所以通常是多个版本都在同一个可执行文件中并在运行时选择,或者使用“最小公分母”指令子集(当性能不是真正关心时)。 AMD 和 Intel 之间存在显着差异,最显着的差异在于它们支持的指令集。 AMD 在实现 Intel 的新指令方面总是落后于 Intel(新集出来regularly),而 Intel 通常不实现 AMD 的扩展(AMD64 是一个很大的例外(99% 被 Intel 接受,做了一些小的改动),还有一些到处都是借用的指令,但 XOP 永远不会发生,即使它很棒,3DNow! 从未被英特尔采用)。作为将不同“扩展指令集”的代码打包在同一个可执行文件中的软件示例,请参阅 y-cruncher。

不过,回到开头,对于某些高性能软件(我无法说出任何名字,但我以前见过)高性能软件,您可能会看到不同的版本,每个版本都专门为获得最佳性能而定制在一个特定的微架构上。例如,P4 (netburst) 和 Core2 是两个非常不同的野兽(这主要是 P4 疯狂的错),尽管 Core2 向后兼容并且可以在不修改的情况下运行相同的代码,但从性能角度来看,这不一定是一个好主意。

【讨论】:

    【解决方案2】:

    没有 Intel/AMD 版本,因为它们使用相同的 IS 系列:x86。 但是,有些应用程序在下载时必须注意不同的版本。仍然存在完全不同的指令集,并且可能使程序的行为有所不同。例如,如果您有一个 PowerPC 架构并在其上编写一个基于网络的应用程序,您可以忘记从小端到大端的转换,但如果您在 x86(小端)上编译相同的代码,应用程序很可能会在网络侧。

    指令的数量也有所不同,例如RISC 与 CISC。

    最终,有很多差异需要寻找,但在大多数编程语言中,您不必太担心它们,因为编译器/解释器会为您处理大部分事情。如果你工作的水平较低,那么你必须知道你在每个架构上做什么。

    此外,如果您为 ARM 编译,您将无法在任何其他机器上运行该程序,例如您的带有 x86 的 PC。它根本不起作用。 因为操作码可能/确实不同,所以使用 mov 指令,在 x86 上操作码是 0x88,在 ARM 上可能是 0x13 等等。

    【讨论】:

    • 所以基本上,整个事情都不是问题,因为几乎所有个人电脑都使用 x86 系列?
    【解决方案3】:

    实际上,这种区别非常显着。英特尔与 AMD 的情况除外。 AMD 使他们的处理器与英特尔机器代码兼容。当然是故意的。

    今天有一个转向 JIT 编译(Java、.NET 等)的趋势。在这种情况下,可执行文件不包含机器代码。它包含一种简单的中间语言,在运行处理器的机器代码中在执行之前编译。这允许处理器架构完全不透明。

    【讨论】:

    • .exe 文件用于 java 吗? :)
    【解决方案4】:

    AMD 是英特尔克隆。反之亦然,具体取决于您对情况的看法。无论哪种方式,程序都可以编译以在其中任何一种上运行(在合理的范围内,例如不能回到 10 年,不能让 32 位处理器理解 64 位特定指令)。下一步是主板必须做类似的事情,他们会做,可能有一些英特尔或 AMD 特定的芯片支持项目,但是你会进入通用外围设备,这些外围设备可以在任一平台上找到,或者在一个或另一个平台上足够广泛,以至于操作系统和/或应用程序支持它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多