【问题标题】:What is the difference between architecture and processor?架构和处理器有什么区别?
【发布时间】:2021-10-13 06:27:09
【问题描述】:

GCC/Clang 支持编译选项 -march 和 -mcpu。

  1. -march 上下文中的架构到底是什么?
  2. 在选项 -mcpu 的上下文中,处理器 (cpu) 到底是什么?
  3. 架构和处理器(cpu)有什么区别?

谢谢。

【问题讨论】:

  • 我的理解是,它主要与 ARM 等具有官方 ISA 版本号的 ISA 相关,与 CPU 型号分开。像-mcpu=cortex-m3一样设置相关的arch=选项,设置tune=cortex-m3。在 x86-64 上,我们只使用 -march,而不是 -mcpu,而是使用像 -march=skylake 这样以 CPU 命名的名称。
  • 这能回答你的问题吗? GCC: mtune vs march vs mcpu

标签: gcc x86 clang intel


【解决方案1】:

对于旗帜:

  • -march 标志指定目标架构版本,即一组 ISA 扩展。 -march 告诉编译器允许生成特殊指令以使用给定架构的特定硬件功能。 (在x86上,也暗示-mtune=同样的东西)

  • -mtune 标志指定要调整的目标微架构(特定 CPU),例如循环展开阈值或不影响兼容性的指令选择。没有任何-march 的-mtune 告诉编译器生成具有最低限度的通用指令集的二进制文件,但还要为指定的目标调整生成的二进制代码。 -mtune 标志不允许编译器使用目标的特殊硬件功能,但可以与它一起使用。

    它可以与-march 一起使用 来设置基线 CPU 功能级别,还可以针对特定 CPU 进行调整,希望能够代表您最关心的实际运行的 CPU。即使它比匹配 -march 设置的最旧 CPU 更新,即可以运行二进制文件。

  • -mcpu ARM 上的标志 指定要调整的目标处理器,并使用它支持的任何扩展。 GCC 使用此名称来派生目标 ARM 体系结构的名称(就像由 -march 指定一样),例如 -mcpu=cortex-a53 暗示 -march= 和 -mtune= 设置。

GCC 和 LLVM 就这些标志的含义达成一致,例如在 x86-64 上都将 -mcpu 视为 -mtune 的同义词,但在 ARM 上则不同。

示例:

  • -mcpu=cortex-a8 将为 Cortex-A8 执行特定的优化,例如指令调度,并将在该内核上生成性能更好的代码,以及使用它支持但旧 CPU 不支持的指令。

  • -march=armv7-a 只是选择了 ARMv7-a 架构,它告诉编译器 它可以使用 ARMv7-a 中的指令,但它将性能调整/指令调度启发式保留为默认值,旨在在整个架构的一系列 CPU 上运行良好。 (例如,一般来说 ARM,不限于那些新到足以支持所选-march 的产品,不幸的是)。

  • ‑mtune=thunderx2t99,编译器将生成针对 ThunderX2 微架构优化的二进制文件。这个二进制文件不会充分利用 ThunderX2 的所有硬件特性;但该二进制文件可能会针对 ThunderX2 进行一些优化,并且比使用 ‑march=armv8.1‑a 编译的二进制文件更便携。

x86 约定是让-march 隐含-mtune as stated here in the docs

链接:

For further reference maybe these arm docs help

Deprecation of -mcpu as synonym of -mtune

Docs for x86 options

【讨论】:

  • 请注意,这个问题被标记为 [intel],其中 -mcpu 已被弃用,并且与 ARM 上的工作方式不同。 (我添加了 [x86] 标记,因为这是体系结构的正确标记,而不是供应商。)如果您添加一些关于它的内容,这将使答案更好。 (还可能值得一提的是-mtune= 选项,这也是 ARM 上的 -mcpu 或 x86 上的 -march= 所暗示的,就像之前的副本一样:GCC: mtune vs march vs mcpu - 或者我们应该把这个问题作为一个 dup 来结束并退还赏金。)
  • @PeterCordes 已编辑
  • 很好的补充,但你的例子会受益于对 ARM 来说,-mcpu=thunderx2t99 是编写‑mtune=thunderx2t99 -march=armv8.1-a 的简洁方式(如果我正确的话)。而对于 x86-64,-mcpu=skylake 只是 -mtune=skylake 而没有设置 -march。您的粗体句子,当 GNU 或 LLVM 编译器在 x86 上使用相同的标志时,-mcpu 标志只是 -mtune 的弃用同义词 不清楚。使用“when”意味着有时在 x86 上并非如此。 (我猜英语可能不是你的母语;我会编辑。)
  • 感谢彼得的编辑,确实英语不是我的母语哈哈,今天晚些时候会重新访问以尝试改进答案
  • 我认为在这一点上是相当合理的,但当然可以随意改写或重新组织一些观点,或者添加更多内容。
猜你喜欢
  • 2019-09-26
  • 2014-01-06
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2012-05-31
  • 2014-02-05
相关资源
最近更新 更多