我有哪些三月/月的选择



有没有办法让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的-march手册中找到。对于x86:

  • -march=cpu-type

    生成机器类型cpu类型的指令。与仅为指定的cpu-type调谐生成的代码的-mtune=cpu-type相比,-march=cpu-type允许GCC生成可能根本不在所指示的处理器之外的处理器上运行的代码。指定-march=cpu-type意味着-mtune=cpu-type

。。。

https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-3月13日


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


-march=native将为编译器运行的机器选择正确的拱形和调谐设置,或者如果编译器无法识别其运行的CPU的特定型号,则选择tune=generic

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

相关内容

  • 没有找到相关文章

最新更新