首页 文章

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

提问于
浏览
143

我'm compiling my C++ app using GCC 4.3. Instead of manually selecting the optimization flags I' m使用 -march=native ,理论上应该添加适用于我正在编译的硬件的所有优化标志 . 但是我如何检查它实际使用的是哪些标志?

5 回答

  • 10

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

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

    在目标机器上,

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

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

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

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

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

    -v 选项也可能有用 .

    您可以在 --help 选项here上查看文档 .

  • 17

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

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

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

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

    我是_2876313的答案 . 从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-* 标志 .

    #!/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中引入的,在此之前它只是一个无法识别的参数 .

相关问题