为什么GCC在默认情况下禁用以下选项;韦斯特米尔;“建筑事件”;韦斯特米尔;支持他们
我想通过在带有GCC的RHEL5上启用为什么GCC在默认情况下禁用以下选项;韦斯特米尔;“建筑事件”;韦斯特米尔;支持他们,gcc,Gcc,我想通过在带有GCC的RHEL5上启用-march=“westmile”来编译我的应用程序。但是,当我用gcc-march=westmile-Q--help=target查询gcc时,我会默认禁用下面的所有选项 -maes [disabled] -mcx16 [disabled] -mfxsr
-march=“westmile”
来编译我的应用程序。但是,当我用gcc-march=westmile-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主页,它会说“Westmile”确实支持上面的所有指令集。如果是这样,为什么GCC在默认情况下不启用这些选项
如果我在应用程序编译中启用了它们,会对应用程序产生任何不利影响吗?
到目前为止,我正在另一个体系结构上使用这些选项,例如Sandybridge。
所以想知道如果他们在Westmile上被禁用,是否会产生任何影响?
-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
致:
(请注意,Red Hat Enterprise Linux 5中的两个系统编译器(
gcc
和gcc44
)都不支持-march=westmile
)我认为查看gcc中带有-mrach的不同ARCH之间是否有任何默认选项不同的最佳方法是,通过使用简单的测试程序将这些ARCH显式地传递给GCC并记录它们。稍后使用readelf读取传递给它们的默认选项
gcc-frecord gcc交换机-三月=本机Helloworld.cpp-o测试
readelf-p.GCC.command.line测试
gcc-frecord gcc开关-三月=Westmile Helloworld.cpp-o测试
readelf-p.GCC.command.line测试
在带有GCC4.9.1的RHEL5 x86上,上述命令显示了编译器作为默认选项传递的内容的细微差别。
正如我在问题中所说,默认情况下,将Westmile传递到-march并不会传递所有这些标志。打印出来的内容会产生误导。gcc-6的效果更好。因此,如果上述命令显示类似的输出,那么我们可以假设两种体系结构的启用/禁用选项相同?(注意:我在RHEL5上使用gcc 4.9.1)不确定我是否理解这个问题。如果输出中包含相应的
\uu*\ uuuu
常量,编译器可能会使用这些指令,是的(当然不仅仅是在使用内部函数时,这取决于指令子集、编译器版本和优化级别)。
$ 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