gpt4 book ai didi

gcc - 如何使用 RDRAND 内在函数?

转载 作者:行者123 更新时间:2023-12-02 15:50:01 25 4
gpt4 key购买 nike

我正在看H.J. Lu的PATCH: Update x86 rdrand intrinsics 。我不知道是否应该使用 _rdrand_u64_rdrand64_step,或者是否还有其他函数。似乎没有为他们编写的测试用例。

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

$ man -k rdrand
rdrand: nothing appropriate.

如何使用 RDRAND 内在函数生成(例如)32 字节的 block ?

<小时/>

相关问题是RDRAND and RDSEED intrinsics GCC and Intel C++ 。但它没有告诉我如何使用它们,或者如何生成 block 。

最佳答案

如果你看<immintrin.h> (我的位于`/usr/lib/gcc/x86_64-linux-gnu/4.9/include/',Ubuntu 15.04 64位),定义了兼容的(MSVC,Intel CC)函数,这些函数将数据传递回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 CC 和其他编译器兼容。

_rdrand64_step将用随机位填充通过指针传递的 64 位参数并返回错误代码。 32 位和 16 位版本同上

更新

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

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

更新

根据@vy32的请求,这对我有用。好吧,我的系统自原始答案以来已更新,所以现在是 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

这意味着 %eax归零,%edx设置为 1,然后通过 cmovc %edx如果 CF 升高,则可能会设置为 0。这个值是从函数返回的。

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

请注意文件 immintrin.h是定义处理器内部函数的各种头文件的集合。包含 RDRAND 内在函数的当前 header 是 x86gprintrin.h不应该包含这些内容。

关于gcc - 如何使用 RDRAND 内在函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com