SunOS 5.11 (Solaris 11.3)에서 Sun Studio 12.3에서 작업하고 있습니다. 나는 네거티브 테스트를 포함하는 스크립트를 조정 중이며, CPU 기능의 이상한 조합을 포함합니다. 우리는 실패한 경우와 실패를 이해하기 위해이 작업을 수행합니다. no unexpected surprises을 확인하십시오.Sun Studio에서 SSE3/SSSE3 + AES/RDRAND/RDSEED
AES, RDRAND 및 RDSEED를 기본 명령어 세트에 추가하는 방법을 알아 내려고합니다. 네이티브 인스트럭션 세트는 효과가있는 제온 5100입니다. SSE3/SSSE3에는 몇 가지 추가 지침이 포함되어 있습니다.
$ ./cryptest.exe
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x1000000 [ SSE4.2 ]
Killed
이 썬 스튜디오 기능과 가용성의 진행을 가정하기 때문에 예상의 종류 :
에 /opt/solarisstudio12.3/bin/CC -DNDEBUG -g3 -xO2 -template=no%extdef -native -m64 -KPIC -xarch=aes -D__AES__=1
결과 모든 소스 파일을 컴파일. makefile을 수정하여 기능 시험에 사용하는 rijndael.cpp
(AES 구현 제공) 및 test.cpp
(테스트 수행)을 -xarch=aes
으로 수정하면 SSE4가 test.cpp
으로 들어감에 따라 프로그램이 계속 충돌합니다.
원하지 않는 명령 세트를 제거하기 위해 -xarch=aes -D__AES__=1 -xarch=no%sse4_1 -xarch=no%sse4_2
을 사용하려고했지만 예상대로 컴파일하지 못했습니다. no%sse4_1
은 -template=no%extdef
에서 오기 때문에 접두어 no%
이 작동하지 않는 것으로 보입니다.
Sun Studio에서 SSE3/SSSE3을 AES/RDRAND/RDSEED와 함께 어떻게 사용합니까? 심지어 가능할까요?
우리가 지금까지 잘 해낸 패턴은 컴파일 타임 지원과 런타임 지원을 결합하는 것입니다. 연타와 GCC, 우리는 단순히 -march=native -maes -mrdrnd -mrdseed
같은 컴파일러를 들어
#if (__AES__ >= 1) || (SUNPRO_CC >= 0x512)
# define HAVE_AES 1
#endif
#if defined(HAVE_AES)
if (HasAES())
{
// Optimized implementation
...
return;
}
#endif
{
// Fall into C/C++ implementation
...
}
: 그래서 AES 코드는 다음과 같다됩니다. 나는 어떤 교도소 침범도 받아 들일 수 없었던 것을 기쁘게 생각합니다.
그런 다음 Sun의 12.3 및 12.4 (here for 12.3 및 here for 12.4)에서 RDRAND가 손상되었다는 메시지가 오라클 게시판에 표시됩니다. 따라서 RDRAND를 테스트 할 수 있도록 RDRAND가 활성화되어 있는지 확인해야하며 그럴 경우 -xarch=aes
이 필요합니다. _mm_aeskeygenassist_si128 intrinsic requires at least -xarch=aes 기준
이 가능하지 않을 수도있다. 이 질문은 문제가없는 경험을 보장하기 위해 최선을 다하고 있습니다. 이
$ isainfo -v
64-bit amd64 applications
ssse3 ahf cx16 sse3 sse2 sse fxsr mmx cmov amd_sysc cx8 tsc fpu
32-bit i386 applications
ssse3 ahf cx16 sse3 sse2 sse fxsr mmx cmov sep cx8 tsc fpu