2013-01-19 39 views
10

在回顾了Intel Digital Random Number Generator (DRNG) Software Implementation Guide之后,当调用RDRAND时,我有几个关于发生器的内部状态会发生什么问题。不幸的是,答案似乎没有在指南中。RDRAND在常春藤桥上的枯竭特征是什么?

  1. 根据指导,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的吞吐量产生什么影响吗?我想避免消耗更多的随机性。

  2. 资料说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时,缓冲区恰好(暂时)为空。

注:我已审阅answersthis question on throughput and latency of RDRAND,但是我正在寻找不同的信息。

谢谢!

+2

请注意,在IvB上,每个〜110个周期的吞吐量是一个,在Skylake上每个〜460个周期一个(http://agner.org/optimize/)。如果您同时使用多个较小的随机数,那么获得64位并将其切分是一个好主意,或者如果您需要大量随机数,则可以使用'rdseed'来播种更快的PRNG。它只有~16个uops,但是延迟很高,而且大卫在关联问题上的回答表明,当你立即使用结果时,它往往会阻塞管道。人们似乎只是在测量RNG吞吐量,而不是对使用数字的计算有多大影响。 –

回答

18

第1部分。 它是否有区别拉16,32或64位?

在常春藤桥号中,CPU芯拉过内部通信链路到DRNG 64位,目的地寄存器的大小无关。所以如果你阅读32位,它会拉动64位并丢弃上半部分。如果您读取16位数据,则​​会拉出64位并丢弃顶部3/4。

这在指导文档中没有描述,因为它在未来的产品中可能不会继续存在。芯片可以被设计成存储和使用64位字的未使用部分。然而,今天这样做并没有显着的性能需求。

对于最高吞吐量,最有效的策略是从并行线程中提取。这是因为芯片上的总线层次结构具有并行性。大多数时间的指令是通过公交车的过境时间。并行执行传输将导致吞吐量随着线程数的增加而线性增加,最高可达800MBytes/s。第二件事是使用64位RdRands,因为它们每条指令获得更多的数据。

第2部分。 CF = 0是什么意思?

这意味着'随机数据不可用'。这是因为CPU内核没有关闭和读取更多寄存器的详细信息,为什么无法获得数字,CPU内核不可用,因为没有任何信息可以处理。

如果你吸干DRNG输出缓冲区,你会得到一个下溢(CF = 0),但你可以期待下一个RdRand成功,因为DRNG很快。

如果DRNG失败(例如,晶体管在熵源中弹出并且它不再是随机的),那么在线健康测试将检测到这一点并关闭DRNG。然后你所有的RdRand调用都会产生CF = 0。

但是,在Ivy Bridge上,您将无法将缓冲区下溢。 DRNG比它所连接的巴士快一点。每单位时间(并行线程)提取更多数据的影响将会增加每个RdRand的执行时间,因为总线上的争用会导致指令必须在DRNG的本地总线上排队等待。 DRNG将无法如此迅速地下潜。你将渐近地达到800 MBytes/s。

这也没有在文档中描述,因为它可能不会在未来的产品中继续存在。我们可以设想哪些产品的总线速度更快,内核速度更快,DRNG能够下溢。这些东西还不知道,所以我们不能对它们提出索赔。

保持真实的是,软件实现者指南中给出的基本循环(最多尝试10次,然后报告堆栈故障)将在未来的产品中继续工作,因为我们已经声明它会,所以我们将设计所有未来的产品来满足这一点。

因此,不会发生CF = 0,因为“在Ivy Bridge上调用RDRAND时缓冲区(暂时是空的)”,但它可能发生在未来的芯片上,因此请设计您的软件来应对。

2

关于2: http://download.intel.com/products/processor/manual/253665.pdf,7.3.17

的CF表明,对于随机数据的需求超过DRNG的吞吐量。

关于1:

如果是表现你很关心,为什么不读从DRNG 64位随机值,那么你可以阅读从32倍的2位,则需要再次调用指令之前。 每次需要位时,不必调用新的rdrand。

+0

感谢您的链接!至于取得一个大的结果并根据需要斩断它,那就需要在某个地方维护我自己的状态,这很复杂,需要某种类型的同步。我想仅仅依靠DRNG的硬件管理状态,而不是过度消耗随机比特。 – cambecc

5

不要在DRNG输出的4 * 128位FIFO中读取任何内容。它当然存在(我把它放在那里),但它不是具有软件可见效果的东西。 DRNG背后的逻辑不能顺利产生数据。根据SP800-90规范,它有时会安排其他事情,如重新播种或调节。所以负载下的数据流是不规则的。

由于在800MBytes/s(本地连接总线的速度)4的深度足以防止在最大速率下拉时出现下溢(给定最坏情况下的调度偏移),因此选择了4的缓冲区长度,稳定,平稳的800MByte/s供应,不会中断输出。

如果连接的总线速度较慢,缓冲区会更短,因为较短的缓冲区足以防止下溢。