RDRAND和RDSEED内在函数GCC和英特尔C ++

时间:2015-03-31 15:49:54

标签: c++ gcc intrinsics icc rdrand

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

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*);

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

2 个答案:

答案 0 :(得分:5)

GCC和英特尔编译器都支持它们。 GCC支持于2010年底推出。它们需要标题<immintrin.h>

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

答案 1 :(得分: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