【问题标题】:RDRAND and RDSEED intrinsics GCC and Intel C++RDRAND 和 RDSEED 内在函数 GCC 和 Intel C++
【发布时间】:2026-02-12 07:10:02
【问题描述】:

英特尔 C++ 编译器和/或 GCC 是否像 MSVC 自 2012 / 2013 年以来那样支持以下内在函数?

int _rdrand16_step(uint16_t*);
int _rdrand32_step(uint32_t*);
int _rdrand64_step(uint64_t*);
int _rdseed16_step(uint16_t*);
int _rdseed32_step(uint32_t*);
int _rdseed64_step(uint64_t*);

如果支持这些内在函数,那么它们支持哪个版本(请使用编译时常量)?

【问题讨论】:

标签: c++ gcc intrinsics icc rdrand


【解决方案1】:

GCC 和 Intel 编译器都支持它们。 GCC 支持是在 2010 年底引入的。它们需要标头 <immintrin.h>

GCC 支持至少从 4.6 版开始就已经存在,但似乎没有任何特定的编译时常量 - 您可以查看 __GNUC_MAJOR__ > 4 || (__GNUC_MAJOR__ == 4 && __GNUC_MINOR__ >= 6)

【讨论】:

  • 感谢您的回答,您提供的正是我需要的那种编译时间常数。显然,rdseed 看起来需要 4.8。你知道 Intel XE Composer Studio 2013 Update 1 的 versioning-compile-constant(rdseed 的介绍)吗?
  • 您还需要检查预处理器定义__RDRND__。没有它,内在函数将不可用(即使 CPU 支持它)。您可能需要使用-mrdrnd 进行编译以确保__RDRND__(即使CPU 支持它)。当 CPU 不支持该指令时,您也可以使用-mrdrnd。另请参阅Clang Bug 25152 - RDRAND intrinsic and "error: clang frontend command failed with exit code 70"
  • 或者更好,-march=native 如果在目标机器上构建。
【解决方案2】:

Microsoft 编译器不支持 RDSEED 和 RDRAND 指令。

但是,您可以使用 NASM 或 MASM 来实现这些指令。汇编代码位于:

https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide

对于英特尔编译器,您可以使用标头来确定版本。您可以使用以下宏来确定版本和子版本:

__INTEL_COMPILER //Major Version
__INTEL_COMPILER_UPDATE // Minor Update.

例如,如果你使用 ICC15.0 Update 3 编译器,它会显示你有

__INTEL_COMPILER  = 1500
__INTEL_COMPILER_UPDATE = 3

有关预定义宏的更多详细信息,您可以访问:https://software.intel.com/en-us/node/524490

【讨论】:

  • 所以__INTEL_COMPILER_BUILD_DATE >= 20121023 实际上会包含任何比 Intel XE composer studio 2013 Update 1 更新的编译器? Src1Src2
  • 刚刚找到this presentation。看起来我需要 1300 和 2 作为两个参数(RDSEED)。我需要 1200 和 2 用于 RDRAND :) Src
  • ... 并且:MS 编译器确实具有对 RDRAND (VS2012) 和 RDSEED (2013) 的内在支持。我通过在我的头文件中找到正确的内在函数来验证这一点。
  • @SEJM 你有关于 MS 支持 RDRAND 和 RDSEED 的文档吗??
  • 我当然愿意 :) 官方 MSDN 文档列出了 _rdrandXX_step()_rdseedXX_step()x86x64。确保检查其他版本相信我 VS2012 确实没有RDSEED