我在看H.J. Lu的修补程序:更新x86 rdrand。我无法判断是否应该使用_rdrand_u64、_rdrand64_step,或者是否还有其他函数。似乎没有为他们编写的测试用例。
似乎也缺少手册页(来自Ubuntu 14,GCC 4.8.4):
$ man -k rdrand
rdrand: nothing appropriate.如何使用RDRAND本质来生成一个32字节的块?
一个相关的问题是RDRAND与RDSEED本质-- GCC与英特尔C++。但它并没有告诉我如何使用它们,也没有告诉我如何生成块。
发布于 2015-07-04 04:37:24
如果看一下<immintrin.h> (我的是‘/usr/lib/ GCC /x86_64-linux-gnu/4.9/include/’,Ubuntu 15.04 64位),就会定义一些兼容的函数(与MSVC、Intel )将数据传回GCC内置程序。
extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_rdrand64_step (unsigned long long *__P)
{
return __builtin_ia32_rdrand64_step (__P);
}用于64位参数,另外两位用于16位和32位参数
_rdrand16_step (unsigned short *__P)
_rdrand32_step (unsigned int *__P)您应该使用这些代码,以便您的代码与MSVC、Intel和其他编译器兼容。
_rdrand64_step将用随机位填充64位参数,通过指针传递,并返回错误代码。32位和16位版本的同上
更新
“这些内部元素生成16/32/64位宽随机整数的随机数。生成的随机值被写入给定的内存位置,并返回成功状态:'1‘如果硬件返回有效的随机值,'0’则返回。”
https://software.intel.com/en-us/node/523864
更新
Per @ me 32请求,这是为我工作。嗯,我的系统gt从原来的答案开始更新,所以现在是Ubuntu20.04.1,x64,GCC v9.3,编译标志
gcc -m64 -mrdrnd -O3 a.c代码
#include <stdio.h>
#include <immintrin.h>
int main() {
unsigned long long result = 0ULL;
int rc = _rdrand64_step (&result);
printf("%i %llu", rc, result);
return (rc != 1);
}关于CF标志和“忽略这是一个常见的实现错误,在测试中不会出现,但是在负载下运行DRNG时确实会显示出来”,我相信这就是内置的功能。如果您注释掉printf并使用-S标志编译到汇编程序,代码将类似于,
xorl %eax, %eax
rdrand %rax
movl $1, %edx
...
cmovc %edx, %eax这意味着%eax为零,%edx设置为1,如果CF被引发,则via cmovc %edx可能设置为0。这个值从函数中返回。
因此,我认为内置已经在正确地处理进位标志,用户应该检查_rdrandXX_step(ull*)的输出,如手册所描述的那样。
https://stackoverflow.com/questions/31214457
复制相似问题