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

问题描述 投票:0回答:6

我正在使用 GCC 4.3 编译我的 C++ 应用程序。我没有手动选择优化标志,而是使用

-march=native
,理论上它应该添加适用于我正在编译的硬件的所有优化标志。但我如何检查它实际使用了哪些标志?

gcc g++ compiler-optimization compiler-flags
6个回答
180
投票

您可以使用

-Q --help=target
选项:

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

-v
选项也可能有用。

您可以在

--help
选项此处查看文档。


159
投票

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

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

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

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

29
投票

应该是(

-###
类似于
-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'

15
投票

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

在目标机器上,

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

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

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

8
投票

我将在这个问题上投入我的两分钱,并建议对埃利亚斯的答案进行稍微更详细的扩展。从 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/null
gcc -march=native -### -E - < /dev/null
之间的区别,所以我不确定在什么情况下这会产生任何真正的区别。

最后,请注意

--march=native
是在 gcc 4.2 中引入的,在此之前它只是一个无法识别的参数。


0
投票

resolve-march-native 正是用于此目的。

© www.soinside.com 2019 - 2024. All rights reserved.