我在SunOS 5.11(Solaris 11.3)上的Sun Studio 12.3下工作。我正在調整包含負面測試的腳本,其中包括CPU功能的奇怪組合。我們這樣做是爲了瞭解我們是否和如何失敗;並確保有no unexpected surprises。Sun 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.3和here 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