我可以使用哪些进行曲/音乐选择?

Bry*_*son 6 x86 command-line gcc compiler-flags micro-architecture

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

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

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

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

Bee*_*ope 9

使用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
...
Run Code Online (Sandbox Code Playgroud)

请注意与--target-help.


phu*_*clv 5

使用 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
...
Run Code Online (Sandbox Code Playgroud)

它通常不是像这样的通用体系结构x86x86-64而是特定的微体系结构。但是x86-64(没有x86_64)具有64位扩展的通用x86 CPU。有关每种体系结构的完整列表,请参见GCC的-march手册。对于x86:

  • -march=cpu-type

    为计算机类型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将为运行编译器的计算机选择正确的拱形并调整设置,或者tune=generic如果编译器无法识别正在运行的特定CPU模型。

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

  • 我认为这实际上效果不佳 - 它似乎显示了一个不完整的列表,并出现在“汇编器选项”标题下,而您通常会寻找编译器接受的选项。例如,sandybridge、haswell、skylake 等在您的列表中在哪里?在我的系统上,“g++8”给出了类似的不完整列表。 (2认同)
  • @BeeOnRope:哦不,显然 GCC 不会从用于检查 `arch=` 选项并打印帮助的同一个列表中动态构造这个字符串。这是不幸的,可以被认为是它们不同步的错误,或者是它们根本独立的设计错误。 (2认同)
  • @Adam它是由CPU制造商定义的。请参阅[架构和微架构有什么区别?](https://cs.stackexchange.com/q/29460/9489)、[架构和微架构](/sf/ask/2464065691/)、 https://en.wikichip.org/wiki/microarchitecture、https://en.wikipedia.org/wiki/Microarchitecture、https://www.quora.com/What-is-CPU-microarchitecture (2认同)