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


165

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

Answers:


150

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

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

-v选项也可能有用。

您可以在此处查看有关该--help选项的文档。


10
我建议这不是最理想的。--help = target的输出不显示CPU缓存信息,下面的elias和42n4都列出了方法。具体来说,在Phenom上的gcc 4.9.2上,输出包括以下内容:--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
Daniel Santos 2015年

@DanielSantos:在我的系统上,它确实显示了带有-v选项的那些参数,尽管它是cc1命令行的一部分……
thkala 2015年

不完美。在gcc版本5.4.0(Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)上,它将导致以下错误:汇编程序消息:错误:未知体系结构本机错误:无法识别的选项-march = native。因此,松开-march=native,它将在以下任何地方起作用:gcc -Q --help=target
Oleg Kokorin

@Oleg-听起来像是GCC 5中的错误。GCC7中不存在此问题
。– jww

111

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

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

如果要查看由某些参数设置的编译器/预编译器定义,请执行以下操作:

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

1
这个答案值得与公认的一样多的支持,尤其是列出native真正的含义。
Iwillnotexist Idonotexist

4
因此,如果我想交叉原生编译,我应该同时向两个编译器提供定义和参数?还是论点足够?
hanshenrik

25

应该是(-###类似于-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'

10

如果您想了解如何设置非本机交叉编译,我发现这很有用:

在目标机器上,

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

然后在构建机器上使用它:

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

不幸的是,这将不包括所有标志。
巴蒂斯特·威希特

@BaptisteWicht是否有-march = native将包含-march = core-avx-i的标志(在这种情况下),或者哪些标志?谢谢!
rogerdpack

2
@rogerdpack在此计算机(sandybridge)上,march = sandybridge未启用AVX(不知道为什么),而march = native启用了AVX。另一个重要区别是,仅使用march = native提取缓存大小
Baptiste Wicht

1
@BaptisteWicht这似乎很奇怪(我想):echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1但是似乎没有缓存大小。
rogerdpack 2016年

7

我将在这个问题上投入两分钱,并建议对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/nullgcc -march=native -### -E - < /dev/null其他比一些参数被引用-并且不包含特殊字符,所以我不知道在什么情况下,这使得任何真正的不同参数。

最后,请注意,它--march=native是gcc 4.2中引入的,在此之前它只是无法识别的参数。


不错,此收集器也具有缓存大小
rogerdpack '16

gcc版本5.4.0(Buildroot 2017.05-rc2-00016-gc7eaf50-dirty)返回:错误:未知体系结构“本机”
Oleg Kokorin

奥列格:您正在使用哪个拱门?可能只有某些体系结构支持“本机”。
Daniel Santos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.