Apple Silicon 上的 RDRAND 内在函数 - 如何在 C++ 中生成随机数?

问题描述 投票:0回答:1

如何基于 Apple Silicon (M1+) 上的 RDRAND ARM64 内在函数创建随机数?

自arm-v8.5-A开始支持RDRAND,但是如何在m1机器上使用它?

c++ random apple-m1 arm64
1个回答
0
投票

由于支持arm-v8.5-A RDRAND,[...]。

不,不。

RDRAND
是英特尔的东西。 ARMv8.5-A 引入了
FEAT_RNG
,但这是可选
ID_AA64ISAR0_EL1.RNDR
字段表示 M1 和 M2 代 Apple Silicon Mac 都没有实现此功能。
另请注意,M1 仅兼容 ARMv8.4-A,而不兼容 ARMv8.5-A。我被告知您可以从您支持的版本之上的一个小版本中挑选功能,但这并不意味着 M1 ARMv8.5-A 兼容。另一方面,M2 似乎确实兼容 ARMv8.5-A。

现在,如果您的目标是支持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 硬件上运行。

至于

支持的获取随机数的方式:

© www.soinside.com 2019 - 2024. All rights reserved.