【问题标题】:What are my available march/mtune options?我有哪些可用的 March/mtune 选项?
【发布时间】:2019-04-08 23:04:55
【问题描述】:

有没有办法让 gcc 输出可用的 -march=arch 选项?我遇到了构建错误(尝试过-march=x86_64),我不知道我的选择是什么。

我使用的编译器是 gcc 的专有包装器,它似乎不喜欢 -march=skylake。标志应该是相同的,所以我假设我发送给 gcc 以转储架构的任何选项对于这个包装器都是相同的。

我设法使用虚假参数导致 gcc 出错,它转储了一个列表,但现在我正在通过一个包装器,我没有看到。

我怎样才能让 gcc 告诉我它支持什么?

【问题讨论】:

  • 我在问题中提到包装器没有通过它 - 它实际上是跳到 cc ,这只会引发错误。这是一个交叉编译,所以本机无法工作(但我并不真正关心优化,因为它只是一个基准测试)
  • 你刚刚写的,它不喜欢-march=skylake,仅此而已。它是二进制文件还是脚本文件?您可以使用strings 并搜索看起来很有希望的东西。
  • 它是一个二进制文件——当它变得更重要时,我会努力完成它。我在同一个 CPU 上的不同操作系统上做两个基准测试,所以目前优化并不重要,只是 dhrystone makefile 推荐它
  • -O2 这样的优化至少对于基准测试至关重要,最好是-O3 -fprofile-use -march=native(在使用-fprofile-generate 运行之后)。如果您的意思是针对特定目标的调整并不重要,那么可以确定。

标签: gcc command-line x86 compiler-flags micro-architecture


【解决方案1】:

使用gcc --target-help

-march=CPU[,+EXTENSION...]
                      generate code for CPU and EXTENSION, CPU is one of:
                       generic32, generic64, i386, i486, i586, i686,
                       pentium, pentiumpro, pentiumii, pentiumiii, pentium4,
                       prescott, nocona, core, core2, corei7, l1om, k1om,
                       iamcu, k6, k6_2, athlon, opteron, k8, amdfam10,
                       bdver1, bdver2, bdver3, bdver4, znver1, znver2,
                       btver1, btver2
...

通常不是像x86x86-64 这样的通用架构,而是特定的微架构。但是对于具有 64 位扩展的通用 x86 CPU,有 x86-64(不是 x86_64)。每个架构的完整列表可以在GCC's -march manual 上找到。对于 x86:

  • -march=cpu-type

    为机器类型 cpu-type 生成指令。与-mtune=cpu-type 相比,-mtune=cpu-type 仅针对指定的cpu-type 调整生成的代码,-march=cpu-type 允许 GCC 生成可能根本无法在指定处理器以外的处理器上运行的代码。指定-march=cpu-type 意味着-mtune=cpu-type

...

https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-march-13


虽然-march 的基准版本是-march=x86-64,但基准/默认调整选项是-mtune=generic。这样做的目的是在任何地方都不可怕,即使以额外的指令或代码大小为代价也能避免性能缺陷。


-march=native 将为运行编译器的机器选择正确的架构并调整设置,如果编译器无法识别其运行的特定 CPU 型号,则为tune=generic

(例如 Skylake 上的旧 gcc,仍将启用 -mavx2 -mpopcnt -mbmi2 等,但会设置 -mtune=generic 而不是更接近合适的设置。)

【讨论】:

  • 我认为这实际上效果不佳 - 它似乎显示了一个不完整的列表,并出现在“汇编器选项”标题下,而您通常会寻找编译器接受的选项.例如,您的列表中的 Sandybridge、haswell、skylake 等在哪里?在我的系统上,g++8 给出了一个类似的不完整列表。
  • @BeeOnRope:哦,不,显然 GCC 并没有从它用来检查 arch= 选项并打印帮助的同一个列表中即时构造这个字符串。这很不幸,可能被认为是它们不同步的错误,或者它们完全分开的设计错误。
  • @PeterCordes - 它也出现在“汇编器选项”下,因此汇编器可能以某种方式接受较小的拱门列表?不知道。否则,是的,这似乎是一个错误。
  • @BeeOnRope:哦,是的,GAS 本身采用-march 选项。我不确定 GCC 前端是否会将-march 传递给as,至少对于.c 源而言。也许是 asm 源?
【解决方案2】:

使用gcc --target-help 似乎是正确的想法,但给出的列表不完整。

现代 gcc 版本的一种解决方法是将虚假值传递给 -march

$ gcc --target-help -march=foo
cc1: error: bad value (‘foo’) for ‘-march=’ switch
cc1: note: valid arguments to ‘-march=’ switch are: nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 cannonlake icelake-client icelake-server bonnell atom silvermont slm knl knm x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 btver1 btver2 native
...

请注意,与 --target-help 的输出相比,还有更多选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多