gpt4 book ai didi

macros - 检测预处理器中的 -xarch 选项?

转载 作者:行者123 更新时间:2023-12-02 08:57:43 28 4
gpt4 key购买 nike

我在 Solaris 11 上使用 Sun Studio 12.4 和 12.5。我们有一个源文件,它提供了 CRC32 的直接 C/C++ 实现,或使用 Intel 内在函数的 CRC32 优化版本。在运行时,函数指针会填充正确的实现。

在具有双 Xeon 的 x86 服务器上进行测试会产生以下结果,因为我们正在根据编译器版本提供可用的代码路径。 SunCC 12.1 添加了对 SSE4 的支持(如果我正确解析了矩阵),因此我们尝试在 __SUNPRO_CC >= 0x5100 时启用它。

"crc.cpp", line 311: ube: error: _mm_crc32_u8 intrinsic requires at least -xarch=sse4_2.

SunCC没有定义惯用的 GCC 定义,例如 __SSE4_1____SSE4_2__。此外,SunCC 似乎没有像 MS VC++ 那样提供内在函数,其中编译器版本表明支持。

SunCC 似乎启用了基于 -xarch 选项的功能,但我不清楚如何在预处理器中检测它。此外,使用 -xarch 设置一些位,导致程序在下层处理器(类似于“最小”平台)上执行失败。

我有两个问题。

  • 如何检测预处理器中的 -xarch 选项?
  • 如何禁用 -xarch 位以便程序可以在低级处理器上运行?
<小时/>

下面是使用 -xarch=aes 编译的宏转储。请注意,没有任何内容表明可用的功能。

$ /opt/solarisstudio12.4/bin/CC -native -m64 -xarch=aes -xdumpmacros -E /dev/null 2>&1 | /usr/gnu/bin/sort --ignore-case

#1 "/dev/null"
#define __alignof__ __alignof
#define __amd64 1
#define __amd64__ 1
#define __ARRAYNEW 1
#define __asm asm
#define __asm__ asm
#define __attribute __attribute__
#define __builtin_constant_p __oracle_builtin_constant_p
#define __builtin_fpclassify __oracle_builtin_fpclassify
#define __builtin_huge_val __oracle_builtin_huge_val
#define __builtin_huge_valf __oracle_builtin_huge_valf
#define __builtin_huge_vall __oracle_builtin_huge_vall
#define __builtin_infinity __oracle_builtin_infinity
#define __builtin_isfinite __oracle_builtin_isfinite
#define __builtin_isgreater __oracle_builtin_isgreater
#define __builtin_isgreaterequal __oracle_builtin_isgreaterequal
#define __builtin_isinf __oracle_builtin_isinf
#define __builtin_isless __oracle_builtin_isless
#define __builtin_islessequal __oracle_builtin_islessequal
#define __builtin_islessgreater __oracle_builtin_islessgreater
#define __builtin_isnan __oracle_builtin_isnan
#define __builtin_isnormal __oracle_builtin_isnormal
#define __builtin_isunordered __oracle_builtin_isunordered
#define __builtin_nan __oracle_builtin_nan
#define __builtin_signbit __oracle_builtin_signbit
#define __BUILTIN_VA_STRUCT 1
#define __cplusplus 199711L
#define __DATE__ "Jul 11 2016"
#define __FILE__
#define __has_attribute(x) __oracle_has_attribute(x)
#define __has_nothrow_assign(x) __oracle_has_nothrow_assign(x)
#define __has_nothrow_constructor(x) __oracle_has_nothrow_constructor(x)
#define __has_nothrow_copy(x) __oracle_has_nothrow_copy(x)
#define __has_trivial_assign(x) __oracle_has_trivial_assign(x)
#define __has_trivial_constructor(x) __oracle_has_trivial_constructor(x)
#define __has_trivial_copy(x) __oracle_has_trivial_copy(x)
#define __has_trivial_destructor(x) __oracle_has_trivial_destructor(x)
#define __has_virtual_destructor(x) __oracle_has_virtual_destructor(x)
#define __is_abstract(x) __oracle_is_abstract(x)
#define __is_base_of(x,y) __oracle_is_base_of(x,y)
#define __is_class(x) __oracle_is_class(x)
#define __is_empty(x) __oracle_is_empty(x)
#define __is_enum(x) __oracle_is_enum(x)
#define __is_final(x) __oracle_is_final(x)
#define __is_literal_type(x) __oracle_is_literal_type(x)
#define __is_pod(x) __oracle_is_pod(x)
#define __is_polymorphic(x) __oracle_is_polymorphic(x)
#define __is_standard_layout(x) __oracle_is_standard_layout(x)
#define __is_trivial(x) __oracle_is_trivial(x)
#define __is_union(x) __oracle_is_union(x)
#define __LINE__
#define __LP64__ 1
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __STDC__ 0
#define __sun 1
#define __SUN_PREFETCH 1
#define __SunOS 1
#define __SunOS_5_11 1
#define __SUNPRO_CC 0x5130
#define __SUNPRO_CC_COMPAT 5
#define __SVR4 1
#define __TIME__ "20:58:00"
#define __underlying_type(x) __oracle_underlying_type(x)
#define __unix 1
#define __volatile volatile
#define __volatile__ volatile
#define __x86_64 1
#define __x86_64__ 1
#define _BOOL 1
#define _LARGEFILE64_SOURCE 1
#define _LP64 1
#define _SIGNEDCHAR_ 1
#define _TEMPLATE_NO_EXTDEF 1
#define _WCHAR_T
#define sun 1
#define unix 1

最佳答案

对于你的第二个问题:

如何禁用 -xarch 位以便程序可以在低级处理器上运行?

请参阅第 7 章链接器和库能力处理指南:

https://docs.oracle.com/cd/E53394_01/html/E54813/index.html

这向您展示了如何交付同一函数的多个实例它们被标记为能力位。运行时链接器将根据报告的功能确定使用哪个功能。

如果您确实想自己管理功能位,请参阅第 9 章映射文件,特别是“能力指令”部分。这展示了如何从生成的对象中删除功能。

关于macros - 检测预处理器中的 -xarch 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38318425/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com