在回顾了Intel Digital Random Number Generator (DRNG) Software Implementation Guide之后,当调用RDRAND
时,我有几个关于发生器的内部状态会发生什么问题。不幸的是,答案似乎没有在指南中。RDRAND在常春藤桥上的枯竭特征是什么?
根据指导,DRNG里边有服务于为
RDRAND
到漏极随机比特4 128位的缓冲器。RDRAND
本身将提供为16,32或64个取决于目的地寄存器的宽度随机数据的比特:rdrand ax ; put 16 random bits in ax rdrand eax ; put 32 random bits in eax rdrand rax ; put 64 random bits in rax
会使用较大目的地寄存器清空这些128位的缓冲器更迅速?例如,如果我只需要2位随机性,我应该经历在64位寄存器上使用16位寄存器的麻烦吗?这会对DRNG的吞吐量产生什么影响吗?我想避免消耗更多的随机性。
资料说
RDRAND
执行后进位标志将被设置:CF = 1 Destination register valid. Non-zero random value available at time of execution. Result placed in register. CF = 0 Destination register all zeros. Random value not available at time of execution. May be retried.
什么是“不可用”是什么意思?随机数据可能不可用,因为
RDRAND
调用太快用尽这些128位缓冲区?或者不可用意味着DRNG未能通过健康检查并且无法生成任何新数据?基本上,我试图了解CF = 0是否会发生,因为当调用RDRAND
时,缓冲区恰好(暂时)为空。
注:我已审阅answers到this question on throughput and latency of RDRAND,但是我正在寻找不同的信息。
谢谢!
请注意,在IvB上,每个〜110个周期的吞吐量是一个,在Skylake上每个〜460个周期一个(http://agner.org/optimize/)。如果您同时使用多个较小的随机数,那么获得64位并将其切分是一个好主意,或者如果您需要大量随机数,则可以使用'rdseed'来播种更快的PRNG。它只有~16个uops,但是延迟很高,而且大卫在关联问题上的回答表明,当你立即使用结果时,它往往会阻塞管道。人们似乎只是在测量RNG吞吐量,而不是对使用数字的计算有多大影响。 –