assembly - Ivy 桥上RDRAND的耗竭特性是什么?

标签 assembly x86 x86-64 intel rdrand

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

  • 根据指南,在 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 的吞吐量产生什么影响吗?我想避免消耗不必要的随机性。
  • 指南说进位标志将在 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/

    相关文章:

    windows - x64 程序集中的 'shadow space' 是什么?

    assembly - 为什么英特尔微处理器的 64 位模式不支持 MOV AH,1?

    c - 当 C 代码编译成机器代码时,栈上无缘无故地保留了 20 个字节

    assembly - 使 objdump 在每个助记符上使用像 l 这样的操作数大小后缀,即使它没有歧义?

    c++ - AVX2 中排序数组的高效稳定总和

    c - 将 x86 程序下面的端口移植到 mips32

    linux - sys_brk 的对齐要求是什么

    compiler-construction - 编译器也有汇编器吗?

    linux - 程序集 - 内联 asm - 从一个数组复制到另一个数组?

    assembly - 如何在 64 位 NASM 中使用 malloc 和 free?