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

cam*_*ecc 12 x86 assembly x86-64 intel rdrand

在查看英特尔数字随机数发生器(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
    
    Run Code Online (Sandbox Code Playgroud)

    使用更大的目标寄存器会更快地清空这些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.
    
    Run Code Online (Sandbox Code Playgroud)

    "不可用"是什么意思?随机数据是否可用,因为RDRAND调用过快地耗尽了这些128位缓冲区?或者不可用意味着DRNG未通过健康检查而无法生成任何新数据?基本上,我试图理解CF = 0是否只是因为缓冲区在RDRAND调用时碰巧(暂时)为空而发生.

注:我已经查阅了答案,以吞吐量和RDRAND的延迟这个问题,但我正在寻找不同的信息.

谢谢!

小智 20

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

没有.

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

这在说明文档中没有描述,因为它在将来的产品中可能不会继续存在.可能设计了一个芯片,用于存储和使用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.

文档中也没有对此进行描述,因为在未来的产品中可能不会继续存在.我们可以设想公交车速度更快,核心速度更快且DRNG能够下溢的产品.这些东西还不知道,所以我们不能对它们提出任何要求.

什么是真的是在软件实现者指南中给出的基本循环(尝试多达10次,然后报告堆栈中的故障)将继续在未来的产品中工作,因为我们已经宣称它将会如此我们将设计所有未来的产品以满足这一要求.

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


Dav*_*ton 5

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

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

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