我正在使用GCC 4.3编译我的C++应用程序。我使用-march=native而不是手动选择优化标志,理论上应该添加适用于我正在编译的硬件的所有优化标志。但是我如何检查它实际使用的是哪些标志?
-march=native
ryoqjall1#
您可以使用-Q --help=target选项:
-Q --help=target
gcc -march=native -Q --help=target ...
字符串-v选项也可能有用。您可以在此处查看有关--help选项的文档。
-v
--help
50pmv0ei2#
要查看命令行标志,请使用:用途:
gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
字符串如果你想看到编译器/预编译器定义的某些参数,这样做:
echo | gcc -dM -E - -march=native
型
ejk8hzay3#
它应该是(-###类似于-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'
lxkprmvk4#
如果你想了解如何设置一个非原生的交叉编译,我发现这个很有用:在目标机器上,
% gcc -march=native -Q --help=target | grep march -march= core-avx-i
字符串然后在构建机器上使用这个:
% gcc -march=core-avx-i ...
ryevplcw5#
对于这个问题,我将发表自己的看法,并建议对elias的答案进行稍微详细的扩展。从gcc 4.6开始,运行gcc -march=native -v -E - < /dev/null会以多余的-mno-*标志的形式发出越来越多的垃圾邮件。下面将剥离这些:
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=native使用特定-march值的机器,但 * 必须 * 禁用-mno-*的一些隐含ISA(指令集架构)。
-march
#!/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中引入的,在此之前它只是一个无法识别的参数。
gcc -march=native -### -E - < /dev/null
--march=native
8zzbczxx6#
resolve-march-native就是这样的:它解析GCC输出,并将GCC的多个调用的输出组合成最终的答案。例如:
# resolve-march-native --vertical -march=sandybridge -maes --param=l1-cache-line-size=64 --param=l1-cache-size=32 --param=l2-cache-size=3072
字符串也有distccflags,但它是seems discontinued。PS:我是resolve-march-native的作者。
6条答案
按热度按时间ryoqjall1#
您可以使用
-Q --help=target
选项:字符串
-v
选项也可能有用。您可以在此处查看有关
--help
选项的文档。50pmv0ei2#
要查看命令行标志,请使用:用途:
字符串
如果你想看到编译器/预编译器定义的某些参数,这样做:
型
ejk8hzay3#
它应该是(
-###
类似于-v
):字符串
显示gcc的“真实的”本机标志。
您可以使用命令使它们看起来更“清晰”:
型
你可以用-mno-* 来去掉标志:
型
lxkprmvk4#
如果你想了解如何设置一个非原生的交叉编译,我发现这个很有用:
在目标机器上,
字符串
然后在构建机器上使用这个:
型
ryevplcw5#
对于这个问题,我将发表自己的看法,并建议对elias的答案进行稍微详细的扩展。从gcc 4.6开始,运行
gcc -march=native -v -E - < /dev/null
会以多余的-mno-*
标志的形式发出越来越多的垃圾邮件。下面将剥离这些:字符串
然而,我只在两个不同的CPU(Intel Core2和AMD Phenom)上验证了这一点的正确性,因此我建议还运行以下脚本,以确保所有这些
-mno-*
标志都可以安全地剥离。**2021年编辑:**确实有
-march=native
使用特定-march
值的机器,但 * 必须 * 禁用-mno-*
的一些隐含ISA(指令集架构)。型
除了引用的一些参数和不包含特殊字符的参数之外,我还没有发现
gcc -march=native -v -E - < /dev/null
和gcc -march=native -### -E - < /dev/null
之间的区别,所以我不确定在什么情况下这会产生真实的区别。最后,请注意
--march=native
是在gcc 4.2中引入的,在此之前它只是一个无法识别的参数。8zzbczxx6#
resolve-march-native就是这样的:它解析GCC输出,并将GCC的多个调用的输出组合成最终的答案。例如:
字符串
也有distccflags,但它是seems discontinued。
PS:我是resolve-march-native的作者。