皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Qt 转向间接使用 RDRAND/RDSEED 以提升性能和减少错误

Qt 转向间接使用 RDRAND/RDSEED 以提升性能和减少错误

Qt 工具包正逐渐不再直接依赖 CPU 的 RDRAND 和 RDSEED 指令进行随机数生成,而是改为依赖操作系统提供的熵。

在合并到 Qt 6.11 开发分支并标记为回退到 Qt 6.5 / 6.8 / 6.10 分支的提交中,移除了 QRandomGenerator 对硬件指令的直接使用。这继 AMD Zen 5 受到 RDSEED 问题的影响后,现在正通过更新微码来解决该问题。此外,与依赖操作系统相比,RDSEED/RDRAND 的性能优势并未显现。

本周合并的这次提交是导致 QRandomGenerator 停止直接使用硬件指令的原因:

“QRandomGenerator: 移除对硬件指令的直接使用

硬件随机数生成器指令不一定比我们从操作系统获取的更快。此外,操作系统能够从 CPU 本身以外的源收集熵。更重要的是,这消除了 Qt 处理损坏的硬件随机数生成器的需要,将问题推给操作系统(操作系统可能会禁用 CPUID 位,导致应用程序无法加载)。

[变更日志][QtCore][QRandomGenerator] 该类不再在 x86 系统上直接使用硬件随机数生成器,即使有的话。相反,它将始终使用操作系统提供的生成器(因此性能将因操作系统而异),尽管生成的样本质量应该没有实质性的差异。

在关于该问题的讨论帖中,Linux RNG 专家和 WireGuard 开发者 Jason Donenfeld 提供了一些关于性能差异的基准数据:

RDRAND 和 RDSEED 很慢!对缓冲区填充或其他操作进行基准测试,你会发现即使使用系统调用,getrandom()和/dev/urandom 仍然比 RDRAND 和 RDSEED 快。

Here are timings on my tiger lake laptop to fill a gigabyte:
以下是我塔可拉笔记本电脑上填充一 GB 的时间:

getrandom vdso: 1.520942015 秒
getrandom 系统调用:2.323843614 秒
/dev/urandom:2.629186218 秒
rdrand:79.510470674 秒
rdseed:242.396616879 秒

这里还有为每个调用 4 字节的 25000000 次调用的计时数据——如果你不相信我关于系统调用转换的话:

getrandom vdso 0.371687883 秒
getrandom 系统调用:5.334084969 秒
/dev/urandom:5.820504847 秒
rdrand: 15.399338418 秒
rdseed: 45.145797233 秒”

差异很大,现在 Qt 依赖于更可靠的操作系统依赖方法。

转自  Qt Moves Away From Direct RDRAND/RDSEED Usage For Better Performance & Less Bugs – Phoronix