【问题标题】:Failing on call to _mm_loadu_si128() with AESNI intrinsics enabled在启用 AESNI 内在函数的情况下调用 _mm_loadu_si128() 失败
【发布时间】:2017-04-01 12:29:16
【问题描述】:

我们正在编译一个 32 位应用程序,该应用程序与 cryptopp 的静态构建链接。

gcc: 4.4.7
CPU: Intel Xeon E5-2680
操作系统: CentoOS 6.5
加密++: 5.6.2

我们的程序在这台机器上编译并运行良好。当我们尝试在

上运行时

CPU: Intel Xeon X5690
操作系统: CentoOS 6.5
gcc: 4.4.6

我们在 cryptopp -> rijndael.cpp -> Rijndael::Base::UncheckedSetKey() 调用 _mm_loadu_si128() 中遇到分段错误

如果我们在 CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE 设置为 0 的情况下构建 cryptopp,一切运行正常。似乎 AES-NI 在此服务器上应该可用,并且对 HasAESNI() 的 cryptopp 调用返回 true。

关于可能导致此问题的原因或如何进一步追踪的任何想法?

【问题讨论】:

  • _mm_loadu_si128MOVDQU。我相信它是一个 SSE2 指令。您是否在 Intel Xeon X5690 机器上编译了 Crypto++ 和您的程序(或者您是否从另一台机器上复制了它)? Intel Xeon X5690 上的微码是最新的吗(我相信该指令是用微码模拟的)?
  • 如果我们在 X5690 上编译,它可以在该机器上运行。在 E5-2680 上编译并复制到 X5690 时出现错误。我会研究一下微码,不太熟悉。

标签: gcc centos intel crypto++


【解决方案1】:

在 E5-2680 上编译并复制到 X5690 时出现错误。

哦,这很有趣。尝试将-mtune=pentium4 添加到CXXFLAGS。 Intel Xeon E5-2680 具有 AVX 指令集;而英特尔至强 X5690 只有 SSE 4.2。 Crypto++ 使用来自 AVX 指令集的双四字乘法 (PCLMULQDQ) 和 AES-NI 指令(其他处理器缺乏)。

如果-mtune=pentium4 不起作用,那么您将不得不通过CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE 禁用。现在我想了想,这就是您可能要做的,因为这是编译时功能选择,而不是运行时功能选择。

【讨论】:

  • 必须坚持使用 CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE。谢谢你的详细解释。
【解决方案2】:

“Intel(R) Xeon(R) CPU E5606 @ 2.13GH”也不支持“AESNI”指令。我在“Intel Xeon E312xx (Sandy Bridge)”上编译了 Crypto++,在“E5606”上得到了同样的错误!在 CMakeLists.txt 文件中禁用“AESNI”,打开“DISABLE_AESNI”选项。 option(DISABLE_AESNI "Disable AES-NI" ON)

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多