2016-06-12 26 views
2

我在SunOS 5.11(Solaris 11.3)上的Sun Studio 12.3下工作。我正在調整包含負面測試的腳本,其中包括CPU功能的奇怪組合。我們這樣做是爲了瞭解我們是否和如何失敗;並確保有no unexpected surprisesSun Studio下的SSE3/SSSE3 + AES/RDRAND/RDSEED

我想找出一種方法來啓用本機指令集加上AES,RDRAND和RDSEED。本機指令集由Xeon 5100提供,實際上是SSE3/SSSE3加上一些額外的指令。

編譯所有源文件/opt/solarisstudio12.3/bin/CC -DNDEBUG -g3 -xO2 -template=no%extdef -native -m64 -KPIC -xarch=aes -D__AES__=1結果:

$ ./cryptest.exe 
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x1000000 [ SSE4.2 ] 
Killed 

這是一種預期,因爲太陽錄音室承擔的功能和可用性的進展。當我修改生成cpu.cpp(用於功能測試),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下添加AES/RDRAND/RDSEED來使用SSE3/SSSE3?它甚至有可能嗎?


我們使用的模式到現在爲止一直運行良好,它將編譯時支持與運行時支持相結合。所以AES代碼如下:

#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 
    ... 
} 

對於像鐺和GCC,我們只是-march=native -maes -mrdrnd -mrdseed編譯器。我很高興接受沒有發生交叉授粉。

然後,我在Oracle的留言板上顯示兩條消息,指示RDRAND在Sun Studio 12.3和12.4(here for 12.3here for 12.4)下損壞。所以我必須確保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在最後的可執行的實際存在的編譯器 assinged。

所以tmp.oAES位分配。並且tmp2.o已經達到SSSE3比特。

當它們連接在一起時,它們產生[AES SSSE3]二進制。因爲HWCAP位是在一起。

相關問題