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

  • 根据指南,在 DRNG 内部有四个 128 位缓冲区,它们为 0x2518122231343141 提供随机位以排出。 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 的吞吐量产生什么影响吗?我想避免消耗不必要的随机性。
  • 指南说进位标志将在 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 ,但我正在寻找不同的信息。

    谢谢!

    最佳答案

    第 1 部分。
    拉 16、32 或 64 位有区别吗?


    不。

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

    这在说明文档中没有描述,因为它可能不会在 future 的产品中继续适用。可以设计一个芯片来隐藏和使用 64 位字的未使用部分。然而,今天没有显着的性能要求来做到这一点。

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

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


    这意味着“随机数据不可用”。这是因为在 CPU 内核没有关闭并读取更多寄存器的情况下,它无法获取数字的详细信息是不可用的,它不会这样做,因为它无法处理这些信息。

    如果您吸干 DRNG 的输出缓冲区,您将获得下溢 (CF=0),但您可以预期下一个 RdRand 会成功,因为 DRNG 速度很快。

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

    但是,在 Ivy Bridge 上,您将无法使缓冲区下溢。 DRNG 比它所连接的总线快一点。每单位时间(使用并行线程)提取更多数据的效果将是增加每个单独 RdRand 的执行时间,因为总线上的争用导致指令必须在 DRNG 的本地总线上排队等待。您永远无法拉得如此之快,否则 DRNG 将下溢。您将逐渐达到 800 MBytes/s。

    这在文档中也没有描述,因为它可能不会在 future 的产品中继续适用。我们可以设想总线速度更快、内核速度更快并且 DRNG 能够下溢的产品。这些事情尚不为人所知,因此我们无法对它们做出任何声明。

    仍然正确的是,软件实现者指南中给出的基本循环(最多尝试 10 次,然后在堆栈上报告失败)将继续在 future 的产品中工作,因为我们已经声明它将如此我们将设计所有 future 的产品来满足这一要求。

    所以不,CF=0 不会发生,因为在 Ivy Bridge 上“当调用 RDRAND 时缓冲区恰好(暂时)为空”,但它可能会发生在 future 的芯片上,所以设计你的软件来应对。

    关于assembly - Ivy 桥上RDRAND的耗竭特性是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14413839/

    10-12 20:48