【问题标题】:Using gcc, is -march=native forwards compatible?使用 gcc,-march=native 向前兼容吗?
【发布时间】:2015-01-08 15:30:44
【问题描述】:

我们有一个由具有以下 CPU 的机器组成的集群:

  • Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz,
  • Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz,
  • Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz。

这些支持不同的指令集扩展(例如,E5-2680 v3 具有 AVX2,而其他则没有)。 -march=native 是否向前兼容,这样在最旧的机器上用它编译的代码可以在以后的模型上运行,还是应该手动找出最小的公分母?

gcc 版本是 4.8.2。

【问题讨论】:

  • 这个问题真的是关于英特尔处理器/架构,而不是真正与 gcc 相关......
  • 你想要的是CPU dispatcher。为最小公分母编译调度程序。然后为您要支持的每个硬件集编译不同的目标文件,并让调度程序选择适当的版本。
  • 谢谢。我同意这可能不是问这个问题的正确地方,因为它与一组特定的(英特尔)CPU 有关。但是 CPU 调度程序选项绝对很有趣。我去看看。
  • 我投票结束这个问题,因为它与特定的架构兼容性问题有关,而不是一般的 gcc。对不起..

标签: gcc


【解决方案1】:

-march=native 是否向前兼容,以便在最旧的机器上用它编译的代码可以在较新的型号上运行

一般来说,不会。不能保证任意较新的芯片将具有某些任意较旧芯片上存在的所有指令。使用 GCC 的一个名为 -march 的选项会更安全,因为较新的系列往往是较旧的系列的超集,但 -march=native 通常使用这种方式并不安全。

对于这些特定芯片,我认为使用-march=native应该没问题,但为什么要冒险呢?使用 -msse4.2 -mavx 等选项启用单个指令集,或使用命名选项。

使用现代 GCC,您可以只使用与前两个匹配的 -march=sandybridge,并且不使用第三个不支持的任何指令(我认为与 -march=haswell 匹配)。对于 GCC 4.8.2 -march=corei7-avx 应该适用于所有这些。

https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html 显示每个 -march 选项启用了哪些指令,或者对于 GCC 4.8.2 https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/i386-and-x86-64-Options.html 列出它们。

【讨论】:

    【解决方案2】:

    这可能不是您要寻找的答案。

    我记得当我曾经在一个带有 avx2(英特尔第 4 代核心 i)的 CPU 和 -mavx2 的系统上编译并根据英特尔的 C++ 内在指南使用 avx2 特定内在并在另一个具有不支持 avx2 指令的 CPU(英特尔第二代核心 i),它运行得非常好。所有的计算都很好。我只使用了最简单的计算——添加了两个变量,每个变量都包含 8x 32 位整数,并在控制台上显示结果。

    但这告诉我们,英特尔在这种情况下制造了向后兼容的系统。我猜这是因为两个 CPU 上的寄存器大小都是相同的 256 位。

    我认为只要寄存器大小相同或更大,Intel 制造的 BIOS 应该提供微码的前向兼容性;这是基于台式机/笔记本电脑的微码的主要功能之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-25
      • 2013-04-17
      • 2013-07-03
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多