Solaris 11에서 Sun Studio 12.4 및 12.5를 사용하고 있습니다. 인텔 고유의 내장 함수를 사용하여 CRC32의 C/C++ 구현 또는 CRC32의 최적화 된 버전을 제공하는 소스 파일이 있습니다. 런타임에는 함수 포인터가 적절한 구현으로 채워집니다.전 처리기에서 -xarch 옵션을 감지합니까?
이중 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는 하지이 __SSE4_1__
및 __SSE4_2__
같은 관습 GCC의 정의를 정의한다. 또한 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
감사 존 : HWCAP 볼 제거에 대한
. 우리는 런타임시 코드 경로를 보호하므로 일반적으로 컴파일러 만 있으면 ASM 또는 내장 함수를 사용할 수 있습니다. 즉, SSE2를 빌드하고 최적화 된 SSE3 및 SSE4 구현과 같이 나머지는 처리 할 수 있습니다. 예를 들어 [crc.cpp] (http://github.com/weidai11/cryptopp/blob/master/crc.cpp) 및 [blake2.cpp] (http://github.com/weidai11/cryptopp/)를 참조하십시오. blob/master/blake2.cpp). – jww당신이 참조하는 가드가 HasSSE2()와 HasSSE4() 같은 함수라고 가정합니다. 이러한 런타임에서 하드웨어 기능을 확인하면 Studio에서 -Mmapfile 옵션을 추가하여 컴파일하면됩니다. mapfile은 "HW - = SSE2"와 같은 CAPABILITY 항목을 포함합니다. 대체 기능을 제공하는 가장 낮은 성능의 시스템에서 실행해야하는 각 기능을 마스크하십시오. –
감사합니다. 솔라리스에 관해 배워야 할 부분이 너무 많습니다. 수년간, 그것은 C/C++ 구현만을 가지고있는 빨간 머리 단계 자식이었습니다. 학습 활동으로, 나는 그것을 일류 시민으로 만들고 싶었고 모든 속도 향상을 얻었습니다. (GCC 인라인 어셈블리를 처음 사용하는 Sun Studio 12.1 이상). – jww