12

在查看了英特尔数字随机数生成器 (DRNG) 软件实施指南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 位随机性,我应该经历使用 16 位寄存器而不是 64 位寄存器的麻烦吗?这会对 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 未通过健康检查并且无法生成任何新数据?RDRAND基本上,我试图了解 CF=0 是否会因为调用时缓冲区碰巧(暂时)为空而发生。

注意:我已经查看了有关 RDRAND 吞吐量和延迟的问题的答案,但我正在寻找不同的信息。

谢谢!

4

3 回答 3

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 内核没有关闭并读取更多寄存器,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 时缓冲区碰巧(暂时)为空”,但它可能会发生在未来的硅片上,所以设计你的软件来应对。

于 2013-01-21T17:11:21.643 回答
4

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

选择缓冲区长度 4 是因为在 800MBytes/s(本地连接总线的速度)下,考虑到最坏情况的调度偏移,在以最大速率拉动时,4 的深度足以防止下溢,因此有一个恒定、平滑的 800MByte /s 供应,不会中断输出。

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

于 2013-01-26T06:36:23.973 回答
2

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

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

关于1:

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

于 2013-01-20T07:47:23.843 回答