0

以下のような x86 RDRAND 実装があります。RDSEED にも同様の実装があります。

inline void RDRAND32(void* output)
{
#if defined(HAVE_GCC_RDRAND_ASM)
    __asm__
    (
        "1:\n"
        ".byte 0x0f, 0xc7, 0xf0;\n"
        "jnc 1b;\n"
        : "=a" (*(uint32_t*)output)
        : : "cc"
    );
#endif
}

発行されたバイトコードはrdrand eax、有能なプロセッサが喜んでそれらを消費します。Sun Studio 12.1 以降は、GCC インライン アセンブリをサポートし、それらも使用します。

Sun のドキュメントによると、 -xarch=avx_iRDRAND を提供する ISA (および-xarch=avx2_iRDSEED) が必要であると書かれています。Sun Studio 12.6 |も参照してください。-xarch x86 のフラグ

この使用例では-xarch=avx_i、リンカー フラグにまだ追加する必要がありますか?RDRAND


重要な場合は、実行時に CPU 機能を保護し、Mapfile を使用して ISA を下げます (実行時のパスが保護されるため)。

$ cat cryptopp.mapfile
# Solaris mapfile to override hardware caps to avoid kills

hwcap_1 = SSE SSE2 OVERRIDE;
4

1 に答える 1