为什么GCC在“ westmere”架构上默认禁用以下选项,尽管“ westmere”支持它们

时间:2019-02-12 01:57:39

标签: gcc

我想通过在具有GCC的RHEL5上启用-march="westmere"来编译我的应用程序。但是,当我使用gcc -march=westmere -Q --help=target查询gcc哪些要为此拱门启用的所有选项时,默认情况下以下所有选项都被禁用

  -maes                                                 [disabled]
  -mcx16                                               [disabled]
  -mfxsr                                                 [disabled]
  -mmmx                                              [disabled]
  -mno-sse4                                        [enabled]
  -mpclmul                                           [disabled]
  -mpopcnt                                          [disabled]
  -msahf                                                [disabled]
  -msse                                                  [disabled]
  -msse2                                               [disabled]
  -msse3                                               [disabled]
  -msse4                                               [disabled]
  -msse4.1                                            [disabled]
  -msse4.2                                            [disabled]
  -mssse3                                             [disabled]

如果我查看GCC主页,它说“ westmere”确实支持上述所有说明。如果是这样,为什么GCC默认不启用这些选项?

如果我在应用程序编译中启用了它们,会对应用程序产生不利影响吗? 到目前为止,我正在其他架构上使用这些选项,例如Sandybridge。 因此想知道他们是否对韦斯特米尔(残疾人)造成影响?

2 个答案:

答案 0 :(得分:1)

-Q是开发人员专用的选项,它使--help=target打印本质上是内部信息。在这种情况下,由于目标选择选项的实现方式,子选项设置不能反映总体设置的值。

您可以查看预定义的预处理器宏,以确定编译器中实际启用的功能。比较:

$ gcc -E -x c -dM /dev/null | grep SSE
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSE__ 1

收件人:

$ gcc -march=westmere -E -x c -dM /dev/null | grep SSE
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1

(请注意,Red Hat Enterprise Linux 5中的两个系统编译器(gccgcc44)都不支持-march=westmere。)

答案 1 :(得分:0)

我认为,查看gcc中带有-mrach的各个拱之间是否有默认选项的最佳方法是通过使用简单的测试程序将这些拱明确地传递给GCC并进行记录。稍后,请使用readelf阅读传递给它们的默认选项。

gcc -frecord-gcc-switches -march =本机Helloworld.cpp -o测试

readelf -p .GCC.command.line测试

gcc -frecord-gcc-switches -march = westmere Helloworld.cpp -o测试

readelf -p .GCC.command.line测试

在带有GCC 4.9.1的RHEL5 x86上,上述命令显示了编译器作为默认选项传递的细微差别。 正如我在问题中发布的那样,默认情况下将westmere传递给-march,而不默认传递所有这些标志。