2

我在 SunOS 5.11 (Solaris 11.3) 上的 Sun Studio 12.3 下工作。我正在调整一个包含负面测试的脚本,其中包括 CPU 功能的奇怪组合。我们这样做是为了了解我们是否以及如何失败;并确保没有意外的惊喜

我试图找出一种方法来启用本机指令集以及 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

这是意料之中的,因为 Sun Studio 假定功能和可用性不断发展。当我修改生成文件以构建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 下使用 SSE3/SSSE3 并添加 AES/RDRAND/RDSEED?甚至可能吗?


我们使用的模式,到目前为止运行良好,是将编译时支持与运行时支持结合起来。所以 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
    ...
}

对于像 Clang 和 GCC 这样的编译器,我们只需-march=native -maes -mrdrnd -mrdseed. 我很高兴接受没有发生异花授粉。

然后我在 Oracle 的留言板上看到两条消息,表明 RDRAND 在 Sun Studio 12.3 和 12.4 下被破坏(这里是 12.3这里是 12.4)。因此,我必须确保启用 RDRAND 以确保对其进行测试,这需要-xarch=aes.


基于_mm_aeskeygenassist_si128 内在至少需要 -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 
4

1 回答 1

1

在那里,我为您创建了一个 AES+SSSE3 二进制文件。

$猫tmp.c
#包括
#包括
#包括
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);

   返回0;
}

$猫tmp2.c
#包括
#包括
无效富(无效)
{       
        __m128i x;
        x = _mm_hadd_epi16 (x, x);
}

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

$文件a.out
a.out:ELF 32 位 LSB 可执行 80386 版本 1 [AES SSSE3 SSE2 SSE],动态链接,未剥离

硬件功能位由编译器根据最终可执行文件中指令的实际存在来分配。

所以tmp.o分配了AES位。并且tmp2.o具有多达SSSE3位。

当它们链接在一起时,它们会产生[AES SSSE3]二进制文件。因为HWCAP位是OR一起的。

于 2016-07-03T20:24:20.740 回答