2016-06-12 8 views
2

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.3here 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 

답변

0

는, 나는 당신을 위해 AES + SSSE3 바이너리를 만들었습니다.

 
$ cat tmp.c 
#include 
#include 
#include 
int main(int argc, char* argv[]) 
{ 
    // SSE2 
    int64_t x[2]; 
    __m128i y = _mm_loadu_si128((__m128i*)x); 

    // AES 
    __m128i z = _mm_aeskeygenassist_si128(y,0); 

    return 0; 
} 

$ cat tmp2.c 
#include 
#include 
void foo(void) 
{  
     __m128i x; 
     x  = _mm_hadd_epi16 (x, x); 
} 

$ cc tmp.c tmp2.c -xarch=aes 
tmp.c: 
tmp2.c: 

$ file a.out 
a.out:   ELF 32-bit LSB executable 80386 Version 1 [AES SSSE3 SSE2 SSE], dynamically linked, not stripped 

비트가 최종 실행에서 insructions의 실제 존재에 따라 컴파일러 으로 만 담당하는 하드웨어 기능

.

따라서 tmp.oAES 비트가 할당되어 있습니다. 그리고 tmp2.oSSSE3 비트까지 설정되어 있습니다.

함께 연결하면 [AES SSSE3] 바이너리가 생성됩니다. HWCAP 비트는 또는입니다.