如何基于 Apple Silicon (M1+) 上的 RDRAND ARM64 内在函数创建随机数?
自arm-v8.5-A开始支持RDRAND,但是如何在m1机器上使用它?
由于支持arm-v8.5-A RDRAND,[...]。
不,不。
RDRAND
是英特尔的东西。 ARMv8.5-A 引入了FEAT_RNG
,但这是可选。 ID_AA64ISAR0_EL1.RNDR
字段表示 M1 和 M2 代 Apple Silicon Mac 都没有实现此功能。现在,如果您的目标是支持FEAT_RNG
并且您正在使用clang,那么您可以使用以下两个内置函数:
int __builtin_arm_rndr(uint64_t *val);
int __builtin_arm_rndrrs(uint64_t *val);
这些函数(在当前的实现中)在失败时返回 1
,在成功时返回
0
,如果成功,则在
val
指向的地址指针处存储一个随机值。您可以使用
clang -Xclang -target-feature -Xclang +rand
编译以下测试二进制文件(它是 C,但在 C++ 中的工作方式相同):
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint64_t u = 0;
int r = __builtin_arm_rndr(&u);
printf("%d, 0x%016llx\n", r, u);
return 0;
}
它无法在 M1 或 M2 硬件上运行。至于
支持的获取随机数的方式:
/dev/random
读取。
std::random_device
。