3

英特尔 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*);

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

4

2 回答 2

5

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

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

于 2015-03-31T18:03:15.677 回答
2

Microsoft 编译器没有对 RDSEED 和 RDRAND 指令的内在支持。

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

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

对于 Intel Compiler,您可以使用 header 来确定版本。您可以使用以下宏来确定版本和子版本:

__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

于 2015-07-06T22:27:51.817 回答