首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用RDRAND的本质?

如何使用RDRAND的本质?
EN

Stack Overflow用户
提问于 2015-07-03 21:37:30
回答 1查看 6.9K关注 0票数 6

我在看H.J. Lu的修补程序:更新x86 rdrand。我无法判断是否应该使用_rdrand_u64_rdrand64_step,或者是否还有其他函数。似乎没有为他们编写的测试用例。

似乎也缺少手册页(来自Ubuntu 14,GCC 4.8.4):

代码语言:javascript
复制
$ man -k rdrand
rdrand: nothing appropriate.

如何使用RDRAND本质来生成一个32字节的块?

一个相关的问题是RDRAND与RDSEED本质-- GCC与英特尔C++。但它并没有告诉我如何使用它们,也没有告诉我如何生成块。

EN

回答 1

Stack Overflow用户

发布于 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内置程序。

代码语言:javascript
复制
extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_rdrand64_step (unsigned long long *__P)
{
     return __builtin_ia32_rdrand64_step (__P);
}

用于64位参数,另外两位用于16位和32位参数

代码语言:javascript
复制
_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,编译标志

代码语言:javascript
复制
gcc -m64 -mrdrnd -O3 a.c

代码

代码语言:javascript
复制
#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标志编译到汇编程序,代码将类似于,

代码语言:javascript
复制
xorl    %eax, %eax
rdrand  %rax
movl    $1, %edx
...    
cmovc   %edx, %eax

这意味着%eax为零,%edx设置为1,如果CF被引发,则via cmovc %edx可能设置为0。这个值从函数中返回。

因此,我认为内置已经在正确地处理进位标志,用户应该检查_rdrandXX_step(ull*)的输出,如手册所描述的那样。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31214457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档