gcc 如何查看-march=native将激活哪些标志?

1yjd4xko  于 12个月前  发布在  其他
关注(0)|答案(6)|浏览(120)

我正在使用GCC 4.3编译我的C++应用程序。我使用-march=native而不是手动选择优化标志,理论上应该添加适用于我正在编译的硬件的所有优化标志。但是我如何检查它实际使用的是哪些标志?

ryoqjall

ryoqjall1#

您可以使用-Q --help=target选项:

gcc -march=native -Q --help=target ...

字符串
-v选项也可能有用。
您可以在此处查看有关--help选项的文档。

50pmv0ei

50pmv0ei2#

要查看命令行标志,请使用:用途:

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

字符串
如果你想看到编译器/预编译器定义的某些参数,这样做:

echo | gcc -dM -E - -march=native

ejk8hzay

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'

lxkprmvk

lxkprmvk4#

如果你想了解如何设置一个非原生的交叉编译,我发现这个很有用:
在目标机器上,

% gcc -march=native -Q --help=target | grep march
-march=                               core-avx-i

字符串
然后在构建机器上使用这个:

% gcc -march=core-avx-i ...

ryevplcw

ryevplcw5#

对于这个问题,我将发表自己的看法,并建议对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=native使用特定-march值的机器,但 * 必须 * 禁用-mno-*的一些隐含ISA(指令集架构)。

#!/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/nullgcc -march=native -### -E - < /dev/null之间的区别,所以我不确定在什么情况下这会产生真实的区别。
最后,请注意--march=native是在gcc 4.2中引入的,在此之前它只是一个无法识别的参数。

8zzbczxx

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的作者。

相关问题