首页 > 解决方案 > 为什么 GCC 在“westmere”架构上默认禁用以下选项,尽管“westmere”支持它们

问题描述

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

  -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。所以想知道如果他们在 Westmere 上被禁用会不会有什么影响?

标签: gcc

解决方案


-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.)


推荐阅读