如何确定gcc支持的架构?

时间:2017-11-15 04:39:48

标签: performance gcc x86

GCC支持else开关,允许您指定要定位的体系结构 - 允许它调整该平台的指令序列,以及使用平台上可用的指令,这些指令在该架构的“默认”或基本版本。

例如,-march将告诉编译器定位Skylake CPU,包括使用Skylake上可用的指令集,如AVX2。

如何判断-march=skylake本地版本-march支持哪些值?较新版本在传递无效参数时有助于列出有效参数,但旧版本不会。

2 个答案:

答案 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 plugin

simple gcc plugin how to

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