我有哪些可用的 march/mtune 选项?

What are my available march/mtune options?

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

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

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

如何让 gcc 告诉我它支持什么?

使用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

    Generate instructions for the machine type cpu-type. In contrast to -mtune=cpu-type, which merely tunes the generated code for the specified cpu-type, -march=cpu-type allows GCC to generate code that may not run at all on processors other than the one indicated. Specifying -march=cpu-type implies -mtune=cpu-type.

...

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


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


-march=native 将为编译器 运行 所在的机器选择正确的 arch 和调整设置,或者 tune=generic 如果编译器无法识别 CPU 的具体型号 运行。

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

使用 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 的输出相比,有更多的选项。