如何确定gcc支持哪些架构



GCC支持-march开关,该开关允许您指定目标体系结构-允许它调整该平台的指令序列,以及使用平台上可能可用的指令,而这些指令在体系结构的"默认"或基本版本上不可用。

例如,-march=skylake将告诉编译器以Skylake CPU为目标,包括使用Skylake上可用的指令集,如AVX2。

如何判断本地版本的gcc支持-march的哪些值?当传递无效参数时,较新的版本有助于列出有效参数,但较旧的版本没有。

使用gcc7及更高版本,gcc将打印它支持的值作为错误消息的一部分。

$ gcc -E -march=help -xc /dev/null
# 1 "/dev/null"
cc1: error: bad value (‘help’) 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 bonnell atom silvermont slm knl 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

我查看了Godbolt,x86 gcc6.x和更早的版本只是说error: bad value (invalid) for -march= switch,甚至是-v

它也不适用于clang5.0或ICC18。


这是特定于目标的:ARM gcc6.3确实会生成支持的-march值或-mcpu=的列表。

对于gcc-7.2.0,它在这里:https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/x86-Options.html#x86-选项

您可以访问gcc在线文档。然后,找到您感兴趣的版本的手册。接下来,转到机器相关选项部分。如果您正在研究x86,请跳到"x86选项"部分。现在,搜索"-进行曲">

我还没有检查旧的gcc版本。您可以尝试的另一种方法是检查源代码,并打开保留支持的arch的文字字符串的源代码。

svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc_trunk
cd gcc_trunk

然后,也许,你可以这样尝试:

find . -type f | egrep "*.(c|cc|cpp|h|hpp)$" | xargs egrep '"skylake-avx'

从今天起,文字字符串保留在中/在x86体系结构的情况下为gcc/config/i386/i386.c。

%p.S.

正如Peter提到的,它似乎是特定于机器的。我怀疑没有一个标准/期望的行为列出可用的march值。例如,如果gcc刚刚移植到一个全新的指令集架构LEG(与ARM相反),那么它不一定有命令行选项来列出所有支持的march值。

幸运的是,一些较新的gcc版本似乎提供了一种实现这一点的方法。如果你确实需要为旧的gcc提供这样的选项,那么可以考虑编写一个gcc插件,它可能在gcc 4.5左右运行:

gcc插件

简单的gcc插件如何

Gcc插件通过添加一些命令行选项插入到现有的Gcc中。Gcc有插件的API。您所需要的只是编写一段代码,检查gcc版本、运行gcc的arch等信息,并打印出支持的march的列表。

使用详细帮助页面:

gcc -v --help

查找选项-march=CPU,例如在gcc v4.8.4 中

-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,
k6, k6_2, athlon, opteron, k8, amdfam10, bdver1,
bdver2, bdver3, btver1, btver2
EXTENSION is combination of:
8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3,
ssse3, sse4.1, sse4.2, sse4, nosse, avx, avx2,
avx512f, avx512cd, avx512er, avx512pf, noavx, vmx,
vmfunc, smx, xsave, xsaveopt, aes, pclmul, fsgsbase,
rdrnd, f16c, bmi2, fma, fma4, xop, lwp, movbe, cx16,
ept, lzcnt, hle, rtm, invpcid, clflush, nop, syscall,
rdtscp, 3dnow, 3dnowa, padlock, svme, sse4a, abm,
bmi, tbm, adx, rdseed, prfchw, smap, mpx, sha,
clflushopt, xsavec, xsaves, prefetchwt1

由于GCC 4有一个--target-help,它打印包括在内的选项的支持参数

  • -march
  • -mtune
  • -mabi
  • -masm
  • 本身是体系结构特定的其他选项,例如-msse2-mavx2

最新更新