我正在使用GCC 4.3编译我的C++应用程序。为了避免手动选择优化标志,我正在使用-march=native
,理论上应该添加适用于我所编译的硬件的所有优化标志。但是,我如何检查它实际使用的标志?
我正在使用GCC 4.3编译我的C++应用程序。为了避免手动选择优化标志,我正在使用-march=native
,理论上应该添加适用于我所编译的硬件的所有优化标志。但是,我如何检查它实际使用的标志?
-Q --help=target
选项:gcc -march=native -Q --help=target ...
< p > -v
选项也可能有用。您可以在此处查看关于--help
选项的文档here。
要查看命令行标志,请使用:
gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
如果您想查看由某些参数设置的编译器/预编译器定义,请执行以下操作:echo | gcc -dM -E - -march=native
native
真正的含义。 - Iwillnotexist Idonotexist应该是(-###
与 -v
相似):
echo | gcc -### -E - -march=native
展示gcc的“真实”本地标志。gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )//g'
你可以使用以下命令去掉所有 -mno-* 的标记:
gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* - )|( -mno-[^\ ]+)//g'
如果您想了解如何设置非本地交叉编译,我发现以下内容很有用:
在目标机器上,
% gcc -march=native -Q --help=target | grep march
-march= core-avx-i
% gcc -march=core-avx-i ...
echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1
,但缓存大小似乎确实不存在。 - rogerdpack我要在这个问题上发表我的意见,并建议稍微详细一些的扩展elias的答案。从gcc 4.6开始,运行gcc -march=native -v -E - < /dev/null
会以多余的-mno-*
标志的形式产生越来越多的垃圾信息。以下内容将删除这些标志:
gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'
然而,我只在两个不同的CPU(Intel Core2和AMD Phenom)上验证了正确性,因此建议运行以下脚本,以确保可以安全地剥离所有这些 -mno-*
标志。
2021年编辑:确实有一些机器使用特定的-march
值,但必须使用-mno-*
来禁用某些隐含的ISA(指令集架构),而-march=native
则无法实现该功能。
#!/bin/bash
gcc_cmd="gcc"
# Optionally supply path to gcc as first argument
if (($#)); then
gcc_cmd="$1"
fi
with_mno=$(
"${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 |
grep cc1 |
perl -pe 's/^.* - //g;'
)
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;')
"${gcc_cmd}" ${with_mno} -dM -E - < /dev/null > /tmp/gcctest.a.$$
"${gcc_cmd}" ${without_mno} -dM -E - < /dev/null > /tmp/gcctest.b.$$
if diff -u /tmp/gcctest.{a,b}.$$; then
echo "Safe to strip -mno-* options."
else
echo
echo "WARNING! Some -mno-* options are needed!"
exit 1
fi
rm /tmp/gcctest.{a,b}.$$
gcc -march=native -v -E - < /dev/null
和 gcc -march=native -### -E - < /dev/null
之间有什么区别,除了一些参数被引用外,还有包含没有特殊字符的参数,因此我不确定在什么情况下会有任何实际区别。最后,请注意 --march=native
是在 gcc 4.2 中引入的,在此之前它只是一个无法识别的参数。# resolve-march-native --vertical
-march=sandybridge
-maes
--param=l1-cache-line-size=64
--param=l1-cache-size=32
--param=l2-cache-size=3072
还有distccflags,但它似乎已经停用。
附注:我是resolve-march-native的作者。
-march=native
会导致返回错误信息:汇编器消息: 错误:未知的本机架构 错误:无法识别选项-march=native。 因此,请删除-march=native
,并且只需按照以下步骤即可在任何地方运行:gcc -Q --help=target
。 - Oleg Kokorin