16

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

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

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

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

4

2 回答 2

19

利用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而是特定的微架构。但是有x86-64(不是x86_64)具有 64 位扩展的通用 x86 CPU。每个架构的完整列表可以在GCC 的-march手册中找到。对于 x86:

  • -march=cpu-type

    为机器类型 cpu-type 生成指令。相比之下-mtune=cpu-type,它仅针对指定的 调整生成的代码,它cpu-type允许-march=cpu-typeGCC 生成可能根本无法在指定处理器以外的处理器上运行的代码。指定-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将为运行编译器的机器选择正确的架构并调整设置,或者tune=generic如果编译器无法识别其运行的特定 CPU 型号。

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

于 2018-11-05T16:49:19.200 回答
11

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

于 2019-11-03T23:17:25.663 回答