Answers:
您可以使用以下-Q --help=target
选项:
gcc -march=native -Q --help=target ...
该-v
选项也可能有用。
您可以在此处查看有关该--help
选项的文档。
-v
选项的那些参数,尽管它是cc1
命令行的一部分……
-march=native
,它将在以下任何地方起作用:gcc -Q --help=target
。
要查看命令行标志,请使用:
gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
如果要查看由某些参数设置的编译器/预编译器定义,请执行以下操作:
echo | gcc -dM -E - -march=native
native
真正的含义。
如果您想了解如何设置非本机交叉编译,我发现这很有用:
在目标机器上,
% 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
但是似乎没有缓存大小。
我将在这个问题上投入两分钱,并建议对elias的答案进行更详细的扩展。从gcc 4.6开始,运行of 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-*
可以安全地剥离所有这些标志。
#!/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中引入的,在此之前它只是无法识别的参数。
--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512