在回顾了Intel数字随机数发生器软件实现指南之后,我对调用RDRAND时生成器的内部状态有几个问题。不幸的是,答案似乎不在指南中。
RDRAND提供随机比特。RDRAND本身将根据目标寄存器的宽度提供16、32或64位随机数据:
rdrand ax;在ax rdrand eax中放置16随机比特;在eax rdrand rax中放置32随机比特;在rax中放置64随机比特。
使用更大的目的地寄存器会更快地清空128位缓冲区吗?例如,如果我只需要2位的随机性,我是否应该经历使用16位寄存器而不是64位寄存器的麻烦?这对DRNG的吞吐量有什么影响吗?我想避免消耗比必要的更多的随机性。RDRAND执行之后,将设置进位标志:
CF =1目标寄存器有效。执行时可用的非零随机值。结果已登记。CF =0目标注册所有零。随机值在执行时不可用。可能会被重审。
“不可得”是什么意思?由于RDRAND调用太快耗尽了128位缓冲区,随机数据是否不可用?或者不可用是否意味着DRNG没有通过其健康检查并且无法生成任何新的数据?基本上,我想了解的是,当调用CF=0时,缓冲区恰好是(瞬间)为空的,是否可以发生RDRAND。注意:我已经将答案查看到了关于RDRAND的吞吐量和延迟的问题,但我正在寻找不同的信息。
谢谢!
发布于 2013-01-21 17:11:21
第1部分.拉16位、32位或64位有区别吗?
不是的。
在常春藤桥上,无论目标寄存器的大小如何,CPU核心都会从与DRNG的内部通信链接中提取64位。所以如果你读32位,它会拉出64位,然后扔掉上半部分。如果你读16位,它拉64和扔掉前3/4。
说明文档中没有描述这一点,因为这在未来的产品中可能不再是正确的。可以设计一个存储和使用64位字未使用部分的芯片。然而,今天做这件事并没有什么重要的性能要求。
对于最高的吞吐量,最有效的策略是从并行线程中提取。这是因为芯片上的总线层次结构中存在并行性。指令的大部分时间是通过公共汽车的过境时间。并行执行这种传输将产生线程数的线性增加,最高达到800 800MBytes/s。第二件事是使用64位RdRands,因为它们每条指令获得更多的数据。
第2部分. CF=0的真正含义是什么?
意思是“没有随机数据”。这是因为在CPU核心没有启动并读取更多寄存器的情况下,它无法获得为什么不能得到数字的详细信息,这是因为它无法处理这些信息。
如果您吸干了DRNG的输出缓冲区,您将得到一个下流(CF=0),但是您可以预期下一个RdRand会成功,因为DRNG是快速的。
如果DRNG失败(例如,在熵源中弹出一个晶体管,并且它不再是随机的),那么在线健康测试将检测到这一点并关闭DRNG。那么所有的RdRand调用都会产生CF=0。
然而,在常春藤桥上,你将无法在缓冲下流动。DRNG比它所连接的总线要快一些。在每个单元时间(使用并行线程)提取更多数据的效果将是增加每个单独RdRand的执行时间,因为总线上的争用会导致指令在DRNG的本地总线上排队等待。你绝不能拉得这么快,DRNG就会流下去。你将逐步达到800 MBytes/s。
文档中也没有描述这一点,因为在未来的产品中可能不会继续如此。我们可以设想的产品,巴士是更快,核心更快和DRNG将能够被淹没。这些事情现在还不清楚,所以我们不能对它们作出断言。
仍然正确的是,软件实现者指南中给出的基本循环(尝试10次,然后报告堆栈上的故障)将继续在未来的产品中工作,因为我们已经声称它会,所以我们将设计所有未来的产品来满足这个要求。
因此,不可能发生CF=0,因为在调用RDRAND时,“缓冲区恰好是空的”,但是它可能发生在未来的硅上,所以设计您的软件来应付。
发布于 2013-01-26 06:36:23
不要将任何内容读入DRNG输出中的4*128位FIFO。它当然在那里(我把它放在那里),但它不是有软件可见效果的东西。DRNG背后的逻辑不能顺利地生成数据。它有时安排其他的事情,如重新播种或调整,按照spec 800-90规范。因此,在载荷作用下的数据流是不规则的。
选择4的缓冲长度是因为在800 800MBytes/s (本地连接总线的速度)4足够深时,当以最大速度牵引时,在最坏的情况下调度偏移,所以有一个恒定的,平滑的800 there /s供应,没有中断的输出。
如果连接的总线较慢,则缓冲器将缩短,因为较短的缓冲器足以防止下溢。
发布于 2013-01-20 07:47:23
关于2:http://download.intel.com/products/processor/manual/253665.pdf,7.3.17
CF表示对随机数据的需求超过了DRNG的吞吐量。
关于1:
如果您关心的是性能,为什么不从DRNG读取64位随机值,那么在需要再次调用指令之前,您可以从这32次读取2位。您不必每次需要比特时调用新的rdrand。
https://stackoverflow.com/questions/14413839
复制相似问题