当前位置: 首页 > 知识库问答 >
问题:

常春藤桥上RDRAND的疲劳特征是什么?

宇文育
2023-03-14

在查看了英特尔数字随机数生成器(DRNG)软件实现指南后,我有几个关于调用RDRAND时生成器内部状态会发生什么的问题。不幸的是,答案似乎不在指南中。

>

  • 根据指南,DRNG内部有四个128位缓冲区,为随机位提供服务,以便排出随机位<根据目标寄存器的宽度,代码>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的吞吐量产生任何影响吗?我希望避免消耗超过必要的随机性。

    指南中说,进位标志将在执行以下命令后设置:

    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时缓冲区恰好(瞬时)为空。

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

    谢谢

  • 共有3个答案

    姜振濂
    2023-03-14

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

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

    关于1:

    如果您关心的是性能,为什么不从DRNG中读取64位随机值,那么您可以在需要再次调用指令之前,从该随机值中读取2位32次。您不必每次需要bits时都调用新的rdrand。

    方绪
    2023-03-14

    请勿在DRNG输出的4*128位FIFO中读取任何内容。它当然在那里(我把它放在那里),但它并没有软件可见的效果。DRNG背后的逻辑无法顺利生成数据。它有时会根据SP800-90规范安排其他事情,如重新播种或调节。因此负载下的数据流是不规则的。

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

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

    吴松
    2023-03-14

    第1部分。拉16、32或64位会有什么不同吗?

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

    这在指令留档中没有描述,因为它可能不会在未来的产品中继续适用。可能会设计一个芯片来存储和使用64位字中未使用的部分。然而,今天没有重要的性能要求这样做。

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

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

    意思是“随机数据不可用”。这是因为如果CPU内核不关闭并读取更多寄存器,它就无法获取数字的详细信息,而这是不可能的,因为它与信息无关。

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

    如果DRNG出现故障(例如,熵源中出现晶体管,不再是随机的),则在线健康测试将检测到这一情况并关闭DRNG。然后,所有RdRand调用都将生成CF=0。

    然而,在常春藤桥上,你将无法使缓冲区下溢。DRNG比它所连接的总线快一点。由于总线上的争用导致指令必须在DRNG的本地总线上排队等待,因此每单位时间拉取更多数据(使用并行线程)的效果将增加每个RdRand的执行时间。你不能拉得太快,否则DRNG会下溢。您将逐渐达到800 MB/s。

    这也没有在留档中描述,因为它可能不会在未来的产品中继续存在。我们可以设想总线更快、内核更快、DRNG能够被下溢的产品。这些事情还不知道,所以我们不能对它们提出索赔。

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

    因此,不可能,CF=0,因为在常春藤桥上“调用RDRAND时缓冲区碰巧(暂时)为空”,但它可能发生在未来的硅上,所以请设计您的软件以应对。

     类似资料:
    • 我目前正在与apache ivy的conf设置作斗争。也许我会先解释我想实现的目标: 我需要两种配置:编译、运行时 这是我试过的: 但它甚至无法被解析:无法解析ivy文件'...\ivy.xml': 有人能告诉我如何正确地声明conf设置,这样我就可以使用compile或runtime来解析,并获得所有jar,包括可传递的依赖项(在这个示例中,只有ivy的jar)。 使现代化 好的,谢谢你的链接。

    • 我正在尝试使用IVY,并且我已经在springsource工具套件中设置了我的IVY-de。 在尝试构建我的工作空间时,我得到了以下错误。 说明资源路径位置类型类路径发布/导出依赖项C:/Users/user1/.ivy2/cache/jstl/jstl.jars/jstl-1.2.jar无效。项目包含另一个具有相同存档名称的依赖项。Web P/Web类路径依赖关系验证器消息 在这方面,我们非常感

    • 我是艾薇的新手,所以这可能已经被报道过了,但是我知道的还不够多。我的搜索结果是空的,没有找到类似的经历。 因此,当我第一次下拉整个项目并且更新库引用时,我有时会收到未解决的依赖项警告。它似乎在随机库上。 例如,我刚刚在某个项目中添加了Commons-codec-1.9,而工作集中的其他项目使用1.6和1.7。当运行盛大的构建脚本时,突然对于1.6和1.7“配置[is]未找到”: 现在,我不完全确定

    • 我找不到任何关于agner.orgRDRAND指令的延迟或吞吐量的信息。但是,这个处理器存在,所以信息必须在那里。 编辑:实际上,最新的优化手册中提到了此说明。记录如下:

    • 我有一个简单的文件: 其中是我的配置名称,是映射的Maven类型。这被正确解析并给我这些文件: 现在,我必须添加这个依赖项: 它将< code>validation-api作为其依赖项,与我在顶部指定的相同。 艾薇解决了这个问题,给了我这些文件: 但这次没有检索到文件。为什么?我认为这个文件没有冲突……我应该怎么做才能拥有和jar(二进制和源代码)?

    • 问题内容: 我将Ivy用作我的持续集成构建系统的一部分,但是我需要覆盖Ivy的本地缓存区域的默认位置。 问题答案: 尽管上面来自skaffman的答案是正确的,但我发现它比我预期的要多得多的工作! 当我将ivysettings.xml文件添加到项目时,然后我需要重新定义几乎所有内容,因为在此之前默认值一直可以正常工作。 因此,我发现了如何在NAnt脚本中将新的缓存目录添加到嵌入式命令行中… (我的