我有哪些可用的 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
...
它通常不是像 x86
或 x86-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
的输出相比,有更多的选项。
有没有办法让 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
...
它通常不是像 x86
或 x86-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 specifiedcpu-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
的输出相比,有更多的选项。