我在Solaris 11上使用SunStudio12.4和12.5,我们有一个源文件,它提供了CRC32的一个直接的C/C++实现,或者是一个使用英特尔本质的优化版本的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发布于 2016-07-13 12:59:27
关于你的第二个问题:
如何禁用-xarch位,以便程序可以在下一级处理器上运行?
参见第7章链接器和库指南的能力处理:
这向您展示了如何传递同一个函数的多个实例,这些实例被标记为功能位。运行时链接器将根据所报告的功能解析所使用的函数。
如果您真的想自己管理功能位,请参阅第9章Mapfiles中的特定章节功能指令。这说明了如何从生成的对象中删除功能。
发布于 2016-07-13 13:46:42
我相信,对于特定情况(第二部分),实现所需功能的唯一简单方法是:使用显式设置"-xarch=sse4.2“进行编译(这允许编译器展开SSE4.2本质),然后将HWCAP位降到最低的体系结构(这使得程序可以在预-SSE4.2硬件上运行)。
有关剥离HWCAP,请参阅:01/html/816-5165/elfedit-1.html
(示例2删除硬件功能位)
https://stackoverflow.com/questions/38318425
复制相似问题