在常春藤桥上RDRAND的耗尽特征是什么?

时间:2013-01-19 11:26:40

标签: assembly x86 x86-64 intel rdrand

在查看Intel Digital Random Number Generator (DRNG) Software Implementation Guide之后,我对调用RDRAND时生成器的内部状态会发生什么有几个问题。不幸的是,答案似乎不在指南中。

  1. 根据指南,在DRNG内部有四个128位缓冲区,用于为RDRAND提供排除的随机位。 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时缓冲区恰好是(暂时)为空。

  3. 注意:我已审核answersthis question on throughput and latency of RDRAND,但我正在寻求不同的信息。

    谢谢!

3 个答案:

答案 0 :(得分:19)

第1部分。 拉出16位,32位还是64位会有所不同吗?

没有

在Ivy Bridge上,无论目标寄存器的大小如何,CPU内核通过内部通信链路将64位拉到DRNG。因此,如果您读取32位,则会拉出64位并丢弃上半部分。如果您读取16位,它将拉出64并抛出顶部3/4。

说明文档中未对此进行描述,因为在将来的产品中可能不会继续存在。可能设计了一个芯片,用于存储和使用64位字的未使用部分。然而,今天没有显着的性能要求。

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

第2部分。 什么CF = 0意味着什么?

这意味着'随机数据不可用'。这是因为CPU内核无法获取数字的详细信息在没有关闭和读取更多寄存器的情况下无法使用,而这是不可能的,因为它没有任何信息可以处理。 / p>

如果您将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时缓冲区恰好是(暂时)为空”,但它可能会在未来的芯片上发生,所以设计你的软件来应对。

答案 1 :(得分:5)

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

选择4的缓冲区长度是因为800MBytes / s(本地连接总线的速度)4足够深以防止在以最大速率拉动时下溢,给定最坏情况的调度偏移,所以有一个常数,平滑800MByte / s供电,输出无中断。

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

答案 2 :(得分:2)

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

CF表示对随机数据的需求超过了DRNG的吞吐量。

关于1:

如果是您关心的性能,为什么不从DRNG读取64位随机值,那么在需要再次调用指令之前,您可以从32次读取2位。 每次需要位时都不必调用新的rdrand。