2

根据微软的x64 (amd64) Intrinsics List,微软为 RDRAND 提供了一个内在函数:

  • _rdrand16_step
  • _rdrand32_step
  • _rdrand64_step

但是,该页面没有讨论检测内在函数的可用性。[2]有一个脚注,但它说它仅适用于 Intel CPU。

我有两个问题。首先,我如何检测内在函数的可用性。也就是说,我应该使用什么预处理器宏来保护对 say 的调用_rdrand64_step

其次,如何在 AMD CPU 下访问 RDRAND。根据 AMD 手册,AMD 也提供了它。

(更幽默的是,微软将页面命名为 amd64 Intrinsic List。为什么他们不包括 AMD 时称它为 AMD64 Intrinsic List ???)


对于 AMD 和 RDRAND 指令,请参考AMD64 架构程序员手册第 3 卷:通用和系统指令,第 278 页。

4

2 回答 2

2

首先,我如何检测内在函数的可用性。也就是说,我应该使用什么预处理器宏来保护对 _rdrand64_step 的调用。

以下是 RDRAND 内在函数所需的编译器版本:

  • 微软于 2012 年 8 月添加了 RDRAND,VS2012。测试_MSC_VER >= 1700.
  • GCC 在 2010 年 12 月添加了 RDRAND,GCC 4.6。
  • Clang 在 2012 年 7 月添加了 RDRAND,Clang 3.2。
  • 英特尔于 2011 年 9 月添加了 RDRAND,ICC 12.1。

其次,如何在 AMD CPU 下访问 RDRAND。根据 AMD 手册,AMD 也提供了它。

提供 RDRAND 指令的 AMD CPU 似乎即将问世。也就是说,目前没有附带该功能的 CPU。

Microsoft 文档明确指出内在函数仅适用于 Intel CPU。鉴于英特尔和 AMD 之间的反竞争历史,为确保 AMD 支持,ASM 应手工制作并与 MASM/ML 和 MASM64/ML64 组装。

于 2015-10-19T18:20:13.570 回答
1

您可以使用以下命令检查 MS 编译器的版本:

  1. MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) 详细

  2. 我不确定如何将它与 AMD 架构一起使用。如果我得到一些解决方案,会告诉你

  3. 您可以在这篇文章中找到为什么 MS 文档将其称为 amd64 的答案。

于 2015-10-12T06:28:11.750 回答