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