当前位置: 首页 > 知识库问答 >
问题:

如何使用RDRAND内部函数?

罗祺
2023-03-14

我在看H.J.Lu的补丁:更新x86 rdrand intrinsics。我不知道我是否应该使用rdrand\u64、rdrand64\u步骤,或者是否有其他功能。似乎没有为他们编写测试用例。

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

$ man -k rdrand
rdrand: nothing appropriate.

如何使用RDRAND内部函数来生成一个32字节的块?

一个相关的问题是RDRAND和RDSEED内部函数GCC和Intel C。但它没有告诉我如何使用它们,或者如何生成块。

共有1个答案

晋越彬
2023-03-14

如果您查看

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 CC和其他编译器兼容。

_rdrand64_step将填充64位参数,通过指针传递,带有随机位并返回错误代码。32位和16位版本也是如此

更新

这些内部函数生成16/32/64位宽的随机整数的随机数。生成的随机值将写入给定的内存位置,并返回成功状态:如果硬件返回有效的随机值,则返回“1”,否则返回“0”

https://software.intel.com/en-us/node/523864

更新

根据@vy32请求,这对我有效。好吧,我的系统gt自原始答案更新后,现在是Ubuntu 20.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

所以我相信内置已经在以适当的方式处理进位标志,用户应该只检查_rdrandXX_step(ull*)的输出,如手册中所述。

 类似资料:
  • 英特尔C编译器和/或GCC是否像2012/2013年以来的MSVC一样支持以下英特尔内部函数 如果支持这些内部函数,那么支持哪个版本(请使用编译时常量)?

  • 我正在使用Intel Ivy Bridge CPU,希望使用RDRAND操作码(https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide)在C#中。 如何通过C#调用此CPU指令?我在这里看到了一个从c#执行汇编代码的示例:C#

  • 问题内容: 我尝试了解如何使用“内部”包组织代码。让我展示一下我的结构: 在GOPATH树之外。无论我尝试从什么都不导入的任何路径都可行,唯一可行的情况是。我认为我做错了什么,或者总体上弄错了“内部”包装想法。任何人都可以让事情变得更清楚吗? 更新 上面的示例是正确的,我唯一需要的是将文件夹放在下。因此,如果我们仅从子树而不是从外部导入,则该导入路径是可行的。 问题答案: 包必须位于您的包中才能导

  • 问题内容: 我想知道如何访问另一个函数中的一个函数。我看到了这样的代码: 那么,还有另一种方法来调用该 函数吗?我的第二个问题是,为什么在最后一行中我不打电话? 很好的解释深表感谢。 问题答案: 不,您不能直接调用它,因为它是的局部变量。 您需要使用,因为调用时返回了函数对象。要执行此功能对象,您需要 在这里您可以直接调用它,因为您可以访问它,因为它是由函数返回的。返回的对象实际上称为 闭包, 因

  • 问题内容: 我有一个很大的功能,希望仅在需要时才加载。因此,我认为使用include是必经之路。但是我也需要几个支持功能-仅在go_do_it()中使用。 如果它们在包含的文件中,则会出现重新声明错误。参见示例A 如果将支持功能放在include_once中,则可以正常工作,请参见示例B。 如果我对func_1代码使用include_once,则第二次调用将失败。 我对为什么include_onc

  • Im在这段代码中使用了两个函数。用户可以通过点击“+”按钮上传图片。他们也可以通过点击“-”按钮移除图像。但文件上载功能对新行不起作用。用户不能选择任何文件,这些文件不显示在HTML中。请检查我的jsfiddle链接并帮助我。https://jsfidle.net/mhmdsohail/6mee3l8t/14/