GCC支持else
开关,允许您指定要定位的体系结构 - 允许它调整该平台的指令序列,以及使用平台上可用的指令,这些指令在该架构的“默认”或基本版本。
例如,-march
将告诉编译器定位Skylake CPU,包括使用Skylake上可用的指令集,如AVX2。
如何判断-march=skylake
本地版本-march
支持哪些值?较新版本在传递无效参数时有助于列出有效参数,但旧版本不会。
答案 0 :(得分:3)
使用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
我检查了on Godbolt,而x86 gcc6.x及更早版本只需error: bad value (invalid) for -march= switch
即可-v
。
它也不适用于clang5.0或ICC18。
这是特定于目标的:ARM gcc6.3确实生成了受支持的-march
值列表,或-mcpu=
。
答案 1 :(得分:3)
对于gcc-7.2.0,它在这里: https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/x86-Options.html#x86-Options
你可以去gcc在线文档。然后,找到您感兴趣的版本的手册。然后,转到机器相关选项部分。如果您正在研究x86,请跳转到“x86选项”部分。现在,搜索“-march”。
我没有检查过旧的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。
正如彼得所说,这似乎与机器有关。我怀疑没有标准/期望的行为列出可用的行军价值。例如,如果gcc刚刚移植到一个全新的指令集架构,LEG - 而不是ARM--,它不一定有一个命令行选项来列出所有支持的行军值。
幸运的是,似乎有些新的gcc版本提供了这样做的方法。如果你确实需要这样的旧gcc选项,可以考虑编写一个gcc插件,它可能适用于gcc 4.5左右:
通过添加一些命令行选项将Gcc插件插入到现有的gcc中。 Gcc有插件API。您所需要的只是编写一个代码来检查gcc版本,运行gcc的arch等信息,并打印出支持的游行列表。